学会 RabbitMQ 代理的连接,是一种怎样的体验?,mongodb 教程
spring:
rabbi tmq:
host: 192.168.99.100
port: 5672
默认情况下,Spring Cloud Stream 会为通信创建主题交换信息。这种类型的交换更适合发布/订阅交互模型。开发人员也可以使用 exchangeType 属性覆盖它,就像在 application.yml 的片段中一样,如下所示。
spring:
cloud:
stream:
rabbit:
bindings:
output:
producer:
exchangeTyper direct
input:
consumer:
exchangeType: direct
开发人员应该为 order-service 服务和 account-service 服务提供相同的配置设置。这里不必手动创建任何交换信息。如果它不存在,则它会在启动期间由应用程序自动创建。否则,应用程序只会绑定到该交换信息。默认情况下,它创建交换信息时所使用的名称,对于 @Input 通道就是输入的名称,对于 @Output 通道就是输出的名称。这些名称可以用 spring .cloud.stream.bindings. output.destination 和 spring.cloud.stream.bindings.input.destination 属性覆盖,其中的输入和输出都是通道的名称。此配置选项不仅是 Spring Cloud Stream 功能的“个很好的补充,而且是用于关联服务间通信中的输入和输出目标的键值设置。
![](https://static001.geekbang.org/infoq/63/63209ecb8a67ea31f0dad8613443d74e.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
要解释为什么会发生这种情况也非常简单。在我们的示例中,一方面, order-service 是消息源应用程序,因而它会将消息发送到输出通道。然后,另一方面,account-service 服务将侦听输入通道上的传入消息。如果 order- service 服务的输出通道和 account-service 服务的输入通道未引用代理上的相同目标,则它们之间的通信将失败。总之,我们决定使用名称为 order-out 和 orders-in 的目的地,并且为 order-service 服务提供了以下配置。
spring:
cloud :
stream:
bindings :
output:
destination: orders -out
input :
destination: orders-in
account- service 服务的类似配置设置则刚好相反。
spring:
cloud:
stream:
bindings:
output:
destination: orders-in
input :
destination: orders-out
在两个应用程序都启动之后,可以使用其 Web 管理控制台轻松查看 RabbitMQ 代理上声明的交换列表,该控制台位于 htp://192.68.99.100:15672 (guestguest) 。如图 11.2 所示的是隐式创建的交换信息(Exchange),开发人员可能会看到出于测试目的创建的两个目标。
![](https://static001.geekbang.org/infoq/fc/fc33785550575f0e79a13356ecca453f.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
默认情况下,Spring Cloud Stream 将提供一个输入和一个输出消息通道。可以想象一种情况,即我们的系统需要为每种类型的消息通道提供多个目的地。现在可以回到示例系统架构,并考虑每个订单由另外两个微服务异步处理的情况。到目前为止,只有 account-service 服务一直在监听来自 order-service 服务的传入事件。在当前示例中,product-service 服务将是传入订单的接收者,它在这种情况下的主要目标是管理可用产品的数量,并根据订单细节减少它们。它要求我们在 order-service 服务中定义两个输入和输出消息通道,因为我们仍然有基于直接 RabbitMQ 交换信息的点对点通信,其中每个消息都可以由一个使用者处理。
![](https://static001.geekbang.org/infoq/3f/3f63151bbfa3d8542cb71f31db3759e6.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
在这种情况下,我们应该使用 @Input 和 @Output 方法声明两个接口。每个方法都必须返回一个 channel 对象。Spring Cloud Stream 提供两个可绑定的消息组件一用于出站通信的 MessageChannel,以及它的扩展——用于入站通信的 SubscribableChannel.这是与 product-service 服务交互的接口定义。已创建用于通过 account-service 服务进行消息传递的类似接口。
public interface ProductOrder {
@Input
SubscribableChannel productordersIn() ;
@output
MessageChannel productOrdersOut() ;
}
下一步是通过使用 @EnableBinding(value- {Accountrder.as,Productorder.cass})来注解其主类以激活应用程序的声明组件。现在,可以使用它们的名称在配置属性中引用这些通道,如 sringcloudstream.bindings.productOrdersOut.destination- product-orders-in。使用 @Input 和 @Output 注解时,可以通过指定通道名称来自定义每个通道名称,示例如下。
public interface Productorder {
@Input ("productordersIn")
SubscribableChannel ordersIn() :
@output ("productordersOut")
MessageChannel ordersOut() ;
}
基
于自定义接口声明,Spring Cloud Stream 将生成实现该接口的 bean.但是,仍然必须在负责发送消息的 bean 中访问它。与前面的示例相比,直接注入绑定通道会更简便。以下是当前产品订单消息发送者的 bean 实现。还有一个类似的 bean 实现,它可以将消息发送到 account-service.
@Service
public class ProductorderSender {
@Autowired
private MessageChannel output;
@Autowired
public. SendingBean (@Qualifier ("productordersout") MessageChannel
output) {
this.output = output ;
}
public boolean send(order order) {
return this . output . send (MessageBui lder。withPayload (order) . build());
? ? }
评论