网站首页 > 开源技术 正文
最近被问到一个问题: 有依赖关系的两个dubbo服务。通过TCP进行连接时候,他们之间的连接是怎么控制的?怎么达到一个合理的数量?
我们从一个例子开始吧:一个订单服务 OrderService,IP为192.168.0.110 连接了商品服务 ProductService, ip 为192.168.0.111 ,其中订单服务中的方法比较多,并且很多请求也刚好路由到192.168.0.111的 ProductService 服务。那问题就来了:110机器作为客户端是怎么控制连接数的?会不会无限量地和111机器进行TCP连接?
? 我们先看一下Dubbo的官方文档对“连接控制”的说明文档 : http://dubbo.apache.org/zh-cn/docs/user/demos/config-connections.html 。
? 在xml配置方式中xml accepts="10" 和 connections="10" 分别在服务端和客户端进行了相应的连接控制。下面我们看一下源码,追一下连接控制的原理。
? 我们看一下DubboProtocol.java的创建客户端tcp连接的方法,int connectNum正是每个客户端对服务端的tcp连接数,默认是1,当然可以修改成更大。默认是1,这样一个客户端的调用service数最多也不会超过1000吧。这样就不会出现单机创建TCP连接数过多的问题。
| |
客户端和服务端是一对一的,建立长连接,那么如果客户端并发访问,他们是怎么和服务端交互的呢?
经过看代码:
下面咱们试图从代码中找到痕迹。一路追踪,我们来到这个类:com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeChannel.java,先来看看其中的request方法,大概在第101行左右:
| |
注意这个方法返回的ResponseFuture对象,当前处理客户端请求的线程在经过一系列调用后,会拿到ResponseFuture对象,最终该线程会阻塞在这个对象的下面这个方法调用上,如下:
| |
上面我已经看到请求线程已经阻塞,那么又是如何被唤醒的呢?再看一下com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.java,其实所有实现了ChannelHandler接口的类都被设计为装饰器模式,所以你可以看到类似这样的代码:
| |
现在来仔细看一下HeaderExchangeHandler类的定义,先看一下它定义的received方法,下面是代码片段:
| |
我们主要看中间的那个条件分支,它是用来处理响应消息的,也就是说当dubbo客户端接收到来自服务端的响应后会执行到这个分支,它简单的调用了handleResponse方法,我们追过去看看:
| |
熟悉的身影:DefaultFuture,它是实现了我们上面说的ResponseFuture接口类型,实际上细心的童鞋应该可以看到,上面request方法中其实实例化的就是这个DefaultFutrue对象:
| |
那么我们可以继续来看一下DefaultFuture.received方法的实现细节:
| |
留一下我们之前提到的id的作用,这里可以看到它已经开始发挥作用了。通过id,DefaultFuture.FUTURES可以拿到具体的那个DefaultFuture对象,它就是上面我们提到的,阻塞请求线程的那个对象。好,找到目标后,调用它的doReceived方法,这就是标准的java多线程编程知识了:
| |
这样我们就可以证实上图中左边的绿色箭头所标注的两点。
参考链接:https://blog.csdn.net/joeyon1985/article/details/51046548
感谢您的阅读,本文由 王欣的博客 版权所有。如若转载,请注明出处:王欣的博客(https://wangxin.io/2019/12/03/dubbo/dubbo-service-connection-count-control/)
- 上一篇: 【asp.net core】实现动态 Web API
- 下一篇: DXVK 2.1发布:支持HDR游戏
猜你喜欢
- 2024-12-01 【asp.net core】实现动态 Web API
- 2024-12-01 常用的RPC框架
- 2024-12-01 Tun/Tap接口使用指导
- 2024-12-01 网络知识大集合(最详细)与网络通信过程
- 2024-12-01 史上最全网络端口号大全
- 2024-12-01 一个WordPress漏洞所引发的INSERT注入思考
- 2024-12-01 你不要和我说Netty快速入门会很难
- 2024-12-01 Windows下net命令详解
- 2024-12-01 7种轻量级笔记软件,完美替代OneNote和Evernote
- 2024-12-01 Mysql的性能如何优化?
欢迎 你 发表评论:
- 12-15神级升级系统漫画(神级升级系统免费)
- 12-15win7只能进入安全模式进不了系统
- 12-14如何恢复已清理的文件(怎样将清理的文件恢复)
- 12-14ie80s(ie80S配多大孔径耳塞)
- 12-14win10系统手机版(win10手机版下载官方中文版)
- 12-14windows7不是什么的操作(哪些不是windows7的特点)
- 12-14戴尔外星人官网入口(戴尔外星人笔记本电脑官网)
- 12-14window7如何截图(window7截图按哪个键)
- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)

本文暂时没有评论,来添加一个吧(●'◡'●)