当前位置:   article > 正文

SpringBoot整合Dubbo的第一种方式——application.properties + @DubboService + @DubboReference_dubbo:application default

dubbo:application default

1.文档参照

dubbo配置官方文档


2.三个工程

2.1 公共接口工程

这个工程中存放的是一些公共的Java Bean、相关接口信息。

其中UserService接口是针对服务提供者的,OrderService接口是针对服务消费者的。

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.10</version>
  5. </dependency>
  1. package com.szh.gmall.bean;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.io.Serializable;
  6. /**
  7. *
  8. */
  9. @Data
  10. @AllArgsConstructor
  11. @NoArgsConstructor
  12. public class UserAddress implements Serializable {
  13. private Integer id;
  14. private String userAddress; //用户地址
  15. private String userId; //用户id
  16. private String consignee; //收货人
  17. private String phoneNum; //电话号码
  18. private String isDefault; //是否为默认地址 Y-是 N-否
  19. }
  1. package com.szh.gmall.service;
  2. import com.szh.gmall.bean.UserAddress;
  3. import java.util.List;
  4. /**
  5. *
  6. */
  7. public interface UserService {
  8. /**
  9. * 根据用户id返回所有的收货地址
  10. */
  11. List<UserAddress> getUserAddressList(String userId);
  12. }
  1. package com.szh.gmall.service;
  2. import com.szh.gmall.bean.UserAddress;
  3. import java.util.List;
  4. /**
  5. *
  6. */
  7. public interface OrderService {
  8. /**
  9. * 初始化订单
  10. */
  11. void initOrder(String userId);
  12. List<UserAddress> initOrder2(String userId);
  13. }

2.2 服务提供者工程

