Dubbo与SpringBoot整合 - 图1

boot-user-service-provider 服务提供者

创建Maven项目 boot-user-service-provider 服务提供者
导入以下依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.4.RELEASE</version>
  5. <relativePath />
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>com.lemon.gmail</groupId>
  10. <artifactId>gmail-interface</artifactId>
  11. <version>1.0-SNAPSHOT</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.alibaba.boot</groupId>
  19. <artifactId>dubbo-spring-boot-starter</artifactId>
  20. <version>0.2.0</version>
  21. </dependency>
  22. </dependencies>

user-service-provider 中的service拿到此项目中。
注意,以此方法为返回的需要更改 interface包中的void为 List

  1. @Service//dubbo的服务暴露
  2. @Component
  3. public class UserServiceImpl implements UserService {
  4. public List<UserAddress> getUserAddressList(String userId) {
  5. UserAddress address1 = new UserAddress(1, "河南省郑州巩义市宋陵大厦2F", "1", "安然", "150360313x", "Y");
  6. UserAddress address2 = new UserAddress(2, "北京市昌平区沙河镇沙阳路", "1", "情话", "1766666395x", "N");
  7. return Arrays.asList(address1,address2);
  8. }
  9. }

配置 application.properties

  1. dubbo.application.name=boot-user-service-provider
  2. dubbo.registry.address=127.0.0.1:2181
  3. dubbo.registry.protocol=zookeeper
  4. dubbo.protocol.name=dubbo
  5. dubbo.protocol.port=20880
  6. #连接监控中心
  7. dubbo.monitor.protocol=registry

BootProviderApplication 启动类配置

  1. @EnableDubbo //开启基于注解的dubbo功能
  2. @SpringBootApplication
  3. public class BootProviderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(BootProviderApplication.class, args);
  6. }
  7. }

启动注册中心,启动当前服务提供者,可以在浏览器看到一个服务提供者。

boot-order-service-consumer 服务消费者

创建Maven项目 boot-order-service-consumer 服务消费者
导入以下依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.4.RELEASE</version>
  5. <relativePath /> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependencies>
  8. <dependency>
  9. <groupId>com.lemon.gmail</groupId>
  10. <artifactId>gmail-interface</artifactId>
  11. <version>1.0-SNAPSHOT</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.alibaba.boot</groupId>
  19. <artifactId>dubbo-spring-boot-starter</artifactId>
  20. <version>0.2.0</version>
  21. </dependency>
  22. </dependencies>

把order-service-consumer项目中的service复制到当前项目。

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Reference//引用远程提供者服务
  4. UserService userService;
  5. public List<UserAddress> initOrder(String userID) {
  6. //查询用户的收货地址
  7. List<UserAddress> userAddressList = userService.getUserAddressList(userID);
  8. System.out.println("当前接收到的userId=> "+userID);
  9. System.out.println("**********");
  10. System.out.println("查询到的所有地址为:");
  11. for (UserAddress userAddress : userAddressList) {
  12. //打印远程服务地址的信息
  13. System.out.println(userAddress.getUserAddress());
  14. }
  15. return userAddressList;
  16. }
  17. }

创建 OrderController 控制器

  1. @Controller
  2. public class OrderController {
  3. @Autowired
  4. OrderService orderService;
  5. @RequestMapping("/initOrder")
  6. @ResponseBody
  7. public List<UserAddress> initOrder(@RequestParam("uid")String userId) {
  8. return orderService.initOrder(userId);
  9. }
  10. }

创建application.properties 配置

  1. server.port=8081
  2. dubbo.application.name=boot-order-service-consumer
  3. dubbo.registry.address=zookeeper://127.0.0.1:2181
  4. #连接监控中心 注册中心协议
  5. dubbo.monitor.protocol=registry

BootConsumerApplication 启动类创建

  1. @EnableDubbo //开启基于注解的dubbo功能
  2. @SpringBootApplication
  3. public class BootConsumerApplication {
  4. public static void main(String[] args){
  5. SpringApplication.run(BootConsumerApplication.class,args);
  6. }
  7. }

配置完毕,此时启动zk注册中心及监控
启动SpringBoot配置的服务提供者和消费者
在浏览器输入localhost:7001查看结果
Dubbo与SpringBoot整合 - 图2
http://localhost:8081/initOrder?uid=1 查询到地址信息
Dubbo与SpringBoot整合 - 图3
duboo的springboot整合配置完成。

Dubbo配置

dubbo配置官网参考:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html

1、配置原则

Dubbo与SpringBoot整合 - 图4
JVM启动 -D 参数优先,这样可以使用用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

2、启动时检查

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check=“true”。

可以通过 check=“false” 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check=“false”,总是会返回引用,当服务恢复时,能自动连上。

order-service-consumer消费者为例,在consumer.xml中添加配置

  1. <!--配置当前消费者的统一规则,当前所有的服务都不启动时检查-->
  2. <dubbo:consumer check="false"></dubbo:consumer>

添加后,即使服务提供者不启动,启动当前的消费者,也不会出现错误。

3、全部超时配置

  1. 全局超时配置
  2. <dubbo:provider timeout="5000" />
  3. 指定接口以及特定方法超时配置
  4. <dubbo:provider interface="com.foo.BarService" timeout="2000">
  5. <dubbo:method name="sayHello" timeout="3000" />
  6. </dubbo:provider>

配置原则
dubbo推荐在Provider上尽量多配置Consumer端属性
1、作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
2、在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的

配置的覆盖规则:

  1. 方法级配置别优于接口级别,即小Scope优先
  2. Consumer端配置 优于 Provider配置 优于 全局配置,
  3. 最后是Dubbo Hard Code的配置值(见配置文档)

Dubbo与SpringBoot整合 - 图5
多版本控制 在服务提供者中复制多个impl,起了不同的名字
Dubbo与SpringBoot整合 - 图6
Dubbo与SpringBoot整合 - 图7

配置多个文件的路径及信息
服务消费者调用时,可自由配置版本
Dubbo与SpringBoot整合 - 图8

Dubbo与SpringBoot整合三种方式

1、将服务提供者注册到注册中心(如何暴露服务)

1.1 导入Dubbo的依赖和Zookeeper客户端

2、让服务消费者去注册中心订阅服务提供者的服务地址

SpringBoot与Dubbo整合的三种方式
2.1 导入dubbo-starter,在application.properties配置属性,使用@Service[暴露服务],使用@Reference[引用服务]
2.2 保留dubbo相关的xml配置文件
导入dubbo-starter,使用@ImportResource导入Dubbo的xml配置文件
3、使用注解API的方式
将每一个组件手动配置到容器中,让dubbo来扫描其他的组件