前言

本文在前篇文章《SpringCloud系列之Nacos应用篇》基础上集成Dubbo,公司项目中新项目采用SpringCloud(后续会逐渐替换至spring cloud alibaba全家桶),老项目采用传统SSM+Dubbo,部分业务上新老项目都有所涉及,原先少许业务上是直接通过http请求来处理新老项目交互的,总觉得这样做不够优雅,也不利于维护,于是自己调研调研看。

在前篇《SpringCloud系列之集成Dubbo应用篇》文章中Dubbo是依托zookeeper作为服务注册发现组件,这次项目中以SpirngCloud,Nacos,Dubbo三者集成起来,减少了Eureka、SpringConfig、zookeeper组件的投入,配置、服务注册发现都依赖Nacos服务,减少维护工作,死磕Nacos即可。

项目版本

spring-boot-version:2.2.5.RELEASE

spring-cloud.version:Hoxton.SR3

nacos.version:1.3.2

dubbo.version:2.6.9/2.7.6

项目说明

新项目模块间采用Feign进行相互交互,老项目模块间采用Dubbo进行交互,新老项目间采用Dubbo交互。在集成Dubbo时也针对Dubbo 2.6.x及Dubbo 2.7.x版本进行分别说明。

当然也可以都用Dubbo进行交互。

涉及Nacos配置信息,请查阅上篇文章《SpringCloud系列之Nacos应用篇》,本文只涉及新增Dubbo相关的配置,完整项目源码请查看本文文末项目源码。

项目结构

项目分支付模块和用户模块,支付模块提供Dubbo服务供用户模块消费,用户模块提供Feign服务供支付模块调用。

集成Dubbo2.6.x

集成Dubbo2.6.x系列版本中费了不少时间,主要涉及nacos-client版本中不同版本有些类所属包发生了变更,导致集成时提示找不到类,自己尝试调整了下依赖的版本,最终要么这个版本有这个问题,另外一个版本又有另一个问题,都不能很好解决,心想不会就这么凉凉了吧

常见问题如下

java.lang.NoClassDefFoundError: com/alibaba/nacos/client/naming/utils/StringUtils

java.lang.NoClassDefFoundError: com/alibaba/nacos/api/naming/NamingMaintainService

后来在Nacos Github上看到了这条issues,发现基本是同样的问题,就按照以下版本测试了下,居然成功了,后来又在此依赖版本上对相应版本进行了升级。

https://github.com/alibaba/nacos/issues/2022

最终依赖如下

pom.xml

  1. <!--nacos discovery-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>com.alibaba.nacos</groupId>
  8. <artifactId>nacos-client</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <!--nacos config-->
  13. <dependency>
  14. <groupId>com.alibaba.cloud</groupId>
  15. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  16. <exclusions>
  17. <exclusion>
  18. <groupId>com.alibaba.nacos</groupId>
  19. <artifactId>nacos-client</artifactId>
  20. </exclusion>
  21. </exclusions>
  22. </dependency>
  23. <!--dubbo-->
  24. <dependency>
  25. <groupId>com.alibaba.boot</groupId>
  26. <artifactId>dubbo-spring-boot-starter</artifactId>
  27. <version>0.2.1.RELEASE</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>com.alibaba</groupId>
  31. <artifactId>dubbo</artifactId>
  32. <version>2.6.9</version>
  33. </dependency>
  34. <!--dubbo nacos-->
  35. <dependency>
  36. <groupId>com.alibaba</groupId>
  37. <artifactId>dubbo-registry-nacos</artifactId>
  38. <version>2.6.7</version>
  39. <exclusions>
  40. <exclusion>
  41. <groupId>com.alibaba.nacos</groupId>
  42. <artifactId>nacos-client</artifactId>
  43. </exclusion>
  44. </exclusions>
  45. </dependency>
  46. <!--nacos-->
  47. <dependency>
  48. <groupId>com.alibaba.nacos</groupId>
  49. <artifactId>nacos-client</artifactId>
  50. <version>1.3.2</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>io.netty</groupId>
  54. <artifactId>netty-all</artifactId>
  55. <version>4.1.31.Final</version>
  56. </dependency>

