一、dubbo的注册中心以及服务注册源码剖析
一、整体设计
dubbo整体设计以及调用用链路参照官网http://dubbo.apache.org/zh-cn/docs/dev/design.html
二、dubbo的注册中心
1、注册中心参照官网 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html
2、zk注册中心详解
2.1、目录结构
+- dubbo
+- consumers
+- consumer://192.168.1.102/com.demo.service.HelloService?application=dubbo-demo-annotation-consumer&category=consumers&check=false&dubbo=2.0.2&init=false&interface=com.lagou.service.HelloService***
+- providers
(2)、主要组成部分
1)、protocol: 协议,一般像我们的 provider 或者 consumer 在这里都是人为具体的协议
2)、host: 当前 provider 或者其他协议所具体针对的地址,比较特殊的像 override 协议所指定的host就是 0.0.0.0 代表所有的机器都生效
2.3、服务本地缓存
从上面两张图我们可以看到,服务提供者在启动的时候会主动将自己提供的服务注册到注册中心中,而服务消费者在启动的时候也会去注册中心中获取自己引用的服务列表到本地并保存到文件中,而且需要订阅对应的服务提供者节点。当服务提供者有信息变更的时候消费者会收到节点变更通知,进而获取最新服务列表跟新本地缓存文件。
可以看到其中就提供了两个方法1、注册;2、注销。
org.apache.dubbo.registry.RegistryService 这个类主要是对指定的路径进行注册,注销,监听和取消监听,查询操作。也是注册中心中最为基础的类
AbstractRegistry 是对注册中心的封装,其主要会对本地注册地址的封装,主要功能在于远程注册中心不可用的时候,可以采用本地的注册中心来使用
接下来我们来看一下他的实现类org.apache.dubbo.registry.support.AbstractRegistry#AbstractRegistry的构造方法的具体实现
其实这里主要做的就是把url缓存到本地文件中
2.4、服务注册过程分析
1、服务注册时序图
2、服务注册过程
说明:服务注册过程大致可以分为两个过程1、具体某个服务转换为Invoker,2、invoker转换成exporter
从上图我们就可以发现,org.apache.dubbo.config.spring.ServiceBean继承了ServiceConfig而且实现了spring的一堆组件。熟悉spring的同学应该就知道了,在spring容器的生命周期中,这些组件都会进行初始化。
接下来我们重点看一下ServiceConfig中的ProxyFactory 和 Protocol 以及 ref 属性
接下来我们再看一下协议接口
可以看到协议顶级接口中提供了暴露和引用服务的接口它有很多实现类,而我们注册使用的是org.apache.dubbo.registry.integration.RegistryProtocol
接下来我们看一下如何将一个ServiceConfig转换成invoker由于方法较长就不详细截图了
org.apache.dubbo.config.ServiceConfig#export
org.apache.dubbo.config.ServiceConfig#doExport
org.apache.dubbo.config.ServiceConfig#doExportUrls
org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol
接下来我们再回头看看org.apache.dubbo.registry.integration.RegistryProtocol#export这个方法
这个方法呢主要做了5件事
1、获取注册中心的url:zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=***
2、获取服务提供者的url: dubbo://192.168.1.102:20880/com.demo.service.HelloService?anyhost=**
3、获取注册中心
4、将服务提供者注册到注册中心中
5、返回暴露的对象
接下来我们再看一下org.apache.dubbo.registry.integration.RegistryProtocol.DestroyableExporter类
他主要提供了一个获取invoker的方法
我们再看一下注册方法
可以看到这里使用的是工厂模式获取的具体工厂,接下来我们再看一下注册中心的工厂接口
org.apache.dubbo.registry.RegistryFactory 是注册中心工厂,通过这种方式,也可以保证一个应用中可以使用多个注册中心。可以看到这里也是通过不同的protocol参数,来选择不同的协议
接下来我们看一下org.apache.dubbo.registry.support.FailbackRegistry#register
这里主要做了三件事情
1、把当前url放入到已经注册的列表中
2、处理注册失败的url
3、真正处理当前url的注册
我们再看看真正处理当前url的注册方法就会发现这是一个模板方法,需要子类去提供具体实现
既然dubbo默认使用zk为注册中心,那咱们就再看看zk的实现
看到这里,服务注册的流程就ok了。