SPI
Dubbo SPI 和 Java SPI 的区别
1.Java SPI 在启动的时候就会加载所有的扩展实现;Dubbo SPI 在用到的时候才会去加载扩展实现,且会缓存扩展类的 Class 对象和扩展类的实例对象
2.Dubbo SPI 提供了 AOP、IOC 的功能
3.Java SPI 异常难定位
普通扩展
Adaptive自适应扩展
<span style="font-size: inherit;">注解在接口实现类上,不会编译生成一个适配类,这个注解了 @Adaptive 的实现类就是接口的适配类</span><br>
注解在接口方法上,使用 javassistCompiler 拼接字符串并编译,把这个动态生成的类作为适配类,然后再根据 URL 中的参数选择具体的扩展实现
IOC扩展
SPI 注入
SetXXX(Class clazz) 注入是根据类型 Class 去注入,从 Dubbo 配置文件中找注入的实现类,并且一定需要是 Adaptive 的方式
Spring 注入
SetXXX(Class clazz) 从 Spring 容器中先获取 bean name 为XXX 的,没有的话在根据 Class 类型获取 bean
AOP扩展
典型的装饰者模式,装饰对象中构造方法传入接口
Activate自动激活扩展
过滤器使用,根据条件创建多个扩展实现
服务暴露
解析配置文件<dubbo:service>,发起服务暴露
JavassistProxyFactory 动态代理实现类,创建代理对象 invoker,<font color="#c41230">服务暴露动态代理的对象是接口实现</font>
RegistryProtocol.doLocalExport 根据 URL 中参数 exprot 到具体协议(Dubbo)暴露服务,启动 netty 服务端,创建DubboExporter对象,exproter 持有之前的代理对象 invoker,并且会把 exporter 放入 map
RegistryProtocol 中还会完成和注册中心的连接注册和订阅
服务引用
解析 Dubbo 自定义的标签 <dubbo:reference>
RegistryProtocol.refer 注册中心的连接注册和订阅
订阅之后创建invoker,启动Netty连接远程服务,invoker放入Map
Cluster聚合Directory,Directory 中的 Map 含有 invoker ,在调用的时候从 DIrectory 中查找对应的 invoker
代理工厂生成代理类Proxy0,<font color="#c41230">代理的对象是 MockClusterInvoker</font>
注册中心
Dubbo 默认提供的注册中心
zookeeper
redis
广播
内存
服务提供者注册 providers,订阅 configurators
服务消费者注册 consumers,订阅 configurators、routers、providers
发布。发布就是创建临时节点
订阅。订阅第一次全量 pull 对应的节点数据,后面节点变更后会<font color="#c41230">通知</font>给订阅节点的服务,然后服务再全量 pull 节点的数据
缓存机制