Spring 可以将 Boot 配置为使用 RabbitMQ RPC 同时充当客户端和服务器(网状拓扑)吗?
Can Spring Boot be configured to act as both client and server (mesh topology) with RabbitMQ RPC?
我有 2 个使用 spring 引导开发的应用程序:
应用程序 1:
- 为 app2 公开一个 API,例如 /api/members
- 调用 app2 以检索天气详细信息,例如 /api/weather
应用程序 2:
- 为 app1 公开一个 API,/api/weather
- 调用 app1 以检索会员详细信息,/api/members
目前它们之间的通信是使用 HTTP 进行的。有没有一种方法可以在 spring 引导程序中配置 rabbitMQ,使其在一个交换器上充当消费者,在另一个交换器上充当生产者?从建筑 POV 来看可以吗?我找不到与此相关的任何文章。任何链接/示例将不胜感激。
我想出了这个:
这是 RabbitMQ 配置文件:
@Configuration
class RabbitCfg {
@Bean
fun queue() = Queue("queueName")
@Bean
fun exchange() = DirectExchange("exc")
@Bean
fun binding(exchange: DirectExchange, queue: Queue) = BindingBuilder.bind(queue).to(exchange).with("routeKey")
@Bean
fun jsonMessageConverter() = Jackson2JsonMessageConverter(ObjectMapper())
}
之后我可以从 app1 调用:
val response = rabbitTemplate.convertSendAndReceive(exchange.name, "otherRouteKey", req) as MyObj
并在同一 spring 引导项目中处理来自 app2 的请求:
@Service
@RabbitListener(queues = ["queueName"])
class Receiver {
@RabbitHandler
fun handleMenuMessage(obj: MyObj) = OtherObj()
...
}
唯一需要的条件是两个应用都在同一个交换机上配置,具有不同的“routeKey”值。
我有 2 个使用 spring 引导开发的应用程序:
应用程序 1:
- 为 app2 公开一个 API,例如 /api/members
- 调用 app2 以检索天气详细信息,例如 /api/weather
应用程序 2:
- 为 app1 公开一个 API,/api/weather
- 调用 app1 以检索会员详细信息,/api/members
目前它们之间的通信是使用 HTTP 进行的。有没有一种方法可以在 spring 引导程序中配置 rabbitMQ,使其在一个交换器上充当消费者,在另一个交换器上充当生产者?从建筑 POV 来看可以吗?我找不到与此相关的任何文章。任何链接/示例将不胜感激。
我想出了这个:
这是 RabbitMQ 配置文件:
@Configuration
class RabbitCfg {
@Bean
fun queue() = Queue("queueName")
@Bean
fun exchange() = DirectExchange("exc")
@Bean
fun binding(exchange: DirectExchange, queue: Queue) = BindingBuilder.bind(queue).to(exchange).with("routeKey")
@Bean
fun jsonMessageConverter() = Jackson2JsonMessageConverter(ObjectMapper())
}
之后我可以从 app1 调用:
val response = rabbitTemplate.convertSendAndReceive(exchange.name, "otherRouteKey", req) as MyObj
并在同一 spring 引导项目中处理来自 app2 的请求:
@Service
@RabbitListener(queues = ["queueName"])
class Receiver {
@RabbitHandler
fun handleMenuMessage(obj: MyObj) = OtherObj()
...
}
唯一需要的条件是两个应用都在同一个交换机上配置,具有不同的“routeKey”值。