本文档介绍如何在 Pig 框架中集成 RabbitMQ 消息队列,包括安装、配置和使用方法。

安装 RabbitMQ

1. Docker 安装

使用 Docker 快速部署 RabbitMQ:

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

2. 访问管理界面

安装完成后,可以通过以下地址访问 RabbitMQ 管理界面:

http://ip:15672

3. 默认登录信息

用户名密码
guestguest

代码集成

1. 添加依赖

在目标服务中添加 AMQP 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. 配置连接信息

在 Nacos 配置文件中添加 RabbitMQ 连接信息:

spring:
  rabbitmq:
    host: 172.16.1.199
    port: 5672
    username: guest
    password: guest

3. 配置队列

创建队列配置类,在服务启动时自动创建队列:

@Configuration(proxyBeanMethods = false)
public class RabbitQueueConfiguration {
    /**
     * 启动时创建队列
     */
    @Bean
    public Queue queue() {
        return new Queue("hello");
    }
}

4. 配置消息监听

创建消息监听器,监听指定队列的消息:

@Component
public class RabbitQueueListener {
    /**
     * 监听 hello 队列的处理器
     */
    @RabbitListener(queues = "hello")
    @RabbitHandler
    public void onMessage(Message message) {
        log.info("消费端 Payload: " + message.getPayload().toString());
    }
}

5. 发送消息

在代码中使用 AmqpTemplate 发送消息:

@Autowired
private AmqpTemplate amqpTemplate;

// 发送消息
amqpTemplate.convertAndSend("队列名称", "信息");

特殊说明

1. 内部服务调用

在 MQ 消费监听逻辑中调用 Feign 服务时,需要注意以下事项:

服务 A 可能没有 token 去请求服务 B,Pig 框架对此情况进行了兼容处理。

  1. 在 FeignClient 中声明内部调用:
remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN);
  1. 在目标接口上添加 @Inner 注解,限制只能通过内部调用访问:
@Inner
@PostMapping
public R save(@Valid @RequestBody SysLog sysLog) {
    return new R<>(sysLogService.save(sysLog));
}

使用 @Inner 注解可以避免接口对外暴露的安全问题,确保只能通过内部调用访问。

♥️ 获取支持

遇到问题?

如果您在使用过程中遇到任何问题、有功能建议或需求,请点击此卡片前往 Gitee 仓库提交 Issue。