这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
服务发现的作用主要范围包括向注册中心注册服务 , 以及服务的发现 (Feign 的负载均衡是在 Client 端做的 , 猜测Dubbo负载均衡也是)
Dubbo 提供多种注册中心 , 常见的有 Nacos , Zookeeper 和 Redis , 此篇也只看看3种
二 . 服务发现流程
2.1 服务发现的调用逻辑
1 | java复制代码// 服务发现的起点还是 BootStrap , 由 Listener 发起流程 |
Zookeeper Service 详情
1 | json复制代码{ |
Zookeeper 中数据情况
2.2 调用的起点
1 | JAVA复制代码C- DubboBootstrap # start |
补充 configManager
该方法从configsCache 中获取对应的参数 ,此处取得是 service
添加的流程 :
- C- AbstractConfig # addIntoConfigManager -> org.apache.dubbo.config.spring.ServiceBean
- C- ConfigManager # addConfig : 添加 Config , 用于前文循环时使用
可以看到 , 第一步时使用的就是 serverBean , 这个Bean 在扫描时创建 , 详见 -> Dubbo 3.0 : DubboService 的扫描
2.3 解析出 Service
中间没有太多东西 , 主要调用流程为 :
- C- ServiceConfig # export :
- C- ServiceConfig # doExport :
- C- ServiceConfig # doExportUrls :
- C- ServiceConfig # exported :
1 | java复制代码// 在此阶段 , 构建出 Registry URL , 用于 Zookeeper 注册 |
2.4 执行主流程
其中主步骤分为 3 步 :
- Step 1 : 属性准备
- Step 2 : 获取 host port , 构建 url
- Step 3 : 构建 Invoke , export 导出
1 | java复制代码private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) { |
PRO24001 案例 : providerUrl
1 | java复制代码dubbo://192.168.181.2:20880/org.apache.dubbo.demo.DemoService |
PRO24002 案例 : registryUrl
1 | java复制代码service-discovery-registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService |
PIC24002
2.5 传入代理类
在这一步构建了 url ,同时生成了 ServiceDiscoveryRegistry
1 | JAVA复制代码C- RegistryProtocol |
Registry 可以分为以下几个部分 :
- 由 getRegistry 发起获取 Registry
- createRegistry 发起创建逻辑
- RegistryProtocol 调用 doRegister 执行 Register
三 . Registry 的创建
共用流程
1 | java复制代码// Step 1 : 获取 Registry |
3.1 创建 ServiceDiscoveryRegistry
1 | java复制代码// Step 3 : ServiceDiscoveryRegistryFactory |
3.2 创建 ZookeeperRegistry
Zookeeper 只是 Dubbo 支持的注册中心之一 , 以其为例看一下创建和使用流程 :
这里有一个核心点 , ZookeeperRegistry 的创建是在 , 它创建时会被包裹为一个 ListenerRegistryWrapper 对象
1 | JAVA复制代码C- ZookeeperRegistryFactory |
补充 : ListenerRegistryWrapper
可以看到 , 这里 ListenerRegistryWrapper 中包含了一个 Registry 对象
1 | java复制代码public class ListenerRegistryWrapper implements Registry { |
四 . Registry 的调用
Registry 在 RegistryProtocol # register 进行注册 , 会调用父类 FailbackRegistry , 最终调用各种的实现类
FailbackRegistry 通用处理
1 | java复制代码// 此处以 FailbackRegistry 为例 |
4.1 ServiceDiscoveryRegistry 注册
1 | JAVA复制代码// Step 1 : 发起 Registry |
4.2 ZookeeperRegistry 注册
1 | java复制代码public void doRegister(URL url) { |
五 . 补充深入
5.1 服务注册器的选择
1 | java复制代码// Dubbo 提供了 Zookeeper , Nacos 等多个服务注册器 , 这里来看一下此处是如何选择的 , 此处以 Nacos 为例 |
Nacos 请求逻辑
1 | JAVA复制代码// 调用逻辑 |
Zookeeper 请求逻辑
1 | java复制代码// 调用逻辑 |
总结 :
ServiceDiscoveryRegistry 这一块没深入太多 , 后面有时间再看看 , 下面来看一下完整的流程图
本文转载自: 掘金