欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dubbo 服务暴露过程

程序员文章站 2024-03-23 12:32:22
...

先发图镇楼

dubbo 服务暴露过程

serviceconfig#doExportUrlsFor1Protocol方法会先做一个代理,ref就是业务实现类,

Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));

使用代理 javassist或者jdk代理转换成一个invoker,即这部分

dubbo 服务暴露过程

接下来会使用protocol.export(wrapperInvoker); 将invoker转换成exporter,

注意一下ServiceConfig里面的protocol是ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

返回的结果是protocol&Adaptive ->protocolListenerWraper->protocolFilterWraper->DubboProtocol 

protocolFilterWraper#export方法会调用buildInvokerChain,即这部分

dubbo 服务暴露过程

DubboProtocol的export方法将invoker转换成了exporter,然后返回,即这部分

dubbo 服务暴露过程

DubboProtocol内部维护了一个Map<String, ExchangeServer> serverMap,调用server = Exchangers.bind(url, requestHandler); 得到一个ExchangeServer,它的子类有ExchangeClient和ExchangeServer2种,内部是通过HeaderExchanger得到的。

HeaderExchangeServer内部有一个server,默认是nettyServer,它是调用Transport生成的,即这部分

dubbo 服务暴露过程

总体来说,就是DubboProtocol维护了HeaderExchangeServer,ExchangeServer维护了一个nettyServer。

dubbo 服务暴露过程

nettyserver的父类AbstractEndpoint维护了一个codec2,即这部分

dubbo 服务暴露过程

还是以dubbo协议为例,默认使用的是DubboCountCodec,它内部又使用了DubboCodec,encode和decode方法后获取

Serialization进行序列化和反序列化,CodecSupport.getSerialization(channel.getUrl()); 即这部分

dubbo 服务暴露过程