之前一直没怎么接触过 Spring Cloud 这段时间因为项目需要才开始深入研究; 当前用的是若依二开版(内部走的是 Feign) 但在写一堆工厂类时感觉太繁琐 所以才想着把 Dubbo 集成进来 提高点开发效率;
本文只是基于我自己的实践和理解做的分享 难免有不够严谨的地方 如果各位大佬发现有问题或者更好的玩法 欢迎在评论区指正交流;

如何选择Dubbo版本?

1. 看你用的 Spring Boot / Spring Cloud Alibaba 版本

Spring Boot / SCA 版本 推荐 Dubbo 版本
Boot 2.3 ~ 2.7 / SCA 2.2.x  Dubbo 3.1.x(LTS)
Boot 2.7 / 3.0 / 3.1 / 3.2 / SCA 2021+  Dubbo 3.2.x(主力版本)

Dubbo 跑在 Spring 环境里,首先要看兼容性;

2.看注册中心 

不同注册中心适配不同 Dubbo 版本

注册中心 Dubbo 推荐版本
Nacos Dubbo 3.1.x / 3.2.x(最佳支持)
Zookeeper Dubbo 2.7 / 3.x 都可以
Apollo 2.7 老版本更稳定

3. 看项目需求

如果你需要:

        Triple 协议(HTTP/2)

        gRPC 网关

        多注册中心隔离

        服务弃用监听

        高性能线程池 model

        运行在 K8S 中

 如果不需要的话选择常规中规中矩的就好了;


集成

在此之前 我所使用的ruoyi-cloud是已经存在通用的api模块 (ruoyi-system-api)用于存放跨平台调用api(之前用于放feign)因为这个模块在所有的模块都可以调用 相对来说可读性好些 最好是单独像ruoyi一样拎一个模块出来放;

 dubbo是有:Provider 配置(服务提供方)/Consumer 配置(服务调用方);

现需要在外面的pom中(父pom引入dubbo 这一步是为了方便后续省略版本号我这边用的是3.2.5版本 根据个人所需选择)

1.添加依赖

<dubbo-version>3.2.5</dubbo-version>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-bom</artifactId>
    <version>${dubbo-version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后找到我们需要调用/被调用的模块 

示例:

        ruoyi-main(被调用)

        ruoyi-outside(调用者)

        ruoyi-system-api(存放api(service)的地方)

需要调用的几个模块除了存放api( ruoyi-system-api)的模块都要加上依赖:

<!--        dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

<!--        nacos-dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
        </dependency>

虽然说我们在外已经有一个nacos了但是不一样 它子模块还是需要存放一个nacos(dubbo包里的,说的不对欢迎各位大佬纠正);在调用者和被调用者都需要加入这两个依赖,记得刷新maven;


2.修改本地配置文件

为什么要放在本地?

Dubbo 官方文档强调(简化翻译)

注册中心、协议、应用名属于框架级别,需要在应用启动前加载,因此必须放在本地配置文件,不建议托管到远程配置中心。

需要在调用者被调用者的配置文件中新增Dubbo配置如下:

(tips:最好是在nacos新建空间然后存放 不要放在一起 外部访问走网关的时候会有诡异的bug)

dubbo:
  application:
    name: service-dubbo
    qos-enable: false

  registry:
    address: nacos://127.0.0.1:8848
    group: dubbo //分组存放
    parameters:
      namespace: bddd49e5-7ea8-46ce-aea5-b64ccc789efc//你的命名空间id

  protocol:
    name: dubbo
    port: 9090 //可以改成-1 但是我这个服务需要生产和消费 所以是打开的端口
    host: 127.0.0.1

  provider:
    timeout: 5000
    retries: 0
    group: dubbo

  consumer:
    timeout: 5000
    check: false

application.name:

dubbo:
  application:
    name: service-dubbo

这里的name最好是分开命名 不要命名到一起去了

registry.address

registry:
  address: nacos://127.0.0.1:8848

这里就是告诉dubbo 服务中心是nacos 地址是这个;

你所有的服务消费者(@DubboRefernce) 服务提供者(@DubboService)都可以订阅注册到这个Nacos;

protocol.name & protocol.port

protocol:
  name: dubbo
  port: -1

这是 Dubbo 的服务暴露协议配置;

name: dubbo    使用 Dubbo 默认协议(比 Triple、gRPC 轻);

port: -1                -1 的含义:自动选择端口 

也就是说:

  • 启动时随机找一个可用端口

  • 服务会使用这个端口对外暴露

 推荐在多模块、多服务同机部署时使用,避免端口冲突;

如果你想固定端口,可以这样写:

protocol:
  name: dubbo
  port: 8081

如果是生产者就需要暴露端口给消费者调用 反之消费者的端口就可以使用-1自动选择不暴露出去 但是如果是多个模块相互调用还是不要写-1的好

consumer.timeout

consumer:
  timeout: 30000

消费者(调用 Dubbo 服务)默认调用超时时间:

30 秒
所有 @DubboReference 默认生效

如果 TestService 或其他服务处理超过 30 秒,会超时报错;


3.加入注解

调用方和被调用方都需要在application加入这个注解

@EnableDubbo

这是在ruoyi-system-api创建的一个service

此时我们在ruoyi-main模块实现他 需要把之前用的@service替换成@DubboService

(tips:虽然使用的注解不一样但是我们在一个模块调用的时候还是可以使用@autowired这类注解 dubbo会帮我们生成这个实例 所以不用担心)

等一切就绪以后就可以打开nacos-我们新建的dubbo分组查看是否已经有这个service


4.调用测试

此时我们在目标模块ruoyi-outside调用testService (一定要加注解@DubboReference)

此时测试结果为:


结语

就先分享到这里啦 ^-^
以上就是我这次在 SpringCloud(RuoYi-Cloud)中集成 Dubbo 的全部实践内容;
非常感谢各位耐心看到最后,如果哪部分理解有偏差,也欢迎大佬们在评论区指出、交流,一起把方案打磨得更好!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