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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

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

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

本文中,我会通过基于高级消息队列协议(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 <container-name> qdstat -c
docker exec <container-name> qdstat -l
docker exec <container-name> qdstat -a

总结

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


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

本文作者:局长

原文链接

相关文章
|
1月前
|
消息中间件 缓存 API
|
6月前
|
监控 Cloud Native 安全
[云原生] 破局微服务通信:探索MegaEase服务网格的创新之路
[云原生] 破局微服务通信:探索MegaEase服务网格的创新之路
67 0
|
2月前
|
消息中间件 中间件 API
深入探讨微服务架构中的服务通信模式
随着微服务架构的普及,服务间的通信成为了系统设计的关键环节。本文将深入探讨微服务架构中的服务通信模式,包括同步通信和异步通信两大类,并对比其优缺点。我们还将介绍几种流行的通信技术,如REST、gRPC、消息队列等,并分析它们在实际应用中的适用场景。通过本文的阐述,读者将对微服务架构下的服务通信有一个全面而深刻的理解,为选择合适的通信模式提供指导。
|
4月前
|
消息中间件 数据挖掘 Kafka
Kafka在微服务架构中的应用:实现高效通信与数据流动
微服务架构的兴起带来了分布式系统的复杂性,而Kafka作为一款强大的分布式消息系统,为微服务之间的通信和数据流动提供了理想的解决方案。本文将深入探讨Kafka在微服务架构中的应用,并通过丰富的示例代码,帮助大家更全面地理解和应用Kafka的强大功能。
|
4月前
|
负载均衡 监控 Java
【使用OpenFeign在微服务中进行服务间通信】—— 每天一点小知识
【使用OpenFeign在微服务中进行服务间通信】—— 每天一点小知识
|
5月前
|
Kubernetes 安全 Cloud Native
Service Mesh和Kubernetes:加强微服务的通信与安全性
Kubernetes已经成为云原生应用程序的事实标准,它为容器编排和管理提供了出色的解决方案。然而,微服务架构的广泛采用使得服务之间的通信变得复杂,同时安全性和可观测性需求也在不断增加。这正是Service Mesh技术的用武之地。本文将深入探讨Service Mesh如Istio和Linkerd如何增强Kubernetes集群中微服务的通信和安全性。
|
6月前
|
Cloud Native 应用服务中间件 Go
深入解析:探索Nginx与Feign交锋的背后故事 - 如何优雅解决微服务通信中的`301 Moved Permanently`之谜!
深入解析:探索Nginx与Feign交锋的背后故事 - 如何优雅解决微服务通信中的`301 Moved Permanently`之谜!
59 0
|
6月前
|
监控 负载均衡 安全
服务网格:优化微服务通信与保障系统安全性的架构利器
服务网格:优化微服务通信与保障系统安全性的架构利器
68 0
|
7月前
|
消息中间件 Kafka Apache
在微服务中使用Apache Kafka进行异步通信
在微服务中使用Apache Kafka进行异步通信
113 0
|
9月前
|
消息中间件 微服务
微服务通信:RPC、消息队列和事件驱动架构的比较
在微服务架构中,微服务之间的通信是至关重要的。为了实现松耦合、高效可靠的通信,开发人员可以选择不同的通信方式,包括RPC(远程过程调用)、消息队列和事件驱动架构。本文将对这三种常见的微服务通信方式进行比较,探讨它们的特点、适用场景和优缺点,帮助开发人员选择合适的通信方式。
231 0