Dubbo服务暴露源码分析
duubo提供者初始化源码分析—
spring启动的时候用dubbo解析器解析‘dubbo: service’标签成serviceBean类
该类继承spring的监听类和初始化类,在afterProperties()方法中将该service对应的dubbo配置初始化设置,监听spring的容器bean初始化完成事件,onApplication()会在springboot刷新完容器bean调用。
dubbo也会有多协议配置
这里是如果存在多个protocol则在多个端口暴露。
进入这个方法,先根据该service的dubbo配置初始化一些参数配置(供后面构建url和Invoker,exporter使用)
这个方法就是获取执行获取ref对象的代理Invoker类,其中的参数proxy就是dubbo service的具体实现bean,调用这个返回的invoker的doInvoker()方法会执行proxy的具体方法。
最重要的就是这个export()方法
在调用这个export()方法之前,其实已经调用过
他会传入的Invoker代理对象构建Filter过滤器链表,如下
回归Registry的export()方法
最终会调用
DubboProtocol的openServer就是创建该服务提供者的对应端口的netty serverSocket.
第一个方法是根据请求信息获取对应的invoker对象(这个类就是处理请求的handler)
这里可以看到第二个方法就是判断能否在invoker里找到请求的方法,有的话就执行。
这个方法就是根据请求的版本组名端口等信息来获取对应的*invoker*来执行具体的方法。
// 计算 service key,格式为 groupName/serviceName:serviceVersion:port。比如:
// dubbo/com.alibaba.dubbo.demo.DemoService:1.0.0:20880
第一个方法在这里会将该service提供者信息注册到zk。
第二个方法是watch zk相应节点。
核心调用registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener):
对发布的dubbo服务的这个url进行监听, 当服务变化有时通知重新暴露服务, 以zookeeper为例,暴露服务会在zookeeper生成一个节点,当节点发生变化的时候会触发overrideSubscribeListener的notify方法重新暴露服务