Dubbo的底层通信使用的是Netty.
关于Dubbo的服务暴露流程,网络上已经有很多优质的文章.此篇文章以Dubbo的服务暴露为主线(不会详细讲解),观察一下,Netty在服务暴露过程中何时被使用.
// 服务暴露的起点
流程会走到如下代码
private void doExportUrls() {
流程继续走到如下代
码
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
基于SPI机制,protocol会调用com.alibaba.dubbo.registry.integration.RegistryProtocol#export,源码如下
@Override
第一行的doLocalExport方法,继续跟进
private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker) {
基于SPI机制,protocol会调用com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#export,源码如下
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
继续跟进openServer方法
private void openServer(URL url) {
一直跟进,会依次调用如下几个主要方法
server = Exchangers.bind(url, requestHandler);
在创建NettyServer时候,最终会调用到如下代码
@Override
上面的代码就是很熟悉的Netty创建服务端的代码.最终会创建并启动服务端.
也就是说,在暴露服务的过程中,在进行doLocalExport本地暴露的时候,会分别经过RegistryProtocol#export和DubboProtocol#export,最后通过Netty创建一个服务端,监听外部的接口调用请求.
虽然本地服务已经暴露,但是还需要将服务注册到注册中心(例如ZK)
在没有注册到ZK之前,查看下ZK信息
是没有dubbo节点信息的.
@Override
当执行完register方法之后,再查看ZK信息
已经有dubbo节点信息了,说明提供者已经注册到ZK上了.
**总结
**
Dubbo在暴露服务的过程中,首先会通过Netty创建并启动服务端,监听外部调用接口的请求.紧接着会将服务注册到注册中心(例如Zookeeper).
本文分享自微信公众号 - Netty历险记(infuq217)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。