Dubbo已经进入了Apache孵化器,并且发布了官方的spring-boot-starter0.1.0,用于简化dubbo应用的配置,主要包括了autoconfigure(自动装配),externalized-configuration(外部化配置),actuator(生产准备)等,可参考官方github dubbo-spring-boot-starter .
需要提前安装好JDK1.8,Maven,Zookeeper。
为了整个项目结构清晰,使用模块化的maven项目。pom文件如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.boot.dubbo</groupId> <artifactId>boot-dubbo</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>boot-dubbo</name> <description>Dubbo project for Spring Boot</description> <modules> <module>dubbo-provider</module> <module>dubbo-consumer</module> <module>dubbo-api</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <dubbo-spring-boot-starter.version>0.1.0</dubbo-spring-boot-starter.version> <springboot.version>1.5.8.RELEASE</springboot.version> <fastjson-version>1.2.31</fastjson-version> <zk-client.version>0.2</zk-client.version> <dockerfile-maven.version>1.4.3</dockerfile-maven.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo-spring-boot-starter.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>${springboot.version}</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>${zk-client.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
主要分为三个模块,api,provider和consumer
有了spring-boot-starter,dubbo的配置变得非常简单,再也不用像以前一样配置一大堆xml文件,只需要几个简单的配置,就可以做到开箱即用。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" 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>org.boot.dubbo</groupId> <artifactId>dubbo-provider</artifactId> <version>${parent.version}</version> <packaging>jar</packaging> <parent> <artifactId>boot-dubbo</artifactId> <groupId>org.boot.dubbo</groupId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <name>dubbo-provider</name> <description>Dubbo project for Spring Boot:Provider</description> <dependencies> <!-- Spring Boot dependencies --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <exclusions> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.boot.dubbo</groupId> <artifactId>dubbo-api</artifactId> <version>${parent.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring.application.name=springboot-dubbo-provider server.port=9090 #dubbo配置 dubbo.application.id=springboot-dubbo-provider dubbo.application.name=springboot-dubbo-provider dubbo.application.owner=luoliang #协议配置 dubbo.protocol.id=dubbo dubbo.protocol.name=dubbo #把默认的20880端口换成12345 dubbo.protocol.port=12345 #服务注册配置 dubbo.registry.id=my-registry dubbo.registry.address=zookeeper://localhost:2181 #配置dubbo的包扫描,针对dubbo的@Service, @Reference注解 dubbo.scan.base-packages=org.boot.dubbo.provider.service #dubbo健康监控 endpoints.dubbo.enabled=true management.health.dubbo.status.defaults=memory management.health.dubbo.status.extras=load,threadpool management.port=9091
public interface HelloService { String sayHello(String name); }
@Service(version = "1.0.0", application = "${dubbo.application.id}", protocol = "${dubbo.protocol.id}", registry = "${dubbo.registry.id}") public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name + " (from Spring Boot)"; } }
注意,这里的service注解是com.alibaba.dubbo.config.annotation.Service
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" 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>org.boot.dubbo</groupId> <artifactId>dubbo-consumer</artifactId> <version>${parent.version}</version> <packaging>jar</packaging> <parent> <artifactId>boot-dubbo</artifactId> <groupId>org.boot.dubbo</groupId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <name>dubbo-consumer</name> <description>Dubbo project for Spring Boot:Consumer</description> <dependencies> <!-- Spring Boot dependencies --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.boot.dubbo</groupId> <artifactId>dubbo-api</artifactId> <version>${parent.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring.application.name=springboot-dubbo-consumer server.port=8081 #dubbo配置 dubbo.application.id=springboot-dubbo-consumer dubbo.application.name=springboot-dubbo-consumer dubbo.application.owner=luoliang #服务注册配置 dubbo.registry.id=my-registry dubbo.registry.address=zookeeper://localhost:2181 management.port=8082
@Service public class ConsumerServiceImpl implements ConsumerService { @Reference(version = "1.0.0", application = "${dubbo.application.id}") private HelloService helloService; @Override public String sayHello(String name) { return helloService.sayHello(name); } }
在mvc的controller中注入此服务
@RestController @RequestMapping("/user") public class DefaultController { @Resource private ConsumerService consumerService; @RequestMapping("/sayHello") public String register(String name) { return consumerService.sayHello(name); } }
现在来测试一下,分别启动provider和consumer,打开浏览器,输入http://localhost:8081/user/sayHello?name=dubbo
可以看到,返回的结果和预期一样,说明项目已经成功集成
需要源码请移步本人github,如果能顺手star就更好啦! boot-dubbo ,下一篇博客接这篇博客,学习使用Docker容器化SpringBoot+Dubbo应用。
第一次在掘金发文,各位大佬轻喷~