dubbo中单一长连接的理解和常见误区

1.低版本dubbo

dubbo默认是单一长连接,那么这个默认在哪里,长连接又是什么意思,单一长连接又是什么意思呢?

首先dubbo底层用的是netty,所以长连接说的也是通过netty创建的连接,本文主要说的是dubbo中单一长连接的概念和理解,关于netty不做更多展开。

话不多说,直接上源码:

DubboProtocol在refer的时候,也就是consumer端启动去发现服务的时候,会调用getClients方法

该方法会检查xml中配置的一个叫做connections的参数,如果用户没有配置,那么缺省配置就是0,0代表共享连接,会调用getSharedClient这个方法而不是initClient方法。getSharedClient方法中会从一个叫做referenceClientMap的连接缓存中,该缓存的key是ip+端口,value就是client,所以就做到了ip+端口唯一对应一个client,这就是单一长连接的概念——consumer端所有的dubbo服务,无论有多少个service,都共享这一个连接。

如果对于service A,connections不是0(connections是配置在service上的),用户自己配置了一个非零的值N,那么就不会走getSharedClient,而是走initClient,产生的效果就是consumer端的service A(refer A的时候),会初始化N个client。同时,对于service B,connections配置了M,那么refer B的时候,会初始化M个client。

总结一下,connections无非就是0,1和N三种配置情况,为了容易理解:

  • 0就可以记成全局配置,所有配置了0的service,每次调用都复用同一个长连接
  • 1可以理解为单个service的配置,配置1的service,对于该service的每次调用都使用同一个长连接
  • N也是单个service的配置,配置N的service,对于该service的每次调用都从这N个长连接中选一个(按照路由规则)

其实大部分文章中都描述为0和非0两种情况,这里写出三种情况,其实后两种的1和N都是非0情况,单列出1是为了方便理解,因为有些同学误解单一长连接的时候其实误解的就是1这种情况,配置了1的service其实在发起对该service调用的时候也是单一长连接,可以叫做服务级别单一长连接,但是和配置了0的全局单一长连接还是不一样的。

其实上面这个实现里还有个问题,从上面提到的connections的三种赋值方式,仔细想想我们可以看出,如果我想要全局配置,但同时这个全局共享的连接数不唯一,该怎么配置呢?是做不到的,因为全局默认代码里写死了是1,而非1的写法只能用来配置单service的共享连接数。不过新版dubbo对于这一点做了一些改动,让我们这个梦想得以实现,详情见下文。

2.社区dubbo 2.7.x

新版dubbo获取连接依然调用了DubboProtocol的getClients方法,直接上代码:

这里除了使用connections之外,同时还搭配了另外一个配置shareconnections,如果这个也不配置,那么就和旧版本一样,都是1,即1个连接。如果配置了具体值,那么就可以实现上面说的,全局所有service共享长连接,但是不是单一长连接,而是N个长连接。

Netty第二章 2020 7-4——Netty在Dubbo中的应用(3)关于单一长连接相关推荐

  1. Netty第二章 2020 3-9 Netty源码之flush优化

    1.Netty的flush优化handler--FlushConsolidationHandler Netty的实现更复杂一些,对于用单独线程池处理业务的场景,有一些特殊的处理和优化,比如如果异步处理 ...

  2. 网络协议和Netty——第二章 Java原生网络编程学习笔记

    编程中的Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说, ...

  3. 《Netty In Action》第二章:第一个Netty程序

    2019独角兽企业重金招聘Python工程师标准>>> 源码地址: GitHub 2.3 编写一个应答服务器 写一个Netty服务器主要由两部分组成: 配置服务器功能,如线程.端口 ...

  4. 数据结构与算法(C#版)第二章 C#语言与面向对象技术(中)V1.0

    由于本学期我给本科生上<数据结构与算法>这门课程,边上边把自己的教案进行总结,发到CSDN上面,希望大家多多指正. 第二章 C#语言与面向对象技术(中) 二.面向对象技术 1.类与对象 2 ...

  5. Kotlin学习笔记 第二章 类与对象 第九节 泛型

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  6. PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 面向对象的设计原则 2.1 面向对象设计的五大原则 单一职责原则 接口隔离原则 开放-封闭原则 替换原则 依赖倒置原则 ...

  7. 汇编 第二章 寄存器

    在我看来,第二章中主要围绕着6个寄存器展开阐述.它们分别是AX.BX.CX.DX.CS.IP. 在此之前,通过本章的学习,使我对CPU这一概念又有了更深一步的认识. 1.CPU中字长与位宽的区别 通常 ...

  8. [XJTUSE]计算机图形学第二章作业,使用OpenGL编程实现DDA、中点画线和Bresenham算法和中点画圆法

    首先是Windows10 + Visual Studio 2019 搭建OpenGL环境可以查看如下链接: 萌新向!!!Windows10 + Visual Studio 2019 搭建OpenGL环 ...

  9. 工程电磁场导论第二章总结

    第二章 恒定电场 2.1导电媒介中的电流 在静电场中,导体内电场强度为零,导体内部没有电荷的运动.在导电媒介中,电荷的 运动形成的电流称为传导电流.在自由空间中,电荷的运动形成的电流称为运流电流. 电 ...

最新文章

  1. 【hexo】搭建个人bolg日志 day1
  2. 第18章:MYSQL分区
  3. 技术图文:排序技术在求解算法题中的应用
  4. android-sdk-windows下载版
  5. python秒转化为时间格式_Python耗费时间秒转 天小时分钟秒 时间格式美化
  6. Redis详解(六)------ RDB 持久化
  7. e生保等待期什么意思_买了保险不知道赔什么?一文看懂【保险责任】
  8. FCM模糊聚类算法python实现
  9. android系统级浮层,android 新手引导浮层的实现
  10. 怎样复制秀米html码,秀米微信图文编辑器如何复制?
  11. vue实战项目-ego商城
  12. 剑指 Offer 04. 二维数组中的查找
  13. linux sd卡 分区变大,Linux下使用fdisk命令将高容量SD卡(SDHC)格成两个分区
  14. Oracle rtrim、to_char函数格式化数字 小数Format展示,FM999990D99
  15. 洛谷刷题C语言:闰年判断、Apples、洛谷团队系统、肥胖问题、三位数排序
  16. 模式识别技术漫谈(2)
  17. 替换空格--《剑指offer》
  18. 四万高手过招,这份阿里全球数学竞赛试题你真的不要看吗...
  19. 【Web技术】1176- 前端模块依赖关系分析与应用
  20. kdb 使用手册指导 1

热门文章

  1. 路由器和三层交换机的基本实验操作
  2. python微信群发itchat
  3. 杰洛特的Python之旅01_抓取微信性别数据在web上展现饼图
  4. c语言mfc怎么插入背景图片,MFC 对话框添加背景图片详细过程(两种方法)
  5. 从0到1:朋友圈爆款背后的计算机视觉技术与应用 | 百万人学AI
  6. 信息学奥赛一本通 1033:计算线段长度
  7. CentOS 6.x 使用包管理器安装配置Apache+PHP+MySql
  8. 程序员必知的8个Java开源IDE工具!你最钟意哪个?
  9. telnet出现端口23连接失败解决办法
  10. 每天自我提升的8个好习惯