深入理解Apache Dubbo与实战 pdf
服务的暴露过程
服务器端 ( 服务提供者 ) 在框架启动时 , 会初始化服务实例 , 通过 Proxy 组件调用具体协议 ( Protocol ),
把服务端要暴露的接口封装成 Invoker ( 真实类型是AbstractProxylnvoker ) , 然后转换成 Exporter, 这个时候框架会打开服务端口等并记录服务实例
到内存中 , 最后通过 Registry 把服务元数据注册到注册中心 。 这就是服务端 ( 服务提供者 )整个接口暴露的过程 。
dubbo注册中心
Dubbo 主要包含四种注册中心的实现 , 分别是ZooKeeper,Redis,Simple,Multicast
工作流程
-
服务提供者启动时,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息 。
-
消费者启动时,也会向注册中心写入自己的元数据信息,并订阅服务提供者,路由和配置元数据信息
-
服务治理中心(dubbo-admin)启动时,会同时订阅所有消费者、服务提供者、路由和配置元数据信息
-
当有服务提供者离开或有新的服务提供者加入时,注册中心服务提供者目录会发生变化,变化信息会动态通知给消费者,服务治理中心
-
当消费方发起服务调用时,会异步将调用 、 统计信息等上报给监控中心
-
Dubbo 使用 ZooKeeper 作为注册中心时,只会创建持久节点和临时节点两种,对创建的顺序并没有要求
-
目录示例:
-
客户端订阅: 客户端第一次连上注册中心 , 订阅时会获取全量的数据 , 后续则通过监听器事件进行更新
-
ZooKeeper的每个节点都有一个版本号,当某个节点的数据发生变化(即事务操作)时 ,
该节点对应的版本号就会发生变化,并触发 watcher 事件,推送数据给订阅方。版本号强调的
是变更次数,即使该节点的值没有变化,只要有更新操作,依然会使版本号变化
dubbo扩展点加载机制
javaSPI
具体步骤:
1.定义一个接口和对应的方法
2.编写接口的实现类
3.在META-INF/services/目录下,创建一个以接口全路径命名的文件
4.文件内容为具体实现类的全路径名
5.在代码中通过java.util.ServiceLoader来加载具体的实现类
Dubbo对java的spi机制进行了改进
在DubboSPI中,我们使用@Adaptive注解,可以动态地通过URL中的参数来确定要使用哪个具体的实现类
ExtensionLoader工作流程
这个类实现了配置的加载,扩展类缓存,自适应对象生成
ExtensionLoader的逻辑入口可以分为getExtension、getAdaptiveExtension、getActivateExtension 三个
分别是获取普通扩展类、获取自适应扩展类、获取自动激活的扩展类