dubbo 服务消费者实现原理

本文详细介绍了Dubbo服务消费者的实现原理,从dubbo:reference作为FactoryBean开始,逐步讲解了如何创建实例、转换为Invoker,以及如何通过RegistryProtocol进行服务引用。核心过程涉及到RegistryDirectory的subscribe方法,首次订阅时会从注册中心拉取全量服务数据。
摘要由CSDN通过智能技术生成

RPC 的整体消费原理是

dubbo服务消费原理

dubbo:reference 被解析为FactoryBean, 所以在 spring容器刷新的最后一步

beanFactory.preInstantiateSingletons();

会通过 object = factory.getObject(); 创建实例, 从而调到 ReferenceBean#getObject方法,然后调用到createProxy 方法
在createProxy 方法中完成了转换为Invoker 和将Invoker转换为对应接口的操作
REF_PROTOCOL 是Protocol的自适应实现, 此时 registry://xxx , 所以会执行RegistryProtocol 的 refer方法

private static final Protocol REF_PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

private T createProxy(Map<String, String> map) {
   
        // ..... 省略了本地消费的,和属性获取等操作
        
            if (urls.size() == 1) {
   
            // 单注册中心时
                invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));
            } else {
   
            // 多注册中心
                List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
                URL registryURL = null;
                for (URL url : urls) {
   
                    // For multi-registry scenarios, it is not checked whether each referInvoker is available.
                    // Because this invoker may become available later.
                    invokers.add(REF_PROTOCOL.refer(interfaceClass, url));

                    if (UrlUtils.isRegistry(url)) {
   
                        registryURL = url; // use last registry url
                    }
                }

                if (registryURL != null) {
    // registry url is available
                    // for multi-subscription scenario, use 'zone-aware' policy by default
                    String cluster = registryURL.getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME);
                    // The invoker wrap sequence would be: ZoneAwareClusterInvoker(StaticDirectory) -> FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker
                    invoker = Cluster.getCluster(cluster, false).join(new StaticDirectory(registryURL, invokers));
                } else {
    // not a registry url, must be direct invoke.
                    String cluster = CollectionUtils.isNotEmpty(invokers)
                            ?
                            (invokers.get(0).getUrl() != null ? invokers.get(0).getUrl().getParameter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值