服务治理中间件 Dubbo 原理解析( 消费者启动服务引用)读书笔记

服务消费方服务器启动(并不是服务去远程调用)

一。服务引用是服务的消费方向注册中心订阅服务提供方提供的服务地址后向服务提供方引用服务的过程。
服务的应用方在 spring 的配置实例如下:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
如上配置 spring 在容器启动的时候会解析自定义的 schema元素<dubbo:reference/>转换成dubbo内部数据结构ReferenceBean

二。ReferenceBean 除了继承了配置的抽象类来处理配置信息外,它还实现 spring
容器的一些接口,这里我们分析下 FactoryBean, 首先它对于 spring 来说是个
bean,参与 Bean 创建的所有生命周期,关键在于 spring 的 bean 工厂
beanFactory.getBean(“demoService”)获取的 bean 的时候会判断下是不是
FactoryBean 的实例,如果是调 factoryBean.getObject()返回,否则返回 bean。
我们对于远程调用获取的 demoService 其实并不是想要 ReferenceBean 这个对象
实例本身,我们是想获取对远程调用的代理,能够通过这个代理服务调用远程服
务。这里就是通过 factoryBean.getObject()来创建引用返回基于 DemoService
接口的代理给引用,对用户透明 dubbo 封装了复杂实现


三。ReferenceBean extends ReferenceConfig->ReferenceBean.afterPropertiesSet->ReferenceBean.get()->ReferenceBean.getObejct->ReferenceConfig.get()->init()->
创建代理createProxy


四。创建代理的过程:
1. 获取消费者配置
2. 获取配置的注册中心,通过配置中心配置拼装 URL,线上应该是个配置中心集群
3. 遍历注册中心List<URL>集合加载监控中心URL,如果配置了监控中心在注册中心url加上MONITOR_KEY
根据配置的引用服务参数给注册中 URL上加上REFER_KEY
4. 遍历注册中心 List<URL>集合这里注册中心url包含了monitorUrl和referUrl
protocol.refer(interface, url)调用 protocol 引用服务(这里调用RegistryProtocol)返回 invoker 可执行对象(这个invoker并不是简单的DubboInvoker,而是由
RegistryProtocol 构建基于目录服务的集群策略Invoker,这个invoker可
以通过目录服务 list 出真正可调用的远程服务 invoker)
对于注册中心 Url 设置集群策略为AvailableCluster, 由AvailableCluster
将所有对象注册中调用的 invoker 伪装成一个 invoker
5. 通过代理工厂创建远程服务代理返回给使用着proxyFactory.getProxy(invoker);


五。procotol.refer(interface, url) 引用服务的过程(RegistryProtocol)
1. 经过 ProtocolListenerWrapper, ProtocolFilterWrapper 由于是注册中心url 调用     
   RegistryProtocol.refer
2. 获取注册中心协议zookeeper,redis,还是dubbo,并根据注册中心协议通
   过注册器工厂 RegistryFactory.getRegistry(url) 获取注册器 Registry 用
   来跟注册中心交互
3. 根据配置的 group分组
4. 创建注册服务目录RegistryDirectory 并设置注册器
5. 构建订阅服务的 subscribeUrl
6. 通过注册器 registry向注册中心注册subscribeUrl 消费端 url
7. 目录服务 registryDirectory.subscribe(subscribeUrl) 订阅服务(这里我
   们以开源版本 zookeeper 为注册中心为例来讲解)
   其实内部也是通过注册器 registry.subscribe(url, this) 这里 this 就是
   registryDirectory 它实现了 NotifyListener。
   服务提供者在向zookeeper注册服务 /dubbo/com.alibaba.dubbo.demo.DemoService/providers/节点 
   下写下自己的 URL 地址
   服务消费者向zookeepr注册服务/dubbo/com.alibaba.dubbo.demo.DemoService/consumers/节点下写 
   下自己的 URL地址
   服务消费者向zookeeper订阅服务/dubbo/com.alibaba.dubbo.demo.DemoService/providers /节点下 
   所有服务提供者 URL 地址Zookeeper 
8.注册消费者节点后,通过 watcher 机制实现对节点的监听,节点数据变化通过节点上
   的 watcher 回调客户端, 重新生成对服务的 refer在订阅的过程中通过获 
   取/dubbo/com.alibaba.dubbo.demo.DemoService/providers / 下 的所有服务 
   提供者的urls并订阅zookeeper生产者节点后, 主动回调NotifyListener 来根据 urls 生成对服 
   务提供者的引用生成可执行invokers,供目录服务持有着,
   看下如下 RegistryDirectory.notify(urls)方法中的代码实现
   如突然又新增了一台服务器提供者;

9. 通过 cluster.join(directory) 合并 invoker 并提供集群调用策略

六。RegistryDirectory.notify->RegistryDirectory.refreshInvoker
   ->RegistryDirectory.toInvokers->DubboProtocol.refer

七。DubboProtocol.refer 过程:
1.经过 ProtocolListenerWrapper, ProtocolFilterWrapper 构建监听器链和过滤器链。
2.DubboProtocol 根据url获取 ExchangeClient 对象,如果是share存在就返回不存在创建新对象不是 share 直接创建。ExchangeClient 是底层通信的客户端,对于通信层的创建功能不在这里讲解。
3. 创建 DubboInvoker, 这个invoker对象包含对远程服务提供者的长链接,是真正执行远程服务调用的可执行对象
4.将创建的invoker返回给目录服务





 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icool_ali

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值