本文作者:郝洪范,Dubbo-go Committer,京东资深研发工程师。
一、MQ Request Reply 个性介绍
什么是 RPC 通信?
如上图所示,相似于本地调用,A 服务响应调用 B 服务的 helloworld 办法须要怎么做?首先,A 服务的 Client Sub 收到函数调用后,会将调用办法以及参数序列化。Client Sub 通过 socket 将音讯发送到服务端。服务端 B 接管到申请后,会依照协定将 request body 进行反序列化,获取将要调用的函数名以及参数。服务端调用该函数并获取到返回后果,Server Stub 将后果进行序列化后通过 socket 发送到 Client Sub,由 Client Sub 依照协定将音讯反序列化,失去最终后果。
而实际上 RPC 框架会比以上流程更加简单,还需思考服务重试、熔断、backup、request、路由负载平衡等。
如何利用 MQ 进行 RPC 通信?原理很简略,用 MQ 作为通信管道,模仿全双工通信。
如图所示,客户端 A 想要调用服务端 B 的 helloworld 办法须要怎么做?首先,客户端会将函数名字以及参数进行序列化,发送到 MQ Broker。MQ 消费者生产到该音讯后,会调用本地函数 helloworld,获取到后果后再将后果发送到 MQ Broker,MQ Broker 依照某种约定将响应后果发送到之前申请的 client 上。
以上流程齐全为模仿 TCP 通信流程。RocketMQ 4.6.0 分支也开始反对此个性——Request Reply。
上图为 Request Reply 实现原理。
Producer 创立 RequestFutureTable,producer 发动函数调用时,会将函数调用发送到 Broker 同时将该申请记录发送到 RequestFutureTable 中。Consumer 收到音讯后,会调用本地函数将后果序列化返回给 Broker,同时返回给 Broker 特定的 request reply topic,附带返回的还有 producer。Broker 获取到这些信息后,被动将音讯发送到之前申请的 producer 上,producer 收到音讯后会从 RequestFutureTable 中核查是否存在此申请,而后整实现整个 RPC 过程。
MQ 尽管能用来模仿 RPC 的全双工通信,但须要付出肯定代价:
- 应用 MQ 后,一次 TCP 被拆解为四次,耗时减少,RPC 性能升高。
- 音讯从 producer 发送到 Broker 再发送到 consumer,减少了消息传递的复杂性。
- MQ 会将音讯落盘,进一步升高 RPC 的吞吐能力。
- RPC 通信重大依赖 MQ 的运维能力,MQ 容易成为性能瓶颈。
- MQ 稳定性的保护老本远比 RPC 简单。
综合思考,应用 MQ 进行 RPC 通信不适宜对接口耗时十分敏感的场景,然而任何技术都有其适合的利用场景,MQ 进行 RPC 通信也有其独特的妙用。
比方能够让 RPC 运行在相似于音讯总线中,便于所有音讯在对立入口进行音讯的落盘审计。利用 MQ 的重试个性,可能保障所有申请都不会失落。同时所有申请都运行在 RocketMQ 中,音讯申请的安全性失去进一步提高。
以上个性使得 MQ RPC 通信特地适宜音讯安全性审查严格的场景,比方金融和银行场景,此类场景对接口时延要求不高,但对申请的安全性要求特地高。比方微众银行就利用 RocketMQ 的 request reply 个性构建了整个金融产品的 RPC 框架。
二、Dubbo-go 介绍
Dubbo-go 是一款高性能的 go 语言微服务 RPC 框架,指标是打造新一代微服务基础设施,实现 Bridging The Gap Between X And Go,即便得 Dubbo-go 能与任何框架进行通信。
Dubbo-go 的框架的劣势有以下几点劣势:
- 开发者能够应用 Dubbo-go 框架轻松构建 RPC 服务
- 能够体验 Dubbo-go 弱小的服务治理能力与运维能力。
- Dubbo-go 的生态也在丰盛中,比方 pixiu 网关曾经能够在生产环境中应用。
- Dubbo-go 的社区活跃度十分高,只有提交 issue,马上会有人进行跟进。
Dubbo-go 由四局部组成,别离是 registry(注册核心)、consumer(客户端)、provider(服务端)、Monitor(Dubbo-go 的管制面)。客户端发动申请时,会首先从 register 获取客服务端的服务列表,而后通过对应的负载平衡获取到服务端,两者建设起 socket 进行通信。
Dubbo-go 生态正在一直疾速倒退中。目前,Dubbo-go 能与 gRPC、Spring Cloud、Dubbo、Java 进行通信,同时积淀了 Dubbo-go 网关我的项目等,曾经有公司在理论生产中应用。
RocketMQ 社区与 Dubbo-go 社区联合推出了新性能,让 Dubbo-go 通过 RocketMQ 进行 RPC 通信来扩大 Dubbo-go 的通信形式。利用 Dubbo-go 丰盛的服务治理能力和 RocketMQ 稳固的 RPC 通信能力,两者强强联合,打造 RPC 通信新范式。
Dubbo-go 通过 RocketMQ 进行通信的流程如下:Dubbo-go client 利用 request reply 个性将音讯发送的 RocketMQ 的 Broker。Dubboserver 生产到 RocketMQ 的音讯后,同样利用 RocketMQ 的 request reply 个性将音讯返回到 Broker。Broker 将音讯推送到发送音讯的 Dubbo client 上。整个流程与 MQ 进行 RPC 通信的统一。
Dubbo-go 服务注册流程如下:首先 RocketMQ Broker 会向 nameserver 注册 Broker、topic、queue 等信息。Dubbo-go client 会从 nameserver 中拉取路由信息,Dubbo-go server 订阅 topic 信息。
Dubbo-go 的通信协议目前可能反对 Dubbo、Triple、gRPC、Rest。因为 Dubbo-go 要利用 RocketMQ 进行通信,咱们须要构建新的通信协议,曾经根本设计结束,可能让 RocketMQ 与 Dubbo-go 完满交融。整个序列化协定。
自身 Dubbo-go 可能反对 Python2、JSON、Protobuf 和 MsgPack,Dubbo-go 利用 RocketMQ 进行通信同样可能反对以上四种序列化协定,但次要应用 Protobuf,另外的三种协定根本作为裁减来应用。
利用 RocketMQ 承载 Dubbo-go 的通信能力曾经开发结束,正在测试中,很快能与大家见面。