ReferenceBean
服务引入
1.构造Invoker
2.操作服务目录(即:服务本地缓存)
查询注册中心,构造服务目录
根据注册中心字符串,生成服务提供者集合
监听注册中心服务提供者变化
构造路由链,根据配置的路由,从集合中,选择符合的服务提供者;并监听路由规则

服务调用
1.生成代理对象
代理对象逻辑
1.生成Invocation
2.先调用MockClusterInvoke.invoke(Invocation)
3.获取服务提供者列表【即:服务目录】(根据注册中心字符串生成DubboInvoke实例)
4.在父类中执行负载均衡策略,选择服务提供者(生成DubboInvoke实例)
5.调用真实服务

Dubbo 服务引用的两个时机

  1. Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务(饿汉式)。
  2. 在 ReferenceBean 对应的服务被注入到其他类中时引用(懒汉式)。
  3. 默认情况下使用懒汉式引用服务。如果需要使用饿汉式,可通过配置 的 init 属性开启。

Dubbo 服务引用的三种方式

  1. 引用本地 (JVM) 服务。
  2. 直连方式引用远程服务。
  3. 注册中心引用远程服务。

    1. 多个注册中心,多个服务提供者时,会得到一组 Invoker 实例,需要通过集群管理类 Cluster 将多个 Invoker 合并成一个实例.
    2. 通过代理工厂类 (ProxyFactory) 为服务接口生成代理类,并让代理类去调用 Invoker 逻辑。避免 Dubbo 框架代码对业务代码的侵入,同时让框架更容易使用。

      一、ReferenceBean

      image.png
  4. 实现Spring InitializingBean接口,在Spring 初始化后,步骤调用afterPropertiesSet。

    1. 调用prepareDubboConfigBeansprepareDubboConfigBeans方法,向Spring上下文,初始化dubbo配置类对象(例如:ApplicationConfig、RegistryConfig等)
    2. 调用ReferenceBean#getObject
  5. 实现Spring FactoryBean接口。getObject方法中调用dubbo 的 ReferenceBean#get方法,获得dubbo服务的代理对象 ref。
    1. 调用ReferenceBean#init(),生成代理对象ref。
      1. 执行checkAndUpdateSubConfigs(),检查和更新参数,和服务提供者类似,把ReferenceBean里的属性的值更新为优先级最高的参数值。(参数继承、覆盖、合并)
      2. 利用map,聚合消费者所有配置的参数。
      3. 利用map中参数,调用(invoker = REF_PROTOCOL.refer(interfaceClass, url))生成(本地或远端) invoker 对象。
      4. 调用PROXY_FACTORY.getProxy(invoker);得到一个代理对象 ref。
    2. 返回 生成的代理对相关 ref 。