Dubbo是一个来自阿里巴巴的开源分布式服务框架,当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用、Kryo/FST序列化等等。并将其命名为Dubbox(即Dubbo eXtensions)。
Dubbox地址:https://github.com/dangdangdotcom/dubbox
由于dubbox没有发布到maven中央仓库,需要自己安装到本地maven库或者私库。
这些准备好后就开始创建一个多模块的maven项目,具体怎么分得看自己的业务需求。
下图是我这边测试用的,仅供参考。
父工程的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<cxytiandi.version>1.0.0</cxytiandi.version>
<java.version>1.8</java.version>
<dubbo.version>2.8.4</dubbo.version>
<zookeeper.version>3.4.6</zookeeper.version>
<sgroschupf.version>0.1</sgroschupf.version>
<resteasy.version>3.0.7.Final</resteasy.version>
<validation.version>1.0.0.GA</validation.version>
<hibernate.version>4.3.1.Final</hibernate.version>
<jetty.version>6.1.26</jetty.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi-common</artifactId>
<version>${cxytiandi.version}</version>
</dependency>
<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi-api-interface</artifactId>
<version>${cxytiandi.version}</version>
</dependency>
<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi-model</artifactId>
<version>${cxytiandi.version}</version>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${sgroschupf.version}</version>
</dependency>
<!-- resteasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${validation.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>${jetty.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>cxytiandi-common</module>
<module>cxytiandi-web</module>
<module>cxytiandi-manager</module>
<module>cxytiandi-rs-api</module>
<module>cxytiandi-datastore</module>
<module>cxytiandi-model</module>
<module>cxytiandi-api-interface</module>
</modules>
</project>
目前dubbo的配置有2种方式。
一种是和之前一样,基于xml的配置,然后用@ImportResource导入。
@SpringBootApplication
@ImportResource(locations={"classpath:applicationContext-rpc-provider.xml"})
public class DatastoreApplication {
private static final Logger logger = LoggerFactory.getLogger(DatastoreApplication.class);
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String[] args) {
ApplicationContext ctx = new SpringApplicationBuilder()
.sources(DatastoreApplication.class)
.web(false)
.run(args);
logger.info("项目启动!");
CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
try {
closeLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
<!-- 应用名称 -->
<dubbo:application name="soa-users" />
<!-- 注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881" accepts="500" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.cxytiandi.api.inteface.rpc.ArticleRpcService" ref="ArticleRpcService" protocol="dubbo" timeout="2000" version="1.0"/>
第二种了就是基于注解的方式,本来spring boot就是提倡简化配置,如果我们还用xml就显得有点不协调了。
@Configuration
public class DubboBaseConfig {
@Bean
public AnnotationBean annotation() {
AnnotationBean bean = new AnnotationBean();
bean.setPackage("com.cxytiandi.datastore.api.rpc");
return bean;
}
@Bean
public RegistryConfig registry() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("127.0.0.1:2181");
registryConfig.setProtocol("zookeeper");
return registryConfig;
}
@Bean
public ApplicationConfig application() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("soa-users");
return applicationConfig;
}
@Bean
public ProtocolConfig protocol() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setPort(20881);
return protocolConfig;
}
}
发布服务的话我们就用dubbo中提供的Service注解来发布服务。
@Component("ArticleRpcService")
@Service(interfaceClass = ArticleRpcService.class, version = "1.0")
public class ArticleRpcServiceImpl implements ArticleRpcService {
}
调用也是一样用dubbo的Reference注解
@Reference(interfaceClass = ArticleRpcService.class, version = "1.0")
private ArticleRpcService articleRpcServiceRef;
整个项目调用的流程图如下: