[全网首发]Dubbo3 中的ScopeModel和SPI扩展点的工作原理
2022-10-27 21:20:50 1 举报
Dubbo3 中的ScopeModel和SPI扩展点的工作原理
作者其他创作
大纲/内容
对扩展点做依赖注入
从SPI扩展点容器中获取ExtensionLoader
1
ExtensionInjector
如何扩展?如何让Dubbo执行扩展的实现?
internalId=1.0
loadbalanced=random
SPIExtensionInjector
实例化对象策略,可以通过这个类完成扩展点的实例化
ModuleModel
ExtensionAccessor
N
FrameworkModel
public class ProtocolFilterWrapper implements Protocol { private final Protocol protocol; public ProtocolFilterWrapper(Protocol protocol) { if (protocol == null) { throw new IllegalArgumentException; } this.protocol = protocol; }
JdkCompiler
1. 选择负载算法
返回所有扩展点实现
ScopeBeanExtensionInjector
META-INF/service
DubboLoadingStrategy
AdaptiveCompiler
扩展对象的所有扩展点缓存
Prioritized
发起RPC请求
从缓存中获取
internalId=1.n+1.n+1
loadDirectory
描述扩展点范围
否
internalId=1.0.n+1
增加
META-INF/dubbo
命中结果
通过实现这个接口注入ExtensionAccessor
引入SPI机制后
ScopeModel
ApplicationModel
getAdaptiveExtension().compile
扩展点包装类集合
compiler()
Dubbo Consumer
META-INF/dubbo/internal
ModuleConfig/ProviderConfig/ConsumerConfig/ServiceConfigBase/ReferenceConfigBase
轮询
一致性hash
org.apache.dubbo.rpc.cluster.LoadBalance
ServiceLoadingStrategy
name对应的扩展点实例
META-INF/services
提供不同目录的扩展点加载策略实现
对扩展点做包装
SpringExtensionInjector
命中缓存,直接返回扩展点实例
扩展
InstantiationStrategy
AdaptiveExtensionInjector
根据上下文配置的编译器名称,来选择对应的编译器实现,完成编译功能
是
返回该扩展点实例
internalId=1.0.0
随机
自适应扩展点的工作原理
createExtension
internalId=1.n+1.1
Dubbo中的SPI扩展点设计思考
ExtensionPostProcessor
......
JavassistCompiler
2. 从指定目录加载扩展实现类
LoadingStrategy
classpath:/META-INF/dubbo
internalId=1.n
loadbalanced=hash
ExtensionLoader注入器
internalId=1.0.n
Set<Class<?>> cachedWrapperClasses
提供针对扩展点的统一访问接口
从Spring容器获取ExtensionLoader
2. rpc调用
未命中
@Adaptive注解
hash=com.gupao.lb.HashLoadBanalce
Dubbo Provider
........
ExtensionAccessorAware
Apache Dubbo 3.x ScopeModel模型
ApplicationModel.defaultModel().getExtensionLoader(Compiler.class)
injectExtension
String DEFAULT_COMPILER;
网络通信
扩展点的后置处理器,在扩展初始化前后调用
helloService.say()
提供ExtensionLoader实例的获取
从自适应扩展点容器中获取ExtensionLoader
META-INF/dubbo/
1. 获取ExtensionLoader实例
从指定路径加载扩展点
public class RandomLoadBalance implement Loadbalance { private Protocol protocol; public void setProtocol(Protocol protocol){ this.protocol=protocol }}
修改
筛选指定名称的扩展点并实例化
ExtensionLoader
从ScopeBean容器中获取ExtensionLoader
加载扩展点
ExtensionDirector
DubboInternalLoadingStrategy
ExtensionScope
ApplicationConfig/MonitorConfig/MetricsConfig/SslConfig/ProtocolConfig/RegistryConfig/ConfigCenterConfig/MetadataReportConfig
internalId=1
范围模型
internalId=1.n+1.n
createExtensionInstance
internalId=1.n+1
为ScopeModel提供ExtensionLoader管理器
是否存在包装类
Dubbo启动的时候扫描并解析配置
Extension.getExtension
ExtensionLoader指定名称扩展点的实现流程图
0 条评论
下一页