支付模块

application.properties

Dubbo 2.6.x 系列需在Dubbo配置项中增加dubbo.application.name配置项,不然再启动时会提示缺少该配置项

  1. dubbo.application.name=pay-service
  2. # dubbo扫描包路径
  3. dubbo.scan.base-packages=com.chinawu.cloud.pay.service
  4. # dubbo协议
  5. dubbo.protocol.name=dubbo
  6. # 随机端口
  7. dubbo.protocol.port=-1
  8. # zookeeper地址
  9. dubbo.registry.address=nacos://127.0.0.1:8848

DPayService.java

@Service为Dubbo注解,import com.alibaba.dubbo.config.annotation.Service;

  1. @Service
  2. public class DPayService implements DPayFacade {
  3. @Override
  4. public String goToPay(String userName) {
  5. System.out.println("dubbo.method:goToPay request "+userName);
  6. return "dubbo.method:goToPay result:" + userName + " pay success";
  7. }
  8. }

PayServiceApplication.java

SpringBoot 启动类需增加 @EnableDubbo 注解标签,不然服务没法暴露,注册

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @EnableAutoConfiguration
  4. @EnableFeignClients(basePackages = {"com.chinawu.cloud.user.*"})
  5. @EnableDubbo
  6. public class PayServiceApplication {
  7. public static void main(String[] args) {
  8. SpringApplication.run(PayServiceApplication.class, args);
  9. }
  10. }

用户模块

application.properties

  1. dubbo.application.name=user-service
  2. # dubbo扫描包路径
  3. dubbo.scan.base-packages=com.chinawu.cloud.user.service
  4. # dubbo协议
  5. dubbo.protocol.name=dubbo
  6. # 随机端口
  7. dubbo.protocol.port=-1
  8. # zookeeper地址
  9. dubbo.registry.address=nacos://127.0.0.1:8848

UserController.java

  1. @RestController
  2. @RequestMapping("/user")
  3. @RefreshScope
  4. public class UserController {
  5. @Value("${spring.datasource.url}")
  6. private String datasourceUrl;
  7. // Dubbo服务消费
  8. @Reference(check = false)
  9. DPayFacade dPayFacade;
  10. /**
  11. * <p >
  12. * 功能:获取数据源连接配置信息
  13. * </p>
  14. * @param
  15. * @author wuyubin
  16. * @date 2020年9月3日
  17. * @return
  18. */
  19. @RequestMapping("/getDatasourceUrl")
  20. public String getDatasourceUrl() {
  21. return datasourceUrl;
  22. }
  23. /**
  24. * <p >
  25. * 功能:测试Dubbo服务调用
  26. * </p>
  27. * @param
  28. * @author wuyubin
  29. * @date 2020年9月3日
  30. * @return
  31. */
  32. @RequestMapping("/goToPay")
  33. public String goToPay() {
  34. return dPayFacade.goToPay("wuyubin");
  35. }
  36. }

集成Dubbo2.7.x

集成Dubbo2.7.x系列版本,相比就简单不少,直接引入如下依赖

pom.xml

  1. <!--nacos discovery-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>com.alibaba.nacos</groupId>
  8. <artifactId>nacos-client</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <!--nacos config-->
  13. <dependency>
  14. <groupId>com.alibaba.cloud</groupId>
  15. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  16. <exclusions>
  17. <exclusion>
  18. <groupId>com.alibaba.nacos</groupId>
  19. <artifactId>nacos-client</artifactId>
  20. </exclusion>
  21. </exclusions>
  22. </dependency>
  23. <!--dubbo-->
  24. <dependency>
  25. <groupId>org.apache.dubbo</groupId>
  26. <artifactId>dubbo-spring-boot-starter</artifactId>
  27. <version>2.7.8</version>
  28. </dependency>
  29. <!--dubbo nacos-->
  30. <dependency>
  31. <groupId>com.alibaba</groupId>
  32. <artifactId>dubbo-registry-nacos</artifactId>
  33. <version>2.7.6</version>
  34. <exclusions>
  35. <exclusion>
  36. <groupId>com.alibaba.nacos</groupId>
  37. <artifactId>nacos-client</artifactId>
  38. </exclusion>
  39. </exclusions>
  40. </dependency>
  41. <!--nacos-->
  42. <dependency>
  43. <groupId>com.alibaba.nacos</groupId>
  44. <artifactId>nacos-client</artifactId>
  45. <version>1.3.2</version>
  46. </dependency>

