dubbo源码深度剖析
2024-06-28 15:09:17 3 举报
AI智能生成
dubbo
作者其他创作
大纲/内容
原理图
ScopeModel
子主题
用法和梳理关系图【@SPI,只能作用于接口上】
@SPI(\"值\")
自适应扩展点注解【一个接口往往会有多种实现类,Dubbo通过URL中的某些参数来动态控制实现类的选择】
@Adaptive作为标记实现了一个适配器类,并且这个类是动态生成【javassist技术实现】
可以通过配置文件来动态的使用想要的接口实现类,并且不用改变任何接口的代码,简单来说其也是通过代理来实现的
@Adtivate
可以根据你的入参,动态选择实现一批符合条件的实现类
group()指定组条件。框架SPI定义了有效的组值。
value()指定URL条件中的参数key。
参数
@Activate
javassist是一个字节码修改工具,不需要了解字节码指令
dubbo会给每个服务提供者的实现类生产一个wrapper类它最终调用服务提供方的接口实现类【功能增强,再执行业务方法时,可执行植入自己的框架逻辑】
生成这个wrapper类的操作虽然比较麻烦,但是它是在dubbo服务启动时生成的,所以不会对运行时带来开销。【wrapper类的存在是为了减少反射的调用】
使用javassist 的分析
javassist技术
ExtensionLoader.getExtensionLoader的方法获取实例【类型必须是接口、接口上必须标注@SPI】
一夫一妻制【@SPI标注的接口和ExtensionLoader实例是一对一的关系】
ExtensionLoader<CarInterface> extensionLoader = ExtensionLoader.getExtensionLoader(CarInterface.class);
ExtensionLoader
虽然我获取到了所有的实现类,但是无法对实现类进行分类,也就是说我无法确定到底该用哪个实现类,并且java的spi机制会一次性给所有的实现类创建对象,如果这个对象你根本不会使用,那么此时就会白白浪费资源,也就是说无法做到按需加载。【缺点】
java的spi机制 -- ServiceLoader
spring的spi机制 -- SpringFactoriesLoader
dubbo的spi机制 -- ExtensionLoader
额外
SPI机制
dubbo网络服务器架构剖析
Exchange网络组件
Transporter网络通信组件
NettyServer构建和打开
网络通信
源码深度剖析
0 条评论
回复 删除
下一页