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

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

1.低版本dubbo

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

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

话不多说,直接上源码:

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

Netty第二章 2020 7-4——Netty在Dubbo中的应用(3)关于单一长连接_第1张图片

该方法会检查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方法,直接上代码:

Netty第二章 2020 7-4——Netty在Dubbo中的应用(3)关于单一长连接_第2张图片

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

你可能感兴趣的:(java)