总系列目录地址
dubbo相关资料可以看官网
dubbo注册机制
- 加载starter, soul-spring-boot-starter-client-alibaba-dubbo。如:SoulAlibabaDubboClientConfiguration/SoulApacheDubboClientConfiguration
- 加载bean, AlibabaDubboServiceBeanPostProcessor, 各种框架协议的各自实现。
2.1 初始化时启动一个线程池,poolSize=1
2.2 onApplicationEvent 开始注册服务, 通过 Spring ContextRefreshedEvent 找所有 dubbo.ServiceBean。
2.3 handler, 找 SoulDubboClient 注解把相关的服务通过 okClient 发送到 admin,通过放射方式拿到注解方法里面的各种参数。
日志打印:2021-01-28 06:35:00.123 INFO 12864 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils : dubbo client register success: {"appName":"dubbo","contextPath":"/dubbo","path":"/dubbo/findByStringArray","pathDesc":""...
总的来说,dubbo 插件代码都是一样的,通过 spi 机制加载,具体实现放在 xxxPostProcessor 里面,由 spring ContextRefreshedEvent 找到 jvm 里的 dubbo.ServiceBean,经过处理生成 json 通过 http post 方式注册到 admin。
dubbo访问机制
- 访问统一接口 SoulWebHandler, 责任链模式,一层一层执行直到 AlibabaDubboPlugin
- 先执行AbstractSoulPlugin 模板方法里面的 execute, 最终执行到具体实现方法 AlibabaDubboPlugin.doExecute, 执行 plugin 里自定义的动作
- alibabaDubboProxyService.genericInvoker
sofa注册和访问机制都跟dubbo类似
总结
插件机制都是使用 soul 属性的 starter 方式,基本上所有功能都以SPI方式注册。每个 plugin 的实现都不一样, 但是统一了抽象方法。
观察发现 dubbbo/sofa 的插件结构都是一样的,cache,handler,proxy,response,subscriber。 这些都是被抽象出来的,具体实现由插件实现。