Dubbo源码剖析三之服务注册过程分析
Dubbo源码剖析二之注册中心 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中对注册中心进行了简单的介绍,对Dubbo整合Zookeeper链接源码进行了详细分析。本文接着对服务注册过程源码进行分析。
借图说明服务注册(暴露)流程:
利用之前案例跟踪调试分析上述流程的实现,或者验证该流程:
1)ServiceConfig 类拿到对外提供服务的实际类 ref(如:SleepServiceImpl,具体ref相关内容参考Dubbo服务注册到Zookeeper,对外提供服务的实际类 ref(如:SleepServiceImpl)保存在哪里 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))
2)然后通过ProxyFactory 接口实现类中的 getInvoker 方法使用 ref 生成一个 AbstractProxyInvoker 实例,到这一步就完成具体服务到 Invoker 的转化。接下来就是 Invoker 转换到 Exporter 的过程。(看下ServiConfig类,关注下ProxyFactory和Protocol类型的属性以及ref)
注册源码如下:
大致调用都找到具体源码了,那么Invoker转换成Exporter的过程是怎样的呢?其中涉及到RegistryService、RegistryFactory接口和注册provider到注册中心的具体方法源码。
1)RegistryService代码比较简单,主要是对指定的路径进行注册、解绑、监听和取消监听、查询等操作,是注册中心最为基础的类。
2)RegistryFactory,通过其生成真实的注册中心。通过这种方式,也可以保证一个应用中可以使用多个注册中心。其通过不同的protocol参数选择不同的协议。
3)那么一个服务是如何注册到注册中心的呢?其中比较关键的一个类就是RegistryProtocol,它负责管理整个注册中心相关协议并且同一对外提供服务。以这个类中的export方法为入口分析需要执行的信息注册:
4)register方法,主要从RegistoryFactory中获取注册中心,并且进行地址注册
都有进行register了,那么Registry中类目录结构是怎样的呢?
5)FailbackRegistry,主要是调用第三方实现方式并在出现错误时增加重试机制。
补:消费端的注册流程类似,如下图示
首先 ReferenceConfig 类的 init 方法调用 createProxy() ,期间 使用 Protocol 调用 refer 方法生成 Invoker 实例(如上图中的红色部分),这是服务消费的关键。接下来使用ProxyFactory把 Invoker转换为客户端需要的接口(如:HelloService)。