由于公司使用的是springboot+dubbo的分布式架构,虽然个人更偏向于springcloud,但是日常中使用dubbo更多,所以也参考了很多的资料,自己搭建了一个基于目前最新版本的RPC服务demo。(springboot 2.0.5+dubbo2.6.3+zookeeper3.4.10)用来熟悉dubbo和学习相关技术,把搭建过程记录下来,防止自己和他人踩坑。
下图是dubbo官网给的图。在系统越来越庞大的情况下,分布式就显得尤为重要了,应用之间交互是不可避免的,将核心业务抽取出来,作为独立的服务,然后逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
在项目搭建之前首先需要一个注册中心,dubbo推荐使用zookeeper,所以我这里使用的也是zookeeper,下载地址:http://zookeeper.apache.org/。下载完成后解压就行。不会的参考:http://dubbo.apache.org/zh-cn/docs/admin/install/zookeeper.html
首先使用idea创建一个空的springboot项目用来做多模块的父工程:spring-boot-dubbo-parent。这里要注意把打包方式改为pom类型。代码如下:
<?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.wangzc</groupId> <artifactId>spring-boot-dubbo-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>spring-boot-dubbo-parent</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project
然后在父工程下创建一个module:spring-boot-dubbo-api。用来存放所有的公共接口。pom文件同上,打包类型为jar。
再创建一个服务生产者:spring-boot-dubbo-provider。这里需要添加dubbo以及zookeeper的包,同时使用dubbo官方给出的starter。github地址:https://github.com/apache/incubator-dubbo-spring-boot-project(不是alibaba的那个,那个不维护了。)同时引入刚才创建的api。
<?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.wangzc</groupId> <artifactId>spring-boot-dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-boot-dubbo-provider</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.wangzc</groupId> <artifactId>spring-boot-dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
最后一个就是服务消费者了:spring-boot-dubbo-consumer。pom文件同上,多了一个web包。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
parent的pom文件引入3个module
<modules> <module>spring-boot-dubbo-api</module> <module>spring-boot-dubbo-provider</module> <module>spring-boot-dubbo-consumer</module> </modules>
这里就用dubbo官网给出的最简单的sayHello例子用来验证服务是否发布成功,在api的module包下创建一个接口用来提供服务。
package com.FarStars.springbootdubboapi.service; /** * @author FarStars * @date 2018/9/13 */ public interface HelloService { /** * sayHello * * @author FarStars * @param name name * @return java.lang.String */ String sayHello(String name); }
provider的application.properties配置文件:
# Spring boot application spring.application.name = spring-boot-dubbo-provider server.port = 9090 management.port = 9091 # Service version provider.service.version = 1.0.0 # Base packages to scan Dubbo Components (e.g @Service , @Reference) # 实现类的包路径(换成自己的) dubbo.scan.basePackages = com.xxx.springbootdubboprovider.impl # Dubbo Config properties ## ApplicationConfig Bean dubbo.application.id = dubbo-provider dubbo.application.name = dubbo-provider ## ProtocolConfig Bean dubbo.protocol.id = dubbo dubbo.protocol.name = dubbo dubbo.protocol.port = 20880 ## RegistryConfig Bean dubbo.registry.id = my-registry # zookeeper的地址(换成自己的) dubbo.registry.address = zookeeper://xxx:2181
HelloService的实现类,注意这里要用dubbo的service注解,不是spring的。
package com.FarStars.springbootdubboprovider.impl; import com.alibaba.dubbo.config.annotation.Service; import com.FarStars.springbootdubboapi.service.HelloService; /** * @author FarStars * @date 2018/9/13 */ @Service( version = "${provider.service.version}", application = "${dubbo.application.id}", protocol = "${dubbo.protocol.id}", registry = "${dubbo.registry.id}" ) public class HelloServiceImpl implements HelloService { /** * sayHello * * @param name name * @return java.lang.String * @author FarStars */ @Override public String sayHello(String name) { return "Hello, " + name; } }
consumer的application.properties配置文件:
# Spring boot application spring.application.name = spring-boot-dubbo-consumer server.port = 8080 management.port = 8081 # Service Version consumer.service.version = 1.0.0 # Dubbo Config properties ## ApplicationConfig Bean dubbo.application.id = dubbo-consumer dubbo.application.name = dubbo-consumer ## ProtocolConfig Bean dubbo.protocol.id = dubbo dubbo.protocol.name = dubbo dubbo.protocol.port = 20880
HelloController类:
package com.FarStars.springbootdubboconsumer.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.FarStars.springbootdubboapi.service.HelloService; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author FarStars * @date 2018/9/13 */ @RestController public class HelloController { @Reference( version = "${consumer.service.version}", application = "${dubbo.application.id}", url = "dubbo://localhost:20880" ) private HelloService helloService; @RequestMapping("/sayHello") public String sayHello(@RequestParam String name) { return helloService.sayHello(name); } }
启动类上要加controller包扫描
@SpringBootApplication(scanBasePackages = "com.FarStars.springbootdubboconsumer.controller")
这样就算搭建完成了,测试时先启动provider,再启动consumer。
示例 Controller : http://localhost:8080/sayHello?name=FarStars 网页输出如下,表示服务发布成功
本文参考:dubbo官网:http://dubbo.apache.org/zh-cn/index.html
starter中文文档:https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/README_CN.md
也可以引入actuator包检查健康状态,请参考以上文档。
(本人才疏学浅,如有错误纯属正常,欢迎指出!)