基于 RocketMQ 的 Dubbo-go 通信新范式

简介: RocketMQ 新功能尝鲜!让 Dubbo-go 通过 RocketMQ 进行 RPC 通信来扩展 Dubbo-go 的通信方式,利用 Dubbo-go 丰富的服务治理能力和 RocketMQ 稳定的 RPC 通信能力,两者强强联合,打造 RPC 通信新范式。

本文作者:郝洪范 ,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 的通信能力已经开发完毕,正在测试中,很快能与大家见面。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6月前
|
安全 Go 数据处理
Go语言CSP编程实战:通道通信技术
Go语言CSP编程实战:通道通信技术
93 0
|
19天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
44 2
|
3月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
82 0
|
22天前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
2月前
|
Dubbo 应用服务中间件 Apache
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
在 Apache Dubbo 突破 4w Star 之际,Apache Dubbo 团队正式宣布,Dubbo 3.3 正式发布!作为全球领先的开源微服务框架,Dubbo 一直致力于为开发者提供高性能、可扩展且灵活的分布式服务解决方案。此次发布的 Dubbo 3.3,通过 Triple X 的全新升级,突破了以往局限,实现了对南北向与东西向流量的全面支持,并提升了对云原生架构的友好性。
132 11
|
2月前
|
消息中间件 Kafka 数据安全/隐私保护
RabbitMQ异步通信详解
RabbitMQ异步通信详解
88 16
|
3月前
|
JSON Dubbo Java
【Dubbo协议指南】揭秘高性能服务通信,选择最佳协议的终极攻略!
【8月更文挑战第24天】在分布式服务架构中,Apache Dubbo作为一款高性能的Java RPC框架,支持多种通信协议,包括Dubbo协议、HTTP协议及Hessian协议等。Dubbo协议是默认选择,采用NIO异步通讯,适用于高要求的内部服务通信。HTTP协议通用性强,利于跨语言调用;Hessian协议则在数据传输效率上有优势。选择合适协议需综合考虑性能需求、序列化方式、网络环境及安全性等因素。通过合理配置,可实现服务性能最优化及系统可靠性提升。
52 3
|
6月前
|
网络协议 Java Go
【Go语言专栏】Go语言中的WebSocket实时通信应用
【4月更文挑战第30天】Go语言(Golang)是Google开发的编程语言,适用于云计算、微服务等领域。本文介绍了WebSocket,一种实现浏览器与服务器全双工通信的协议,其特点是实时性、全双工和轻量级。在Go中实现WebSocket,可以使用gorilla/websocket库。示例展示了如何创建服务器端和客户端,实现消息的收发。WebSocket广泛应用于聊天、游戏、通知推送和实时数据同步等场景。学习Go语言中的WebSocket对于开发实时通信应用至关重要。
222 0
|
3月前
|
物联网 C# Windows
看看如何使用 C# 代码让 MQTT 进行完美通信
看看如何使用 C# 代码让 MQTT 进行完美通信
535 0