支付模块

application.properties

  1. # dubbo扫描包路径
  2. dubbo.scan.base-packages=com.chinawu.cloud.pay.service
  3. # dubbo协议
  4. dubbo.protocol.name=dubbo
  5. # 随机端口
  6. dubbo.protocol.port=-1
  7. # zookeeper地址
  8. dubbo.registry.address=nacos://127.0.0.1:8848

DPayService.java

@Service 为Dubbo注解,import org.apache.dubbo.config.annotation.Service;

  1. @Service
  2. public class DPayService implements DPayFacade {
  3. @Override
  4. public String goToPay(String userName) {
  5. System.out.println("dubbo.method:goToPay request "+userName);
  6. return "dubbo.method:goToPay result:" + userName + " pay success";
  7. }
  8. }

用户模块

application.properties

  1. # dubbo扫描包路径
  2. dubbo.scan.base-packages=com.chinawu.cloud.user.service
  3. # dubbo协议
  4. dubbo.protocol.name=dubbo
  5. # 随机端口
  6. dubbo.protocol.port=-1
  7. # zookeeper地址
  8. dubbo.registry.address=nacos://127.0.0.1:8848

UserController.java

  1. @RestController
  2. @RequestMapping("/user")
  3. @RefreshScope
  4. public class UserController {
  5. @Value("${spring.datasource.url}")
  6. private String datasourceUrl;
  7. // Dubbo服务消费
  8. @Reference(check = false)
  9. DPayFacade dPayFacade;
  10. /**
  11. * <p >
  12. * 功能:获取数据源连接配置信息
  13. * </p>
  14. * @param
  15. * @author wuyubin
  16. * @date 2020年9月3日
  17. * @return
  18. */
  19. @RequestMapping("/getDatasourceUrl")
  20. public String getDatasourceUrl() {
  21. return datasourceUrl;
  22. }
  23. /**
  24. * <p >
  25. * 功能:测试Dubbo服务调用
  26. * </p>
  27. * @param
  28. * @author wuyubin
  29. * @date 2020年9月3日
  30. * @return
  31. */
  32. @RequestMapping("/goToPay")
  33. public String goToPay() {
  34. return dPayFacade.goToPay("wuyubin");
  35. }
  36. }

测试验证

支付模块和用户模块都启动后,我们进入Nacos后台进行查看,发现服务都已注册上,如下图

请求下用户模块预留的接口(内部通过Dubbo请求支付模块),如下图

http://localhost:9012/user/goToPay

请求下支付模块预留的接口(内部通过Feign请求用户模块),如下图

http://localhost:9011/pay/get

至此Nacos和Dubbo已整合至SpringCloud。

参考资料

https://github.com/alibaba/spring-cloud-alibaba

https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html

系列文章

SpringCloud系列之配置中心(Config)使用说明

SpringCloud系列之服务注册发现(Eureka)应用篇

SpringCloud系列之网关(Gateway)应用篇

SpringCloud系列之集成Dubbo应用篇

SpringCloud系列之集成分布式事务Seata应用篇

SpringCloud系列之Nacos应用篇

项目源码

