1月27日作业
- .跑通alibab-dubbo, apache-dubbo插件,研究底层原理
- 总结
知识回顾
alibaba-dubbo
插件主要处理alibaba-dubbo protocol的请求。将要注册到网关的dubbo服务用SoulDubboClient
注解标注,在相关项目启动时会将索要注册的服务以及相关selector, rule同步到soul-admin
.其实还是通过ApacheDubboPlugin
调用doExecute
来实现dubbo服务的调用。
Dubbo插件原理初探
与divide插件不同的是,dubbo插件需要metadata才能实现dubbo服务的调用,我们可以观察一下soul-admin
dashboard的元数据管理
一栏
与此对应的是MetaData
Pojo
rpcExt
其实对应DubboRuleHandle
的JSON字符串
可以看出在dubbo服务注册到soul网关时,每个dubbo接口对应相应的一条元数据信息。
通过打断点进行追踪,我们发现在AlibabaDubboPlugin
的doExecute
方法中首先拿到soul-admin同步过来的META_DATA
, 然后通过alibabaDubboProxyService
来泛化调用注册的一个dubbo服务。核心代码如下:
那么AlibabaDubboPlugin
是如何拿到soul-admin端的metaData呢?我们可以关注AlibabaDubboMetaDataSubscriber
中的onSubscribe
方法,实现了onSubscribe
监听者模式,并将META_DATA放入concurrentHashMap做缓存。
我们还可以深究ApplicationConfigCache
,该类是一个单例,通过dubbo接口的META_DATA来生成相应的GenericService
从而被dubbo代理泛化调用。核心代码为build
方法,通过元数据生成GenericService的reference.
接下来是最为关键的一步,即在AlibabaDubboProxyService
代理服务中实现泛化调用。
至此alibaba-dubbo插件的底层原理初探已经完成。apache-dubbo插件的底层原理和alibaba-dubbo相似:他们通过使用同一个dubboParamResolveService
来解析dubbo参数从而生成不同的代理来泛化调用dubbo服务。
总结
alibaba-dubbo插件和apache-dubbo插件的调用过程已经初步探明,但是soul admin是如何同步元数据到soul网关这一步还尚未探明。需进一步进行研究。