深入理解dubbo之服务引用

本文详细探讨了Dubbo的服务引用过程,从ReferenceConfig的参数设置到Invoker的创建,强调了SPI(Service Provider Interface)在实现协议切换中的作用。通过分析`Protocol.refer`方法,揭示了如何通过动态代理生成代理类以调用远程服务。在远程调用部分,讲解了doInvoke方法的工作流程,包括参数获取、ExchangeClient交互及同步/异步调用的实现。
摘要由CSDN通过智能技术生成

在之前说了一下dubbo的服务发布过程,其实严格意义上只说了一半吧,只把dubbo如何经过ProxyFactory的代理成一个Invoker,等待客户端调用的过程讲了一遍,而重要的Protocol.export方法略过去了,今天我将连带dubbo的comsumer客户端服务引用和Protocol机制来讲一讲。

dubbo服务引用

和上一篇文章一样,先来个demo

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application  name="ifenqu-web"  />
    <dubbo:registry protocol="zookeeper" address="${dubbo.address}"  />
    <dubbo:protocol name="dubbo" port="${dubbo.port}"/>
    <dubbo:consumer timeout="60000" check="false"/>
    <dubbo:service interface="com.xxx.xxx.xxxService" ref="xxxService" timeout="5000"/>

</beans>

在上篇文章我们已经说了,对于service暴露方也就是provider方有对应的ServiceConfig,相应的Reference引用方也就是Consumer有对应的ReferenceConfig。ReferenceConfig中定义了每一个接口参数定义,这只是部分,还有一大堆参数在父类里就不列出来了。

    // 接口类型
    private String               interfaceName;

    private Class<?>             interfaceClass;

    // 客户端类型
    private String               client;

    // 点对点直连服务提供地址
    private String               url;

    // 方法配置
    private List<MethodConfig>   methods;//接口所有的方法配置

    // 缺省配置
    private ConsumerConfig       consumer;//该参数对应的就是<dubbo:consumer timeout="60000" check="false"/>

    private String               protocol;//如果为空默认dubbo

参数设值分两步,第一步是对象创建的时候,第二步是调用了get方法后执行init()方法。这个get方法就是服务引用的入口:

public synchronized T get() {
        if (destroyed){
            throw new IllegalStateException("Already destroyed!");
        }
        //服务实例已经存在就直接返回,没有就进行初始化
        if (ref == null) {
            init();
        }
        return ref;
    }

init()方法主要分为两个步骤,第一步:收集上下文,第二步:根据上下文创建服务实例
ref = createProxy(map);

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值