dubbo源码解析(六)rpc模块服务调用

本文深入剖析Dubbo RPC模块的服务调用过程,从createProxy开始,详细解读refer()方法,包括doInvoke(), getClients(), initClient()以及Exchangers.connect()的实现。同时探讨join()方法和getProxy创建代理的逻辑,揭示Dubbo服务调用的核心机制。" 113753557,7768109,理解MQ:RabbitMQ的优势与架构,"['消息队列', '中间件', 'RabbitMQ', '架构', '系统稳定性']
摘要由CSDN通过智能技术生成

目录

前言  

1、createProxy()

2、refer()方法

2.1、doInvoke()方法

2.2、getClients()方法

2.3、initClient()方法

2.4、Exchangers.connect()

3、join()方法

4、getProxy创建代理


前言  

 在上面相关dubbo源码专栏中我们对dubbo rpc模块的服务发布做了分析(此处并未涉及服务注册原理和服务获取原理),这篇博文我们来分析一下dubbo rpc模块中服务调用的一次逻辑分析,首先在之前的博文dubbo源码解析(四) api配置之服务消费者 我们以api编码的形式进行了服务调用并分析了相关逻辑,最终分析聚焦到了createProxy方法 下面我们就继续该方法往后探究。

1、createProxy()

       该方法我们之前已经分析过,这次的分析是基于后面探究服务调用模块进行的入口分析,会省略部分代码

    private T createProxy(Map<String, String> map) {
        //省略本地inIvm调用、点对点调用 注册中心调用获取相关的url逻辑
        //。。。


        //1、注册中心单个 直接获取对应的Invoker(服务发布和调用的核心对象)
        if (urls.size() == 1) {
            invoker = refprotocol.refer(interfaceClass, urls.get(0));
        } else {
            //对于多个注册中心 则不同的注册中心创建一个Invoker 添加到
            List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
            URL registryURL = null;
            for (URL url : urls) {
                invokers.add(refprotocol.refer(interfaceClass, url));
                if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
                    registryURL = url; // use last registry url
                }
            }
            //2、对于多个Invoker 则通过Cluster(FailoverCluster失败重试)包装成一个Invoker
            if (registryURL != null) { // registry url is available
                // use AvailableCluster only when register's cluster is available
                URL u = registryURL.addParameter(Constants.CLUSTER_KEY, AvailableCluster.NAME);
                invoker = cluster.join(new StaticDirectory(u, invokers));
            } else { // not a registry url
                invoker = cluster.join(new StaticDirectory(invokers));
            }
        }

        //省略服务可用调用检测 如果设置 check=false 则不尽兴服务可用检测
        //。。。


        //3、创建代理对象
        return (T) proxyFactory.getProxy(invoker);
    }

上述创建代理过程可以分成三部分

  1.     通过Protocol的refer()获取对应调用对象invoker(在之前的博文中我们介绍过该对象 服务发布和服务调用都会创建该对象)
  2.    对于多注册中心还需要join()将多次创建的invoker包装成失败重试的invoker
  3.    服务调用基于invoker通过getProxy()创建代理对象供给我们调用

下面针对上面三个部分我们来分析一下

2、refer()方法

 通过dubbo的spi最终实现类为DubboProtocol的refer()方法

    public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException {
        //根据条件获取更高效的序列化机制
        optimizeSerialization(url);
        //创建rpc服务调用的Invoker对象
        //构造函数需要四个函数嗲用的接口class,dubbo对应的URL,ExchangeClient为服务远程调用底层通信的客户端
        //invokers集合 用于该invoker销毁的时候移除该invoker
        DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
        //所有创建的invoker都统一在该集合中维护
        invokers.add(invoker);
        return invoker;
    }

该方法很简单,我们需要关注是创建DubboInvoker是干什么,该类是我们进行远程调用的核心对象,其中通过ExchangeClient(底层远程通信调用),其中在远程调用过程中doInvoke()方法会通过ExchangeClient进行request请求,ExchangeClient客户端获取通过getClient

"Fail to connect: Connection refused"是一个网络连接问题,表示无法建立连接。这可能是由于以下几个原因导致的: 1. 服务器端口未开放:如果连接的是一个服务器,可能是因为该服务器的端口未开放或被阻止了,导致无法建立连接。解决方法是检查服务器端口是否正确开放,并确保网络环境没有任何阻止连接的限制。 2. 防火墙阻止连接:防火墙可能会阻止某些连接,包括对特定端口的连接。请确保防火墙设置允许建立连接。 3. 网络配置问题:网络配置错误也可能导致连接被拒绝。请确保网络连接配置正确,并且没有任何错误或冲突。 4. 服务器故障:如果连接的是一个远程服务器,可能是服务器故障导致连接被拒绝。请联系服务器管理员检查服务器状态和网络连接。 请根据具体情况逐一排查以上原因,并采取相应的解决措施来解决连接问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [mac 安装homebrew出错 Failed to connect to raw.githubusercontent.com port 443: Connection refused ...](https://download.csdn.net/download/weixin_38553837/14036890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [eclipse远程调试时出现:Failed to connect to remote VM.... Connection refused: connect](https://blog.csdn.net/u011008029/article/details/50586793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值