美文网首页Dubbo专题
Dubbo之服务消费

Dubbo之服务消费

作者: 九点半的马拉 | 来源:发表于2020-02-04 17:32 被阅读0次

Dubbo的服务消费主要包括两个部分。第一大步是ReferenceConfig类的init方法调用Protocolrefer方法生成Invoker实例,这是服务消息的关键。第二大步是把Invoker通过动态代理转换成实现用户接口的动态代理引用。这里的Invoker承载了网络连接、服务调用和重试等功能。

服务消费起点

在消费者的配置文件中存在这个代码:

<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" />

它会生成一个ReferenceBean,实现了FactoryBean接口,继承了ReferenceConfig,所以ReferenceBean作为dubbo中能够生产对象的工厂Bean,而我们要引用服务,也就要有一个该服务的对象。

public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean,
        ApplicationContextAware, InitializingBean, DisposableBean {

服务引用被触发有两个时机:

  • Spring容器调用ReferenceBean的afterPropertiesSet方法时引用服务(饿汉式)
  • 在ReferenceBean对应的服务被注入到其他类中时引用(懒汉式)

默认情况下,Dubbo使用懒汉式引用服务。如果需要使用饿汉式,可通过配置<dubbo:reference>的init属性开启。

因为ReferenceBean实现了FactoryBean接口的getObject()方法,所以在加载bean的时候,会调用ReferenceBean的getObject()方法。

ReferenceBean.getObject()  --->  ReferenceConfig.get()   --> ReferenceConfig.init()

在init()方法中主要有这几步:
(1) 检测本地存根和mock合法性
(2) 添加协议版本、发布版本、时间戳、application、module、consumer、protocol等所有信息到map中。
(3) 单独处理方法配置,设置重试次数配置以及设置该方法对异步配置信息。
(4) 添加消费者ip地址到map
(5)创建代理对象,调用ReferenceConfig.createProxy()方法。
(6) 生成ConsumerMpdel存入到ApplicationModel中。

之后介绍ReferenceConfig.createProxy()方法。主要有下面几步:

  • 如果是本地调用,则直接使用InjvmProtocol的refer方法生成Invoker实例。
  • 如果不是本地调用,但是选择直连的方式进行调用,则分割配置的多个url。如果协议是配置registry,则表明用户想使用指定的注册中心,配置url后将url保存到urls里面,否则就合并url,并且保存到urls。
  • 如果是通过注册中心来进行调用,则先校验所有的注册中心,然后假加载注册中心的url,遍历每个url,加入监控中心url配置,最后把每个url保存到urls。
  • 如果urls的个数是1,是单注册中心,直接引用RegistryProtocol的refer构建Invoker实例;如果urls的数量大于1,说明是多注册中心,则对每个url都生成Invoker,利用cluster.join()方法将多个Invoker进行合并成一个Invoker。
  • 最后调用proxyFactory.getProxy(invoker)方法。

然后介绍RegistryProtocol.refer(Class<T> type, URL url)方法生成invoker。

如果是注册中心服务,则直接返回注册中心服务的invoker;如果不是,则先处理组配置,根据组配置来决定Cluster的实现方式,如果有多个组,则使用MergeableCluster,然后调用doRefer(Cluster, Registry, Class, URL)方法。

然后介绍doRefer()方法。
(1) 创建一个RegistryDirectory实例,设置注册中心、协议等信息
(2) 生成服务消费者链接。
(3) 注册消费信息到注册中心。
(4) 订阅该服务下的providers、configurators、routers等节点下的数据。完成订阅后,RegistryDirectory会受到这几个节点下的子节点信息。
(5) 由于一个服务可能部署在多台服务器上,这样就会在providers产生多个节点,这个时候就需要Cluster将多个服务节点合并成一个,并生成一个Invoker.

在RegistryDirectory实现了NotifyListener接口,服务变更会触发这个类回调notify方法,用于重新引用服务。当发起订阅请求时会进行一次数据拉取操作,同时触发RegistryDirectory.nofity()方法。这是会执行toInvokers()方法进行Invoker转换。
(1) 根据消费者protocol配置过滤不匹配的协议。
(2) 合并provider端配置数据,比如服务端IP和port等。
(3) 忽略重复推送的服务列表
(4) 使用具体协议创建远程连接,new InvokerDelegate<T>(protocol.refer(serviceType, url), url, providerUrl)

具体的Invoker创建是在DubboProtocol.refer()中实现。Dubbo协议在返回DubboInvoker对象之前会初始化客户端连接对象。
调用DubboProtocol.initClient()方法 -> Exchangers.connect()方法,根据SPI机制加载HeaderExchangeClent,调用connect()方法。然后调用Transporter类的connect()方法,默认是NettyTransporter类。

public class DubboInvoker<T> extends AbstractInvoker<T> {
    private final ExchangeClient[] clients;
    private final AtomicPositiveInteger index = new AtomicPositiveInteger();
    private final String version;
    private final ReentrantLock destroyLock = new ReentrantLock();
    private final Set<Invoker<?>> invokers;
public abstract class AbstractInvoker<T> implements Invoker<T> {
    protected final Logger logger = LoggerFactory.getLogger(getClass());
    private final Class<T> type;
    private final URL url;
    private final Map<String, Object> attachment;
    private volatile boolean available = true;
    private AtomicBoolean destroyed = new AtomicBoolean(false);

相关文章

  • dubbo 学习笔记

    服务接口消费接口

  • Dubbo之服务消费

    Dubbo的服务消费主要包括两个部分。第一大步是ReferenceConfig类的init方法调用Protocol...

  • Dubbo

    Dubbo 基础 Dubbo角色 provider:服务提供方 consumer:服务消费方 registry:注...

  • 2018-06-20-dubbo基于注解配置

    1、配置springboot的dubbo服务【服务提供方】 2、dubbo接口【对外暴露的dubbo接口,方便消费...

  • dubbo-Reference注解改进

    1.dubbo服务过多引用的问题 1.1 dubbo服务以xml配置消费者 由于引用多个dubbo服务时,在未使用...

  • 如何查看Zookeeper下Dubbo的Provider与Con

    查看Zookeeper下Dubbo的服务提供者与服务消费者信息:有些场景下我们需要查看ZK下dubbo的注册和消费...

  • dubbo 小结

    dubbo soa,rpc框架 提供服务和消费端模式 简单流程 provider 注册服务到zookeper,消费...

  • 高可用

    1、zookeeper宕机与dubbo直连 现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。...

  • Dubbo服务端

    Dubbo服务端的主要功能就是服务提供端向注册中心注册服务,这样消费端能够从注册中心获取相应的服务。 Dubbo ...

  • Dubbo优雅服务降级之mock

    [Dubbo优雅服务降级之Stub][Dubbo_Stub] dubbo作为国内互联网最常用的Java开源服务治理...

网友评论

    本文标题:Dubbo之服务消费

    本文链接:https://www.haomeiwen.com/subject/gixdxhtx.html