框架图
dubbo 的整体设计原则 - 微内核 插件
什么是微内核? 微内核即最小化内核,内核只负责插件的组装,不带任何功能逻辑,所有功能都由可替换的插件实现。 比如: Spring,OSGI,JMX,ServiceLoader等都是常见的微核容器,它们负责基于统一规则的组装,但不带功能逻辑。
什么是SPI ,java.util.serviceloader
SPI 全称为(ServiceProviderInterface), 是JDK内置的一种服务提供发现机制,jdk通过ServiceLoader类实现spi机制的服务查找功能。 它是一种动态替换发现的机制,举个例子来说,有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。 ServiceLoader会遍历所有jar查找META-INF/services/接口全限定名xxx中的文件。
dubbo 为什么不用JDK自带的spi
JDK的SPI的缺点
1、一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时会导致这个应用初始化耗时,没有延迟加载功能。 2、如果扩展点加载失败,那么会连扩展点的名称都无法获取到。比如: JDK标准的ScriptEngine,通过getName()获取脚本类型的名称,但如果RubyScriptEngine因为所依赖的jruby.jar不存在,导致 RubyScriptEngine类加载失败,这个失败原因被吃掉了,和ruby对应不起来,当用户执行ruby脚本时,会报不支持ruby,而不是真正失败的原因。 3、JDK的spi要用for循环,然后if判断才能获取到指定的spi对象,所以spi实现数量多的时候性能将成为问题
Dubbo的改进
dubbo的SPI改进提高了性能,增加了功能:
1、拓展点增加了缓存,提高了性能。(使用ConcurrentMap<Class<?>,ExtensionLoader<?>>EXTENSION_LOADERS作缓存) 2、增加了spi的默认值 3、增加了通过key的形式获取拓展点。(因为使用了ConcurrentMap,直接通过key获取Value) 4、增加了Ioc和AOP功能
dubbo 的线程模型
Dubbo的线程模型在dubbo的服务端,在传输完成接收到客户端的请求之后,是通过Dispatcher分发请求到线程池处理之后, 返回结果给客户端,当然,也可以直接由Dispatcher处理并返回结果