Dubbo 框架学习笔记十六
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 包装成服务接口的代理对象。
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/0b6ccf9a02fbab25fed789bc0】。文章转载请联系作者。
评论