Dubbo 入门教程之三

大纲

前言

学习资源

Dubbo 核心功能

学习方法

  • 学习内容

    • 基于接口代理、注册中心、负载均衡策略、容错机制、Dubbo 协议
  • 学习方法

    • 接口代理:Dubbo 的接口代理是如何实现的?
    • 注册中心:Dubbo 在 Zookeeper 上面干了什么?
    • 负载均衡:阅读官方文档、负载均衡策略配置使用、对应的源码混个脸熟
    • 容错机制:阅读官方文档、容错机制配置使用、对应的源码混个脸熟
    • Dubbo 协议:阅读官方文档、模拟 Dubbo 客户端按照报文发送序列化数据

核心功能

接口代理

  • Dubbo 的底层源码
    • Dubbo 基于接口的代理实现
      • ReferenceConfig.get() -> ReferenceConfig.init() -> ReferenceConfig.createProxy() -> StubProxyFactoryWrapper.getProxy() -> JavassistProxyFactory.getProxy() -> DubboInvoker.doInvoke()
    • Nettty 在远程过程调用的应用
      • NettyClient.doOpen() -> NettyClientHandler
      • NettyServer.doOpen() -> NettyHandler

注册中心

  • Dubbo 的底层源码

    • 将服务注册到 ZooKeeper
      • ZookeeperRegistry.doRegister()
    • 从 ZooKeeper 订阅服务
      • ZookeeperRegistry.doSubscribe()
  • Dubbo 在 ZooKeeper 中的存储结构

  • 查看 ZooKeeper 的节点信息(Root)
1
2
[zk: localhost:2181(CONNECTED) 7] ls /dubbo
[com.clay.dubbo.service.DemoService, config, metadata]
  • 查看 ZooKeeper 的节点信息(Service)
1
2
[zk: localhost:2181(CONNECTED) 9] ls /dubbo/com.clay.dubbo.service.DemoService
[configurators, consumers, providers, routers]
  • 查看 ZooKeeper 的节点信息(Type)
1
2
[zk: localhost:2181(CONNECTED) 10] ls /dubbo/com.clay.dubbo.service.DemoService/providers 
[dubbo%3A%2F%2F127.0.0.1%3A20880%2Fcom.clay.dubbo.service.DemoService%3Fanyhost%3Dtrue%26application%3Ddubbo-provider-application%26bean.name%3Dcom.clay.dubbo.service.DemoService%26dubbo%3D2.0.2%26generic%3Dfalse%26interface%3Dcom.clay.dubbo.service.DemoService%26methods%3DsayHello%26pid%3D36945%26side%3Dprovider%26timestamp%3D1735281570416]

将上述的 Provider 信息进行 URL 解码后,得到的内容如下:

1
[dubbo://127.0.0.1:20880/com.clay.dubbo.service.DemoService?anyhost=true&application=dubbo-provider-application&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.clay.dubbo.service.DemoService&methods=sayHello&pid=24895&release=2.7.6&side=provider&timestamp=1735287128612]

负载均衡

Dubbo 提供了五种负载均衡策略,如下所示:

负载均衡策略说明适用场景
RandomLoadBalance 随机(默认策略),支持按权重设置随机概率适用于请求量分散、服务性能相近的场景,能保证简单有效的负载均衡效果
RoundRobinLoadBalance 轮询,支持按公约后的权重设置轮询比率适用于服务节点性能相近、需要保证调用次数均匀的场景
LeastActiveLoadBalance 最少活跃调用数,支持相同活跃数的权重随机适用于服务性能差异较大或请求响应时间差异较大的场景,能提高请求分配效率
ConsistentHashLoadBalance 一致性哈希,相同参数的请求总是发送到同一个服务提供者适用于需要保证请求一致性的场景,例如:缓存服务或用户会话粘性
ShortestResponseLoadBalance 最短响应时间优先,选择响应时间最短的服务提供者适用于请求响应时间差异较大,且希望优先使用低延迟服务节点的场景