dubbo服务暴露分为两部分
1 服务实例通过动态代理转化成Invoker
2 Invoker 通过具体的协议(dubbo,rest,injvm等) 转化成exporter
如下图所示
image.png
1 暴露的入口方法 ServiceConfig.doExportUrlsFor1Protocol
image.png
其中protocolConfig 是dubbo要暴露的服务的配置参数
registryURLs 是要配置到远程注册中心信息
2 根据scope参数判断是 本地还是远程暴露 执行不同的方法
image.png
3 代理工厂获取Invoker 及根据Protocol根据Invoker参数暴露服务
image.png
4 Protocol实例使用了责任链的设计模式 会依次调用下面各类的export方法
image.png
从而为服务的暴露增加了过滤器和监听器。下面看看如何实现的:
1 ServiceConfig 中 PROTOCOL获取实例
image.png
追踪getAdaptiveExtension 方法到 createAdaptiveExtensionClass
再到 AdaptiveCompiler.compile 方法
image.png
最后到 ExtensionLoader.createExtension 的下面方法
image.png
cachedWrapperClasses 对象里装着就是以父接口Protocol为构造函数参数的对象,包装类 ProtocolFilterWrapper 和 ProtocolListenerWrapper 这两个类都有 @Activate(order =)注解 用来排序使用
image.png
最后暴露的对象实际为:
image.png
ProtocolFilterWrapper 的责任链模式实现代码
image.png














网友评论