微服务是大多数新型现代软件解决方案中的首选架构。它们(大多数)被设计成去做一件事,它们必须相互协作去完成业务用例。微服务之间的所有通信都是通过网络呼叫进行的;这种模式避免了服务之间的紧耦合而且提供了更好的模块分离。
这里基本上有两种通信方式:同步和异步。正确应用这两个方式是请求-回复和事件驱动模式的基础。在请求-回复模式中,客户端初始化一个请求,并且通常同步等待回复。然而,有些情况下,客户端可以不等待并向另一方注册回调,这是异步方式的请求-回复模式的一个例子。
本文中,我会通过基于高级消息队列协议(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
如何运行示例: 困难的方式
本节概述如何单独运行每个组件。你需要下面的软件在你的笔记本电脑上运行它们。
Docker (执行Apache Qpid路由器)
Open JDK 8 (要编译前端和后端服务组件)
Maven 3.2 (两个服务都使用Maven)
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 的异步服务间通信模式。
本文来自云栖社区合作伙伴“开源中国”
本文作者:局长