Dubbo Consumer 共享连接说明

简介:

共享连接说明

  • 在Dubbo的consumer和provider的服务引用过程中,两者之间存在多个服务引用。
  • 在consumer和provider之间建立的连接,存在共享连接和非共享连接两种情况,默认情况下使用的是共享连接。
  • 在consumer和provider之间的所有reference和service是共享的同一个连接。


共享连接

public class DubboProtocol extends AbstractProtocol {

    public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException {
        optimizeSerialization(url);
        // create rpc invoker.
        DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
        invokers.add(invoker);
        return invoker;
    }

    private ExchangeClient[] getClients(URL url) {
        // whether to share connection
        boolean service_share_connect = false;
        int connections = url.getParameter(Constants.CONNECTIONS_KEY, 0);
        // // 如果是共享连接
        if (connections == 0) {
            service_share_connect = true;
            connections = 1;
        }

        ExchangeClient[] clients = new ExchangeClient[connections];
        for (int i = 0; i < clients.length; i++) {
            // 如果存在共享连接则访问通过getSharedClient()返回共享连接
            if (service_share_connect) {
                clients[i] = getSharedClient(url);
            } else {
                clients[i] = initClient(url);
            }
        }
        return clients;
    }

    private ExchangeClient getSharedClient(URL url) {
        String key = url.getAddress();
        // 如果存在共享连接且连接可用则直接返回
        ReferenceCountExchangeClient client = referenceClientMap.get(key);
        if (client != null) {
            if (!client.isClosed()) {
                client.incrementAndGetCount();
                return client;
            } else {
                referenceClientMap.remove(key);
            }
        }

        locks.putIfAbsent(key, new Object());
        synchronized (locks.get(key)) {
            if (referenceClientMap.containsKey(key)) {
                return referenceClientMap.get(key);
            }

            ExchangeClient exchangeClient = initClient(url);
            client = new ReferenceCountExchangeClient(exchangeClient, ghostClientMap);
            referenceClientMap.put(key, client);
            ghostClientMap.remove(key);
            locks.remove(key);
            return client;
        }
    }
}
  • 在refer过程中首先判断是否使用共享连接,如果决定使用共享连接那么就判断是否已存在未关闭的连接,如果存在那么就直接返回共享连接,如果不存在那么就创建一个连接并返回。
目录
相关文章
|
9月前
|
负载均衡 监控 Dubbo
Dubbo连接注册中心和直连的区别
Dubbo连接注册中心和直连的区别
169 0
|
Dubbo Java 应用服务中间件
Dubbo新版本zk注册中心连接问题
目录 一、使用zkclient作为zk连接客户端问题 1、Maven依赖如下 2、服务提供者配置文件 3、启动服务提供者 4、原因分析 5、解决办法 (1)降低dubbo版本 (2)添加ZookeeperTransporter拓展实现 二、使用curator作为zk连接客户端版本问题 1、Maven依赖如下 2、服务提供者配置文件 3、启动服务提供者 4、curator作为zk连接客户端可行依赖 三、总结
Dubbo新版本zk注册中心连接问题
|
开发框架 Dubbo 应用服务中间件
《Dubbo 如何成为连接各种异构微服务体系的服务开发框架》电子版地址
Dubbo 如何成为连接各种异构微服务体系的服务开发框架
75 0
《Dubbo 如何成为连接各种异构微服务体系的服务开发框架》电子版地址
|
开发框架 Dubbo Cloud Native
Dubbo 如何成为连接异构微服务体系的最佳服务开发框架
从编程开发的角度来说,Dubbo 首先是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节。同时 Dubbo 也是一款服务治理框架,它为分布式部署的微服务提供了服务发现、流量调度等服务治理解决方案。 在这篇文章中,我们将以以上基础能力为背景,尝试突破 Dubbo 体系自身,探索如何利用 Dubbo 对多协议、多服务发现模型的支持,来实现
154 0
Dubbo 如何成为连接异构微服务体系的最佳服务开发框架
|
存储 Dubbo 应用服务中间件
Dubbo Consumer 发送请求
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Consumer 发送请求的执行过程。
|
Dubbo Java 应用服务中间件
Dubbo Consumer 接收返回值
在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Consumer 接收返回值的执行过程。
|
Dubbo Java 应用服务中间件
Dubbo02【搭建provider和consumer】
本文来给大家介绍下基于Spring配置的方式来搭建dubbo中的服务提供端和消费端 provider和consumer的搭建
Dubbo02【搭建provider和consumer】
|
开发框架 Dubbo Cloud Native
Dubbo 如何成为连接异构微服务体系的最佳服务开发框架
在这篇文章中,我们将以以上基础能力为背景,尝试突破 Dubbo 体系自身,探索如何利用 Dubbo 对多协议、多服务发现模型的支持,来实现异构微服务体系间的互联互通。在实际业务场景中,这可以用来解决异构技术体系共存场景下的通信问题,帮助公司实现在异构技术体系间作平滑迁移,解决大规模跨区域、多集群部署场景的地址发现及流量调度等问题。
Dubbo 如何成为连接异构微服务体系的最佳服务开发框架
|
测试技术 Arthas Java
Dubbo consumer代理创建流程
开篇  这篇文章目的是为了将consumer在引用producer的过程中创建代理的细节。 Reference创建代理过程 public class ReferenceConfig<T> extends AbstractReferenceConfig { private T creat...
1088 0

热门文章

最新文章