zoukankan      html  css  js  c++  java
  • dubbo学习(二)链接

    链接有哪几种类型?有什么作用?

    dubbo的链接有2类,第一类是共享链接。consumer&每一个provider实例有一个多服务共享的链接。第二类是独享链接,consumer&每一个provider实例的每一个暴露的服务有独立的链接。

    在初始化client时,会根据是否配置connections来决定链接是哪一类。

    参考代码DubboProtocol:

        private ExchangeClient[] getClients(URL url) {
            // whether to share connection
    
            boolean useShareConnect = false;
    
            int connections = url.getParameter(CONNECTIONS_KEY, 0);
            List<ReferenceCountExchangeClient> shareClients = null;
            // if not configured, connection is shared, otherwise, one connection for one service
            if (connections == 0) {
                useShareConnect = true;
    
                /*
                 * The xml configuration should have a higher priority than properties.
                 */
                String shareConnectionsStr = url.getParameter(SHARE_CONNECTIONS_KEY, (String) null);
                connections = Integer.parseInt(StringUtils.isBlank(shareConnectionsStr) ? ConfigUtils.getProperty(SHARE_CONNECTIONS_KEY,
                        DEFAULT_SHARE_CONNECTIONS) : shareConnectionsStr);
                shareClients = getSharedClient(url, connections);
            }
    
            ExchangeClient[] clients = new ExchangeClient[connections];
            for (int i = 0; i < clients.length; i++) {
                if (useShareConnect) {
                    clients[i] = shareClients.get(i);
    
                } else {
                    clients[i] = initClient(url);
                }
            }
    
            return clients;
        }

    在具体执行时,如果有多个链接,会循环使用。

    参考DubboInvoker:

        @Override
        protected Result doInvoke(final Invocation invocation) throws Throwable {
            RpcInvocation inv = (RpcInvocation) invocation;
            final String methodName = RpcUtils.getMethodName(invocation);
            inv.setAttachment(PATH_KEY, getUrl().getPath());
            inv.setAttachment(VERSION_KEY, version);
    
            ExchangeClient currentClient;
            if (clients.length == 1) {
                currentClient = clients[0];
            } else {
                currentClient = clients[index.getAndIncrement() % clients.length];
            }
     
    ......
    }

    当声明consumer or reference时,标注了connections的会创建多个独享的链接。该值如果为0,则会基于provider的地址值创建共享的链接。

    默认情况下,consumer&每个provider之间都只有一个共享的链接。但是如果存在不同服务的报文大小差别很大(比如有些请求报文十几KB,有些不到1KB),可以使用独享链接,降低网络IO对QPS的影响。

    如果报文大小基本差不多,响应也很迅速,瓶颈不再网络而在服务端并发处理能力的情况下, 共享链接就足够用。

    共享链接也可以配置多个,配置项在consumerConfig中,为:shareconnections。

  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/asfeixue/p/13795189.html
Copyright © 2011-2022 走看看