springboot这里我使用的是 2.3.12.RELEASE。dubbo是2.7.8

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <!-- Dubbo Spring Boot Starter -->
  6. <dependency>
  7. <groupId>org.apache.dubbo</groupId>
  8. <artifactId>dubbo-spring-boot-starter</artifactId>
  9. <version>${dubbo.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.dubbo</groupId>
  13. <artifactId>dubbo</artifactId>
  14. <version>${dubbo.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.curator</groupId>
  18. <artifactId>curator-framework</artifactId>
  19. <version>2.8.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.curator</groupId>
  23. <artifactId>curator-recipes</artifactId>
  24. <version>2.8.0</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.szh</groupId>
  28. <artifactId>common-gmall-interface</artifactId>
  29. <version>1.0-SNAPSHOT</version>
  30. </dependency>

那么在这个服务提供者中,我们肯定要对上面公共接口中的UserService进行具体的实现。  下面有两个实现类是为了后面测试Dubbo的多版本功能(也即version属性信息)。 @DubboService注解用来暴露服务。

  1. package com.szh.service.impl;
  2. import com.szh.gmall.bean.UserAddress;
  3. import com.szh.gmall.service.UserService;
  4. import org.apache.dubbo.config.annotation.DubboService;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.stereotype.Service;
  8. import java.util.Arrays;
  9. import java.util.List;
  10. import java.util.concurrent.TimeUnit;
  11. /**
  12. * 1.将服务提供者注册到注册中心
  13. * 1) 引入dubbo依赖、zookeeper客户端依赖
  14. * 2) 配置服务提供者
  15. * 2.让服务消费者从注册中心订阅服务提供者的相关服务
  16. */
  17. @Service
  18. @DubboService(interfaceClass = UserService.class, version = "1.0.0")
  19. public class UserServiceImpl implements UserService {
  20. //The default value of ${dubbo.application.name} is ${spring.application.name}
  21. @Value("${dubbo.application.name}")
  22. private String applicationName;
  23. @Override
  24. public List<UserAddress> getUserAddressList(String userId) {
  25. UserAddress userAddress1 = new UserAddress(1, "浙江省杭州市", "1", "张三", "123456", "Y");
  26. UserAddress userAddress2 = new UserAddress(2, "湖北省武汉市", "1", "李四", "999999", "N");
  27. try {
  28. TimeUnit.MILLISECONDS.sleep(2000); //测试timeout
  29. // TimeUnit.MILLISECONDS.sleep(4000); //测试重试次数
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. System.out.println(applicationName + " old....");
  34. return Arrays.asList(userAddress1, userAddress2);
  35. }
  36. }
  1. package com.szh.service.impl;
  2. import com.szh.gmall.bean.UserAddress;
  3. import com.szh.gmall.service.UserService;
  4. import org.apache.dubbo.config.annotation.DubboService;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.stereotype.Service;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import java.util.concurrent.TimeUnit;
  10. /**
  11. * 1.将服务提供者注册到注册中心
  12. * 1) 引入dubbo依赖、zookeeper客户端依赖
  13. * 2) 配置服务提供者
  14. * 2.让服务消费者从注册中心订阅服务提供者的相关服务
  15. */
  16. @Service
  17. @DubboService(interfaceClass = UserService.class, version = "2.0.0")
  18. public class UserServiceImpl2 implements UserService {
  19. //The default value of ${dubbo.application.name} is ${spring.application.name}
  20. @Value("${dubbo.application.name}")
  21. private String applicationName;
  22. @Override
  23. public List<UserAddress> getUserAddressList(String userId) {
  24. UserAddress userAddress1 = new UserAddress(1, "浙江省杭州市", "1", "张三", "123456", "Y");
  25. UserAddress userAddress2 = new UserAddress(2, "湖北省武汉市", "1", "李四", "999999", "N");
  26. try {
  27. TimeUnit.MILLISECONDS.sleep(2000); //测试timeout
  28. // TimeUnit.MILLISECONDS.sleep(4000); //测试重试次数
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. System.out.println(applicationName + " new....");
  33. return Arrays.asList(userAddress1, userAddress2);
  34. }
  35. }

properties配置文件如下,这种方式主要也就是 properties + 注解。 

  1. spring.application.name=boot-user-service-provider
  2. dubbo.application.name=boot-user-service-provider
  3. dubbo.scan.base-packages=com.szh.service.impl
  4. dubbo.registry.address=127.0.0.1:2181
  5. dubbo.registry.protocol=zookeeper
  6. dubbo.protocol.name=dubbo
  7. dubbo.protocol.port=20880
  8. dubbo.monitor.protocol=registry

主启动类上添加 @EnableDubbo注解开启Dubbo的注解配置功能。  

  1. package com.szh;
  2. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  3. import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  6. import org.springframework.boot.autoconfigure.SpringBootApplication;
  7. @SpringBootApplication
  8. @EnableDubbo
  9. public class BootUserServiceProviderApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(BootUserServiceProviderApplication.class, args);
  12. }
  13. }

2.3 服务消费者工程

这里是一个springboot web工程,版本仍然和上面的服务提供者相同。dubbo是2.7.8

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <!-- Dubbo Spring Boot Starter -->
  6. <dependency>
  7. <groupId>org.apache.dubbo</groupId>
  8. <artifactId>dubbo-spring-boot-starter</artifactId>
  9. <version>${dubbo.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.dubbo</groupId>
  13. <artifactId>dubbo</artifactId>
  14. <version>${dubbo.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.curator</groupId>
  18. <artifactId>curator-framework</artifactId>
  19. <version>2.8.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.curator</groupId>
  23. <artifactId>curator-recipes</artifactId>
  24. <version>2.8.0</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.szh</groupId>
  28. <artifactId>common-gmall-interface</artifactId>
  29. <version>1.0-SNAPSHOT</version>
  30. </dependency>

这里我们要通过浏览器访问具体的接口,所以需要一个controller。

  1. package com.szh.controller;
  2. import com.szh.gmall.bean.UserAddress;
  3. import com.szh.gmall.service.OrderService;
  4. import org.apache.dubbo.config.annotation.DubboReference;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import java.util.List;
  11. /**
  12. *
  13. */
  14. @RestController
  15. public class OrderController {
  16. @Autowired
  17. private OrderService orderService;
  18. @GetMapping(value = "/initOrder/{userId}")
  19. public List<UserAddress> initOrder(@PathVariable("userId") String userId) {
  20. return orderService.initOrder2(userId);
  21. }
  22. }

然后需要对公共接口工程中的OrderService进行实现,因为这是服务消费者。(要表示如何消费,即实现接口就可以了)

@DubboReference注解用来引用服务。

  1. package com.szh.service.impl;
  2. import com.szh.gmall.bean.UserAddress;
  3. import com.szh.gmall.service.OrderService;
  4. import com.szh.gmall.service.UserService;
  5. import org.apache.dubbo.config.annotation.DubboReference;
  6. import org.apache.dubbo.config.annotation.Method;
  7. import org.springframework.stereotype.Service;
  8. import java.util.List;
  9. /**
  10. *
  11. */
  12. @Service
  13. public class OrderServiceImpl implements OrderService {
  14. @DubboReference(interfaceClass = UserService.class, //服务接口名
  15. version = "2.0.0", //服务版本,与服务提供者的版本一致
  16. check = false, //启动时检查提供者是否存在,true报错,false忽略
  17. timeout = 3000, //服务方法调用超时时间(毫秒)
  18. methods = @Method(name = "getUserAddressList"), //精确到服务接口的某个方法
  19. retries = 3) //远程服务调用重试次数,不包括第一次调用,不需要重试请设为0
  20. private UserService userService;
  21. @Override
  22. public List<UserAddress> initOrder2(String userId) {
  23. System.out.println("用户id:" + userId);
  24. List<UserAddress> addressList = userService.getUserAddressList(userId);
  25. return addressList;
  26. }
  27. @Override
  28. public void initOrder(String userId) {
  29. }
  30. }
  1. server.port=8081
  2. spring.application.name=boot-order-service-consumer
  3. dubbo.application.name=boot-order-service-consumer
  4. dubbo.registry.address=zookeeper://127.0.0.1:2181
  5. dubbo.monitor.protocol=registry

主启动类上添加 @EnableDubbo注解开启Dubbo的注解配置功能。 

  1. package com.szh;
  2. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @EnableDubbo
  7. public class BootOrderServiceConsumerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(BootOrderServiceConsumerApplication.class, args);
  10. }
  11. }

3.启动测试

启动服务提供者和消费者之前,要先将zookeeper开启,然后再将dubbo管控台打开。

我这里为了方便,就直接在windows下启动zookeeper了,下载请移步官网:https://zookeeper.apache.org/,下载解压之后,找到conf目录下的zoo.cfg文件,做如下修改:

  1. # example sakes.
  2. dataDir=E:\\zookeeper\\zookeeper-3.4.11\\data
  3. # the port at which the clients will connect
  4. clientPort=2181

然后转到bin目录下,cmd启动 zkServer.cmd 即可。

zookeeper相关配置等链接参考:https://dubbo.apache.org/zh/docs/references/registry/zookeeper/

这里需要先启动服务提供者,再启动服务消费者。 

由于我们在服务消费者的 @DubboReference 注解中配置了 check=false,所以这里即使启动顺序不对,或者找不到服务提供者,也不会报错,而是直接忽略。

下面是dubbo的管控台,这个不安装也无所谓,我这里就不给出下载安装的步骤了。。。(可以参考尚硅谷-雷神老师的Dubbo课程)

下面通过服务消费者中的接口,可以直接调用到服务提供者的接口,同时获取到相关数据内容。 

下面的截图是对应了服务提供者中的 TimeUnit.MILLISECONDS.sleep(2000); //测试timeout 代码。和服务消费者中的 @DubboReference 注解中的timeout属性。

如果服务提供者睡眠时间超过了 服务消费者 中定义的超时时间,那么就会出现下图的异常。

反之,则可以正常远程调用服务提供者的接口,也就是下下张图。

下面的截图演示的是重试次数,远程服务调用重试次数,不包括第一次调用,不需要重试请设为0。

对应的是 服务提供者 的  TimeUnit.MILLISECONDS.sleep(4000); //测试重试次数。和服务消费者中的 @DubboReference 注解中的 retries 属性。

这里需要保证 服务提供者的响应时间大于服务消费者的等待超时时间,一旦满足,服务消费者此时调不到服务提供者,那么在服务提供者方就会进行重试。

最后这个测试的Dubbo的多版本问题。也就是用到了服务提供者中的两个具体实现类,这二者通过 @DubboService 注解中的 version 加以区分,一个版本为1.0.0、另一个版本为2.0.0。  而在服务消费者中通过  @DubboReference 注解中的version属性来指定具体要消费服务提供者的哪个实现类。


4.Dubbo配置原则

JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。

XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。

Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号