使用 AMQP 和 Vert.x 实现微服务间的异步通信

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介:

微服务是大多数新型现代软件解决方案中的首选架构。它们(大多数)被设计成去做一件事,它们必须相互协作去完成业务用例。微服务之间的所有通信都是通过网络呼叫进行的;这种模式避免了服务之间的紧耦合而且提供了更好的模块分离。

这里基本上有两种通信方式:同步和异步。正确应用这两个方式是请求-回复和事件驱动模式的基础。在请求-回复模式中,客户端初始化一个请求,并且通常同步等待回复。然而,有些情况下,客户端可以不等待并向另一方注册回调,这是异步方式的请求-回复模式的一个例子。

本文中,我会通过基于高级消息队列协议(AMQP)的两个微服务之间的通信来展示异步方式的请求-回复过程。AMQP是应用程序或组织之间传递业务消息的开放标准。虽然本文的重点在于介绍请求-回复模式,但是同样的代码也可用于开发其它情况,比如事件风暴。使用异步模型通信对于实现聚合模式是非常有益的。

我会使用Apache QPid Proton(或Red Hat AMQ Interconnect)作为消息路由器和使用Vert.x AMQP桥接器,用于两种服务之间的通信。

解决方案组件

演示有三个部分:

1.前端:这是一个用Java编写的服务,此服务提供了一个HTTP端点来接收来自客户端的调用。收到请求后,前端服务将调用指令发送到QPid路由器并注册应答处理程序。当响应可用时,Vert.x AMQP桥将调用回复处理程序。代码库中的前端文件夹托管此项目。

2.QPid路由器:前端进程执行调用并发布一条消息给QPid队列。Vert.x自动负责添加correlationId作为message属性,以识别对原始请求的响应。

3.后端:后端组件侦听来自QPid路由器的呼叫中的消息,处理它(例如,在数据库中进行计算或持久化),并将响应发送回QPid路由器。然后,QPid路由器将通过响应通知前端组件。代码库中的后端文件夹托管此项目。

消息流

1.跨不同组件的消息的基本流程如下。可在此处找到此流程的完整详细信息以及相关标头。

2.前端服务将向QPid服务器发送消息并提供回复处理程序。Vert.x自动填充请求 - 回复通信所需的标头。

3.接收后端服务应用程序,处理该消息并将回复发送回QPid服务器。Vert.x填充请求 - 回复通信所需的标头。

QPid服务器将回复消息分派给前端服务的回复处理程序。Vert.x网桥自动处理回复处理程序的调用。

如何运行示例:快速开始

通过发出以下命令,您可以使用Docker Compose文件来运行本例的所有三个组件:

docker-compose up

如何运行示例: 困难的方式

本节概述如何单独运行每个组件。你需要下面的软件在你的笔记本电脑上运行它们。

  1. Docker (执行Apache Qpid路由器)

  2. Open JDK 8 (要编译前端和后端服务组件)

  3. Maven 3.2 (两个服务都使用Maven)

  4. Vegeta 作为HTPP客户端(或者您可以使用您最喜欢的工具)

执行

  • 使用下面的命令启动本地的QPid路由器:

    docker run -it -p 5672:5672 ceposta/qdr

  • 编译并执行前端服务:

    cd frontend 
    mvn clean install
    java -jar target/frontend-service-full.jar

  • 编译并执行后端服务:

    cd backend 
    mvn clean install
    java -jar target/backend-service-full.jar

测试

Vegeta是一种用于HTTP负载测试的开源工具,可用于将请求发布到前端组件。

echo "GET http://localhost:8080/" | ./vegeta attack -duration=60s -rate=50 | tee results.bin | ./vegeta report

验证消息数目及延时

QPid,作为服务之间通信的异步集线器,提供了超快骨干。一旦完成应用程序测试之后,你可以使用其IMAGE ID登录QPid路由的Docker容器,并运行qdstat以查看各种指标

docker exec  qdstat -c
docker exec  qdstat -l
docker exec  qdstat -a

总结

Apache QPid为微服务之间的通信提供了一个超快的主干通讯。由于 AMQP 是一种线级协议,在其他栈(如.net)中编写的服务也可以使用相同的通信通道。Java 开发人员可以使用 Vert.x AMQP birdge 工具轻松实现基于 amqp 的异步服务间通信模式。


本文来自云栖社区合作伙伴“开源中国”

本文作者:局长

原文链接

相关文章
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
69 2
|
4月前
|
消息中间件 监控 网络协议
构建高效微服务通信:选择合适的通信方式
构建高效微服务通信:选择合适的通信方式
|
4月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
89 0
|
5月前
|
消息中间件 Kafka 微服务
微服务数据问题之MetaQ设置同步异步刷盘如何解决
微服务数据问题之MetaQ设置同步异步刷盘如何解决
|
5月前
|
消息中间件 存储 微服务
微服务数据问题之异步刷盘如何解决
微服务数据问题之异步刷盘如何解决
|
3月前
|
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 的全新升级,突破了以往局限,实现了对南北向与东西向流量的全面支持,并提升了对云原生架构的友好性。
152 10
|
3月前
|
存储 安全 API
微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。
64 3
|
3月前
|
存储 安全 API
微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。如果没有适当的安全机制,微服务系统可能会暴露在各种网络攻击和安全漏洞中。
48 4
|
3月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
54 5
|
4月前
|
消息中间件 Java 网络架构
AMQP与微服务架构的集成策略
【8月更文第28天】在微服务架构中,各个服务通常通过HTTP/REST、gRPC等协议进行交互。虽然这些方法在很多场景下工作得很好,但在需要高并发、低延迟或需要处理大量消息的情况下,传统的同步调用方式可能无法满足需求。此时,AMQP作为异步通信的一种标准协议,可以提供一种更为灵活和高效的消息传递机制。
39 1