SpringCloud系列之Nacos+Dubbo应用篇的更多相关文章

  1. SpringCloud系列之Nacos+Dubbo+Seata应用篇

    目录 前言 项目版本 项目说明 Nacos服务 Seata服务 订单模块 支付模块 参考资料 系列文章 前言 本文接上篇文章<SpringCloud系列之Nacos+Dubbo应用篇>继续 ...

  2. SpringCloud系列之集成Dubbo应用篇

    目录 前言 项目版本 项目说明 集成Dubbo 2.6.x 新项目模块 老项目模块 集成Dubbo 2.7.x 新项目模块 老项目模块 参考资料 系列文章 前言 SpringCloud系列开篇文章就说 ...

  3. SpringCloud系列之Nacos应用篇

    前言 原先项目是以SpringConfig作为项目配置中心组件,Eureka作为服务注册发现组件,基本上就是SpringCloud全家桶,Eureka已经停更,所以前期调研可替换方案,主流替换方案有C ...

  4. SpringCloud系列之集成分布式事务Seata应用篇

    目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...

  5. SpringCloud系列之网关(Gateway)应用篇

    @ 目录 前言 项目版本 网关访问 鉴权配置 限流配置 前言 由于项目采用了微服务架构,业务功能都在相应各自的模块中,每个业务模块都是以独立的项目运行着,对外提供各自的服务接口,如没有类似网关之类组件 ...

  6. SpringCloud系列——Bus 消息总线

    前言 SpringCloud Bus使用轻量级消息代理将分布式系统的节点连接起来.然后可以使用此代理广播状态更改(例如配置更改)或其他管理指令.本文结合RabbitMQ+GitHub的Webhook实 ...

  7. Nacos系列:Nacos的三种部署模式

    三种部署模式 Nacos支持三种部署模式 1.单机模式:可用于测试和单机使用,生产环境切忌使用单机模式(满足不了高可用) 2.集群模式:可用于生产环境,确保高可用 3.多集群模式:可用于多数据中心场景 ...

  8. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  9. SpringBoot系列之集成Dubbo的方式

    SpringBoot系列之集成Dubbo的方式 本博客介绍Springboot框架集成Dubbo实现微服务的3种常用方式,对于Dubbo知识不是很熟悉的,请先学习我上一篇博客:SpringBoot系列 ...

随机推荐

  1. java从零到变身爬虫大神

    刚开始先从最简单的爬虫逻辑入手 爬虫最简单的解析面真的是这样 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java. ...

  2. 2020-07-02:在浏览器输入一个url后按回车,会发生什么?

    福哥答案2020-07-02: 简单回答: 域名解析. 建立TCP连接. 请求. 处理. 响应. 释放TCP连接. 页面渲染. 中级回答: 域名解析 浏览器DNS缓存. 操作系统DNS缓存. 路由器缓 ...

  3. 谈谈代码评审(code review)

    什么是代码评审(code review)? 根据维基百科的定义,代码评审是一种通过若干人员检阅源代码方式来进行的软件质量保证活动.根据软件工程的经典理论,代码评审应该是收益很高的活动,因其产生在Cod ...

  4. 关于Dapper实现读写分离的个人思考

    概念相关     为了确保多线上环境数据库的稳定性和可用性,大部分情况下都使用了双机热备的技术.一般是一个主库+一个从库或者多个从库的结构,从库的数据来自于主库的同步.在此基础上我们可以通过数据库反向 ...

  5. vue-loader处理vue文件

    loader:"vue-loader" ,引导vue文件被vue-loader/lib/index.js处理 第一步:解析vue文件 const utils = require(' ...

  6. Oracle从回收站找回误删的数据

    Step1 先根据删除时间查看删除了那些表 select * from recyclebin where type = 'TABLE' and createtime like '${删除时间}%' o ...

  7. sizeof的用法 2007-12-19 11:06

    sizeof的作用是什么?sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.其返回值类型为size_t,在头文件stddef.h中定义 ...

  8. 关于Spark RDD 的认识

    一.基本认识 RDD 是Spark大数据计算引擎中,抽象的一种数据结构. RDD(Resilient Distributed Dataset),中文意思是弹性分布式数据集,它是Spark中的基本抽象. ...

  9. 实践案例丨教你一键构建部署发布前端和Node.js服务

    如何使用华为云服务一键构建部署发布前端和Node.js服务 构建部署,一直是一个很繁琐的过程 作为开发,最害怕遇到版本发布,特别是前.后端一起上线发布,项目又特别多的时候. 例如你有10个项目,前后端 ...

  10. 哲思集-转载自CSDN

    CSDN 创始人蒋涛:世界被编码之后 分享赚¥9.90订阅博主 “写代码 20 年,通过网络平台和社区,帮助中国的程序员更好成长,这是我最希望被大家记住的.”这是蒋涛接受 ZAKER 采访的开场白. ...