可以使用多种方法来建立系统之间的通信。在Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions中,有人指出,作者成功地记录了系统之间如何通信的65种方法(请阅读:https://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html)。
本文将包含一个简单的实施说明,以使用兔子MQ进行系统(服务)之间的通信,其中每种服务都是使用PHP编程语言创建的。
案例研究
曾经,在公司信息技术生态系统中,有3种由付款服务,物流服务和通知服务组成的服务。这三个服务能够以两种方式相互通信,即使用API呼叫和消息传递。这三个服务专门用于消息传递,使用RabbitMQ作为消息经纪。
在本案例研究中,每次通过携带用户提供的付款信息进行验证付款时,付款服务将作为消息发送者(发布者)。
其他两项服务将充当发行商的消费者和付款服务,而不需要知道两个服务将采取什么行动。
另一方面,除了仅在付款服务互动时充当消费者之外,物流服务也可以在每次物流软件包在用户收到之前到达某个检查站时向通知服务发送消息。
简单地说,可以得出结论;
- 付款服务作为出版商,
- 通知服务充当消费者,
- Logistic-Service充当消费者和出版商。
技术堆栈
- RabbitMQ Management Image
- PHP:7.4-cli Image
- PHP Framework-X
- PHP library php-amqplib
- PHP library bunny
- php扩展插座和AMQP
配置兔子
RabbitMQ除了使用API调用以外的其他需要进行交互时,RabbitMQ将充当消息代理。我们将建立有关RabbitMQ的一些内容,以便每个服务和RabbitMQ都能正确交流。
交换器
可以将交换器视为每个可用队列的消息分销商。简而言之,每种服务都不需要拥有自己的“逻辑”来路由发送消息的路由。每项服务都可以与此交换器进行通信。每个服务都将拥有自己的交换器,将用作消息分销商。
队列
队列是一系列数据集,该数据将直接由消费者消费。传入数据是由相关交易所分发的数据。用作消费者的每种服务都必须以后“聆听”与其中的功能相关的队列。
将实现的配置的描述如下;
测试通信
所有与本文相关的源代码可以在存储库https://github.com/Mhakimamransyah/php-long-connection-messaging中下载。
测试与批准付款方案有关的通信,我们可以在付款服务中获得批准终点。
curl --location 'http://127.0.0.1:8001/api/v1/approval' \
--form 'id="12345"' \
--form 'type="VIRTUAL-ACCOUNT"' \
--form 'price="400000"' \
--form 'approved-by="system"' \
--form 'bank="BCA"'
查看其他两个服务是否已成功收到付款信息,我们可以输入每个服务的容器,并通过日志查看响应。
要通过物流服务测试通信,我们可以点击端点软件包。
curl --location --request PUT 'http://127.0.0.1:8003/api/v1/packages' \
--form 'tracking-number="12345"' \
--form 'status="delivering"' \
--form 'checkpoint="Palembang"'
因此,我对本教程的简要分享。另一场合见。
https://github.com/Mhakimamransyah
https://www.linkedin.com/in/hakim-amr/
Mailto:m.hakim.amransyah.hakim@gmail.com