Administrator
发布于 2025-12-09 / 9 阅读
0

Dubbo学习

Dubbo学习

  1. b站视频教程
  2. 官网文档

Spring Dubbo例子

api

创建实体和服务。在provider和consumer中的pom都要导入api模块。


provider

配置怎么写:

6937fcd529b53.png

配置写好了,需要一个启动类,来导入配置,然后执行。

6937fdd112430.png

log中有这个表示运行成功。

6937fe2023a26.png

下面log告诉了provider提供的url

6937fe4b08e03.png


补充

693a225086c98.png


consumer

xml配置

693a1e570cbe4.png

启动类编写

693a1ecd7571f.png


问题

qos问题:产生原因启动provider后,provider的telnet协议也占用了22222端口,consumer启动其telnet也要占用22222接口,那么就会导致端口冲突。

693a1fbee5c94.png

这上面的配置要写在application标签内。

如果是springboot则在配置文件中进行以下配置:

dubbo.application.qos.enable=true
dubbo.application.qos.port=33333
dubbo.application.qos.accept.foreign.ip=false

总结

693a25cfb8fdc.png


基于SpringBoot的方式

核心思路:深度封装,把公用的配置放置到application.yml中,把个性的配置用注解的方式进行设置。

693a2a80cc7f7.png


provider

693a283a38fbd.png

还要在启动类中添加 @EnableDubbo

693a2b62f3e7f.png


consumer

693a29905363a.png

在启动类中同样要最好要加上 @EnableDubbo


注解细节

  1. @EnableDubbo注解的作用
    用于扫描 @DubboService并把对应的对象实例化,发布成RPC服务。扫描路径:应用这个注解的类所在的包及其子包。

  2. 如果 @DubboService没有放到 @EnableDubbo所在的包及其子包下,那么可以用 @DubboComponentScan来设定扫描的包。

    @DubboComponentScan(basePackages = {"com.example.service"})
    
  3. 或者在yaml文件中设置。

    dubbo:
      scan:
        base-packages: com.example.service
    

693a320cd096a.png


@DubboService和@DubboReference参数配置

设置service注册到哪个注册中心

首先在yaml文件中配置注册中心

dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: tri
    port: -1
  registry:
    id: zk-registry
    address: zookeeper://127.0.0.1:2181

然后在 @DubboService(registry="zk-registry")那么就将该服务注册到了id为zk-registry的注册中心

共同参数:

  • version
  • group
  • registry
  • timeout
  • loadbalance: 负载均衡,默认是加权随机负载均衡。

例子:

@DubboService(version = "1.0.0", group = "dev", timeout = 5000)
@DubboReference(version = "1.0.0", group = "dev", timeout = 5000)

Dubbo服务中,接口并不能唯一确定一个服务,只有 接口+分组+版本号 的三元组才能唯一确定一个服务。

版本与分组文档

😄 什么时候用group来区分?

当同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景,可使用服务分组来区分不同的实现方式。同时,这些不同实现所提供的服务是可并存的,也支持互相调用。

😄 什么时候用版本来区分?

当接口实现需要升级又要保留原有实现的情况下,即出现不兼容升级时,我们可以使用不同版本号进行区分。

service参数:

  • delay: 如果你的服务需要预热时间,比如初始化缓存、等待相关资源就位等,可以使用 delay 参数进行延迟注册。如果是在 Spring 应用中,则 delay = n(n > 0) 延迟的时间是 Spring 上下文初始化完成后开始算起。@DubboService(delay=5000)应用将延迟 5 秒暴露此服务(应用启动 5s 后发布该服务到注册中心)。或者可以配置全局默认值,让所有服务都延迟 5s 后注册:

    dubbo:
      provider:
        delay: 5000
    

网络通信

693a377757b23.png

序列化

693a395bc7e34.png

693a39029d382.png

注册中心

注册中心负责服务地址的注册,查询。相当于目录。

服务提供方和消费方只在启动时与注册中心进行交互,注册中心不负责具体请求的处理(请求转发),压力非常小。

ZooKeeper

Zookeeper的体积非常小(13M),是Apache Hadoop的子项目,可以为大数据领域提供服务。

安装:

  1. centos上安装JDK11或者大于等于1.8的jdk
  2. 拷贝apache-zookeeper-3.6.0-bin.tar.gz到opt目录
  3. 解压安装包
  4. 重命名,也可以用默认名称
  5. 在/opt/zookeeper/这个目录下创建zkData和zkLog目录
  6. 在/opt/zookeeper/conf这个路径,复制一份zoo_sample.cfg文件并重命名为zoo.cfg
  7. 编辑zoo.cfg,修改dataDir路径,并添加dataLogDir路径的配置
  8. 启动zookeeper ./zkServer.sh Start
  9. 查看状态 ./zkServer.sh status

在dubbo项目中使用zookeeper。

  1. 在pom.xml中添加zookeeper依赖
    对于springboot:

    1. 如果您是 Dubbo3 3.3 版本及以上用户,请根据如下表格选择组件:

    Zookeeper Server 版本 Dubbo 依赖 Dubbo Starter 依赖(SpringBoot用户)
    3.4.x 及以下 dubbo-dependencies-zookeeper dubbo-zookeeper-spring-boot-starter
    3.5.x 及以上 dubbo-dependencies-zookeeper-curator5 dubbo-zookeeper-curator5-spring-boot-starter

    2. 如果您是 Dubbo3 3.2 及以下、Dubbo2 2.7.x 用户:

    Zookeeper Server 版本 Dubbo 依赖 Dubbo Starter 依赖(SpringBoot用户)
    3.4.x 及以下 dubbo-dependencies-zookeeper 不支持(自行管理)
    3.5.x 及以上 不支持(自行管理) 不支持(自行管理)

    注意

    • Dubbo 3.3.0 版本开始正式支持 JDK 17,如果您使用 JDK 17,则必须选用 dubbo-dependencies-zookeeper-curator5 或 dubbo-zookeeper-curator5-spring-boot-starter 依赖,对应的 Zookeeper Server 推荐是 3.8.0 版本及以上。
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>3.3.0</version>
    </dependency>
    <!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
        <version>3.3.0</version>
    </dependency>
    
  2. 在provider的配置文件中添加:
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

  3. 在consumer的配置文件中添加:
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

上面两个address都是example,以实际情况填写。

高级配置

认证与鉴权

如果 Zookeeper 开启认证,Dubbo 支持指定 username、password 的方式传入身份标识。

# application.yml
dubbo
 registry
   address: zookeeper://localhost:2181
   register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all
   username: hello
   password: 1234

也可以直接将参数扩展在 address 上 address=zookeeper://hello:1234@localhost:2181

分组隔离

通过指定 group 属性,可以在同一个 Zookeeper 集群内实现微服务地址的逻辑隔离。比如可以在一套集群内隔离出多套开发环境,在地址发现层面实现隔离。

# application.yml
dubbo
 registry
   address: zookeeper://localhost:2181
   register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all
   group: daily1

其他扩展配置

配置连接、会话过期时间

# application.yml
dubbo
 registry
   address: zookeeper://localhost:2181
   register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all
   timeout: 30 * 1000* # 连接超时时间,默认 30s
   session: 60 * 1000* # 会话超时时间,默认 60s