说明

把已经有的feign接口直接改成通过dubbo协议直接调用

Dubbo Spring Cloud 提供了方案,即 @DubboTransported 注解,支持在类,方法,属性上使用。能够帮助服务消费端的 Spring Cloud Open Feign 接口以及 @LoadBalanced RestTemplate Bean 底层走 Dubbo 调用(可切换 Dubbo 支持的协议),而服务提供方则只需在原有 @RestController 类上追加 Dubbo @Servce 注解(需要抽取接口)即可,换言之,在不调整 Feign 接口以及 RestTemplate URL 的前提下,实现无缝迁移。

代码案例

代码来自 图灵学院, 我自己学完,做了个作业,然后给老师的代码整理了一下,加了个注释啥的.

代码地址和使用

https://gitee.com/zjj19941/ZJJ_Dubbo/tree/master/spring-cloud-alibaba-dubbo-feign

1.执行sql脚本
2.准备nacos服务端
3.修改配置文件地址
4.启动项目,先启动pringCloudDubboProviderUserFeignApplication , 再启动SpringCloudDubboConsumerUserFeignApplication
5.postman执行调用方法
localhost:8080/user/list 这个是http调用
localhost:8080/user/list2 这个是dubbo调用
localhost:8080/user/list3 这个是RestTemplate基于dubbo协议调用

修改服务提供者

  1. @DubboService
  2. @Slf4j
  3. @RestController
  4. @RequestMapping("/user")
  5. public class UserServiceImpl implements UserService {
  6. @Autowired
  7. private UserMapper userMapper;
  8. @Override
  9. @RequestMapping("/list")
  10. public List<User> list() {
  11. log.info("查询user列表");
  12. return userMapper.list();
  13. }
  14. @Override
  15. @RequestMapping("/getById/{id}")
  16. public User getById(@PathVariable("id") Integer id) {
  17. return userMapper.getById(id);
  18. }
  19. }

服务消费端引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.cloud</groupId>
  7. <artifactId>spring-cloud-starter-dubbo</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>com.alibaba.cloud</groupId>
  11. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-openfeign</artifactId>
  16. </dependency>


feign的实现,启动类上添加@EnableFeignClients

  1. @SpringBootApplication
  2. @EnableFeignClients
  3. public class SpringCloudDubboConsumerUserFeignApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringCloudDubboConsumerUserFeignApplication.class, args);
  6. }
  7. }

feign接口添加 @DubboTransported 注解

  1. @FeignClient(value = "spring-cloud-dubbo-provider-user-feign",path = "/user")
  2. @DubboTransported(protocol = "dubbo")
  3. public interface UserDubboFeignService {
  4. @RequestMapping("/list")
  5. public List<User> list();
  6. @RequestMapping("/getById/{id}")
  7. public User getById(@PathVariable("id") Integer id);
  8. }
  9. @FeignClient(value = "spring-cloud-dubbo-provider-user-feign",path = "/user")
  10. public interface UserFeignService {
  11. @RequestMapping("/list")
  12. public List<User> list();
  13. @RequestMapping("/getById/{id}")
  14. public User getById(@PathVariable("id") Integer id);
  15. }

调用对象添加 @DubboTransported 注解

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserConstroller {
  4. @DubboReference
  5. private UserService userService;
  6. @RequestMapping("/info/{id}")
  7. public User info(@PathVariable("id") Integer id) {
  8. return userService.getById(id);
  9. }
  10. @Autowired
  11. //@DubboTransported(protocol = "dubbo") //思考dubbo协议是否生效? Spring 单例模式 不生效
  12. private UserFeignService userFeignService;
  13. /**
  14. * feign调用
  15. * localhost:8080/user/list
  16. */
  17. @RequestMapping("/list")
  18. public List<User> list() {
  19. return userFeignService.list();
  20. }
  21. @Autowired
  22. private UserDubboFeignService userDubboFeignService;
  23. /**
  24. * dubbo调用
  25. * localhost:8080/user/list2
  26. */
  27. @RequestMapping("/list2")
  28. public List<User> list2() {
  29. return userDubboFeignService.list();
  30. }
  31. @Autowired
  32. private RestTemplate restTemplate;
  33. @Bean
  34. @LoadBalanced
  35. @DubboTransported
  36. public RestTemplate restTemplate() {
  37. return new RestTemplate();
  38. }
  39. /**
  40. * dubbo通过RestTemplate调用
  41. * localhost:8080/user/list3
  42. */
  43. @RequestMapping("/list3")
  44. public List<User> list3() {
  45. String url = "http://spring-cloud-dubbo-provider-user-feign/user/list";
  46. return restTemplate.getForObject(url, List.class);
  47. }
  48. }