RabbitMQ实现服务间的通信

175 阅读1分钟

第一步:

每个参与的服务都要导入 amqp 的依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

为了方便也可以导入到父模块或 commom 的 pom 文件中

第二步:

配置文件中指定 MQ 的配置

spring:
  rabbitmq:
    host: 192.168.138.100 # 你的虚拟机IP
    port: 5672 # 端口
    virtual-host: /heima # 虚拟主机
    username: heima84 # 用户名
    password: 123321 # 密码

virtual-host :

通过 IP : 15672 访问即可登录查看

第三步

到公共模块 commom 中书写消息转换器,因为接收方都需要,所以方 commom 中更方便

@Configuration
public class MqConfig {
    @Bean
    public MessageConverter jackson2MessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

}

第四步

1、让 item 和 cart 作为消费者绑定路由的 topic 接收消息。分别在两个服务中书写监听器绑定 topic

@Component
@Slf4j
@RequiredArgsConstructor
public class SpringRabbitListener {

    private final ICartService cartService;

    @RabbitListener(bindings = {@QueueBinding(
            //声明消息队列,并指定持久化
            value = @Queue(value = "mark.cart.queue", durable = "true"),
            //声明消息交换机,并指定类型为topic
            exchange = @Exchange(value = "order.topic", type = ExchangeTypes.TOPIC),
            //指定消息如何从交换机路由到队列(这里是路由键)
            key = "order.success"
    )
    }
    )
    //注意参数的类型与消费者发送的一致或兼容即可
    public void handleObjectQueueMessage(Set<Long> itemIds) {
        log.info("====================={}", itemIds);
        cartService.removeByItemIds(itemIds);

    }
}

因为 Item 也接收同一个生产者 order,所以只需要改变一下队列名称即可,保持 key 的一致。

2、 让 order 作为生产者生产消息

注入 rabbitMQ 之后生产消息

try {
    rabbitTemplate.convertAndSend("order.topic", "order.success", order.getId());
} catch (Exception e) {
    throw new RuntimeException("库存不足!");
}

exchange 交换机的名称

order.success 路由的键,也就是监听器的中写的 key

order.getId() 为传输的数据,这里可以依照业务自由决定