Dubbo RPC只要一个长连接就可以收发所有请求,为什么Spring Cloud不行?

Dubbo RPC使用dubbo协议只需要一个长连接就可以收发所有请求,为什么使用http协议的Spring Cloud即便使用长连接也需要连接池呢?

http协议是一种同步应答的交互模式的应用层协议。就是客户端向服务端建立连接后,向服务端发起请求时,客户端必须要阻塞当前连接等到服务端响应,即便使用NIO。

如果你用一个Chanel向服务端发送一个http请求,没等服务端响应,你又用Chanel向服务端发送另一个请求,那服务端响应的结果客户端就没办法知道对应是哪个请求的响应。因此客户端必须同步阻塞等待,除非客户端不需要响应结果。

(图片来源CSDB博客:https://blog.csdn.net)

但dubbo协议、以及我们自定义的协议为什么可以只用一个长连接处理接收和发送所有请求?原因很简单,dubbo协议会为每个请求数据包设置一个不会重复的id,并且用一个Map存储id对应的Future,让发起调用的线程阻塞等待结果。服务端在响应数据包时,将请求id回写到数据包,客户端的单一长连接在接收到响应数据包时,根据请求id从Map中获取Future并写入值、将阻塞等待的发请调用的线程唤醒。

http协议可以实现吗?可以是可以,但一个巴掌拍不响,你得要服务端配合才行。就是客户端在发送请求时,在请求头加一个标志请求id,服务端响应时将此id也写到响应头。如果服务端漏掉将这个请求id回写到响应头,那么客户端就永远也拿不到服务端的响应。不在协议约定之内的就不好去实现。

dubbo客户端只配一个长连接为什么可以处理这么多的请求,除上述原因外,长连接只负责发送和接收消息,如果使用netty,那么这个长连接绑定的线程还负责处理编码和解码,dubbo协议(Dubbo源码,详解dubbo协议数据包及解包过程)的固定长度的请求头,解码方面自然效率比解码http协议(Netty源码,详解Http协议的数据包解码过程)要高。如果数据包很小,编码解密所花费的时间几乎可以忽略不计。理论上,只要网络带宽足够,一个长连接可以并发处理发送和接收大量的请求。

dubbo适用于小数据量(数据包小)大并发(高并发)的服务调用,以及服务消费者机器数远大于服务提供者机器数量的场景,特别是接口响应耗时短的场景,但不适用于传输大数据的服务调用。

本文分享自微信公众号 - Java艺术(javaskill),作者:wujiuye

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值