dubbo暴露服务

以下内容只是,自己开始学习的一个总结

1.当IOC容器初始化完成后,调用回调事件onApplicationEvent(该方法在ApplicationListener接口中)执行export()的doExport方法开始暴露服务:
dubbo暴露服务
2.暴露地址:执行doExportUrls()暴露地址:获取到注册地址registryURLs(zookeeper)和协议信息protocolConfig(dubbo协议,多条循环,可配置多个协议),doExportUrls中调用doExportUrlsFor1Protocol(protocolConfig,registryURLs)
dubbo暴露服务
dubbo暴露服务
3.doExportUrlsFor1Protocol:通过代理工厂将接口实现、接口和注册URL地址进行封装得到invoke
dubbo暴露服务
调用protocol.export(wrapperInvoker)暴露invoke
dubbo暴露服务
因为我们是用dubbo协议暴露的所以用DubboProtocol,我们也会把它注册到注册中心所以也要用RegistryProtocol
dubbo暴露服务
下面分析DubboProtocol和RegistryProtocol在暴露invoke中分别做了什么?
1)首先会进入RegistryProtocol.class
dubbo暴露服务
export中有两个重要方法:doLocalExport(originInvoker)和ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registedProviderUrl);

doLocalExport(本地暴露)

本地暴露:拿到一个要暴露的invokerDelegete执行者,用来暴露注册中心和真正的invoke,而且要将invoke在注册中心里也要注册一份
dubbo暴露服务
调用protocol.export()进入DubboProtocol中
dubbo暴露服务

dubbo暴露:

先拿到invoke的注册地址URL,相当于要再注册中心要调用的地址,将地址进行封装,包装成一个dubbo的暴露器exporter。
invoke方法中调用openServer(url);打开服务器
dubbo暴露服务
openServer:打开服务器
先拿到URL地址,即服务暴露的所在端口,然后创建服务交换
dubbo暴露服务

createServer创建服务交换

创建服务交换调用Exchangers.bind(url,requestHandler);绑定我们的服务器和请求的处理器
dubbo暴露服务
进去Exchangers.bind事件,传入URL地址获取Exchanger信息交换器
dubbo暴露服务
点击进入getExchanger(url).bind事件,调用Transporters传输器
dubbo暴露服务
进入Transporters.bind事件,就可以看到ChannelHandler包括Transporter这都是netty的底层了,再进入bind就选择用哪个Transporter
dubbo暴露服务
再进入getTransporter().bind的NettyTransporter就是创建NettyServer服务器
dubbo暴露服务
暴露服务器中,openServer就是启动一个Netty服务器用来监听8621端口,最后DubboProtocol.export()就完了。

ProviderConsumerRegTable.registerProvider注册提供者

用来保存一些信息
providerInvokers相对应还有一个consumerInvokers,这两个属性保存了每个URL地址和对应的服务提供者/服务消费者的执行器,而执行器里才有我们真正的服务的对象比如:userService的实现(userServiceImpl) .
invokes就会添加真正的服务,至此我们的服务就暴露出来了。
dubbo暴露服务
它会有两步。
1.首先dubbo的DubboProtocol会启动netty服务器来监控8621端口
2.然后register注册中心帮我们注册服务
dubbo暴露服务
选择注册中心
dubbo暴露服务
把注册中心注册好的地址,包括用zookeeper的客户端把注册服务的地址保存在我们的注册中心。最重要的是每个URL的调用,会来保存它实际的invoke执行器
dubbo暴露服务
当我们再来暴露服务的时候,我们要获取到这个Invoke并且获取到执行器。我们是用protocol来暴露我们这个执行器的,而protocol我们会用两个,一个是我们dubbo协议的protocol,还有一个是Registry的protocol,这两个都对应两个暴露者,我们这个暴露器,dubbo的protocol,他会来帮我们来开启服务器。而我们这个注册中心的这个Exporter,它的这个暴露器,他们会帮我们把这些每一个服务,以及他的URL地址的对应信息都保存在我们这个注册表里面。但这个注册表里边相当于缓存了每一个URL地址对应哪个服务的执行器,执行器里面有这个真正的服务,这样做的好处是什么呢?前面dubbo的8621端口已经启动了。
那接下来远程时要调用它url地址的服务,那怎么知道这URL地址对应的服务是什么呢?因为把这个url和服务的这个执行器那已经保存在我们这个注册表里面,我们就按照URL的地址对应哪个执行器把这个执行器拿到我们就能调用了,这是我们整个服务暴露的过程。