写点什么

Dubbo 框架学习笔记十六

作者:风翱
  • 2021 年 12 月 29 日
  • 本文字数:999 字

    阅读完需:约 3 分钟

Dubbo 框架学习之服务引用流程:


Dubbo 支持两种方式引用远程的服务:

  • 服务直连的方式,仅适合在调试服务的时候使用;

  • 基于注册中心引用服务,这是生产环境中使用的服务引用方式。


服务引用的核心实现在 ReferenceConfig 之中,一个 ReferenceConfig 对象对应一个服务接口,每个 ReferenceConfig 对象中都封装了与注册中心的网络连接,以及与 Provider 的网络连接,这是一个非常重要的对象。


为了避免底层连接泄漏造成性能问题,Dubbo 提供了 ReferenceConfigCache 用于缓存 ReferenceConfig 实例。


ReferenceConfigCache 实例对象中,会维护下面两个 Map 集合:

  • proxies(ConcurrentMap<Class<?>, ConcurrentMap<String, Object>>类型):该集合用来存储服务接口的全部代理对象,其中第一层 Key 是服务接口的类型,第二层 Key 是 KeyGenerator 为不同服务提供方生成的 Key,Value 是服务的代理对象。

  • referredReferences(ConcurrentMap<String, ReferenceConfigBase<?>> 类型):该集合用来存储已经被处理的 ReferenceConfig 对象。


ReferenceConfig 是服务引用的真正入口,其中会创建相关的代理对象。


ReferenceConfig.createProxy() 方法中处理了多种服务引用的场景,例如,直连单个/多个 Provider、单个/多个注册中心。 createProxy() 方法的核心流程,大致有 5 个步骤:


根据传入的参数集合判断协议是否为 injvm 协议,如果是,直接通过 InjvmProtocol 引用服务。


构造 urls 集合。Dubbo 支持直连 Provider 和依赖注册中心两种服务引用方式。如果是直连服务的模式,我们可以通过 url 参数指定一个或者多个 Provider 地址,会被解析并填充到 urls 集合;如果通过注册中心的方式进行服务引用,则会调用 AbstractInterfaceConfig.loadRegistries() 方法加载所有注册中心。


如果 urls 集合中只记录了一个 URL,通过 Protocol 适配器选择合适的 Protocol 扩展实现创建 Invoker 对象。如果是直连 Provider 的场景,则 URL 为 dubbo 协议,这里就会使用 DubboProtocol 这个实现;如果依赖注册中心,则使用 RegistryProtocol 这个实现。


如果 urls 集合中有多个注册中心,则使用 ZoneAwareCluster 作为 Cluster 的默认实现,生成对应的 Invoker 对象;如果 urls 集合中记录的是多个直连服务的地址,则使用 Cluster 适配器选择合适的扩展实现生成 Invoker 对象。


通过 ProxyFactory 适配器选择合适的 ProxyFactory 扩展实现,将 Invoker 包装成服务接口的代理对象。


发布于: 刚刚
用户头像

风翱

关注

还未添加个人签名 2017.11.24 加入

勇于尝试,持续成长

评论

发布
暂无评论
Dubbo 框架学习笔记十六