【RabbitMQ #3】 | Go 客户端 + SpringAMQP

一、RabbitMQ 基础概念

AMQP 协议

AMQP(高级消息队列协议):与语言、平台无关的消息协议,RabbitMQ 基于该协议。

Spring AMQP 简介

Spring AMQP 是基于 AMQP 协议封装的 API 规范,分为两部分:

  1. spring-amqp:基础抽象层
  2. spring-rabbit:底层 RabbitMQ 具体实现

二、Go 客户端安装

注意:这里有两套 Go 客户端

  1. 新版官方:rabbitmq-amqp-go-client(AMQP 1.0)
  2. 社区常用:streadway/amqp(AMQP 0-9-1,下面 Demo 用的这个,学习推荐)
复制代码
# 新版官方客户端安装
go get github.com/rabbitmq/rabbitmq-amqp-go-client

导入:

Go 复制代码
import (
	"context"
	"log"
	rmq "github.com/rabbitmq/rabbitmq-amqp-go-client/pkg/rabbitmqamqp"
)

下面示例代码使用的是 streadway/amqp(AMQP0-9-1,目前学习最简单,和 SpringAMQP 底层协议一致)

三、简单模型:生产者直接发消息到队列(Simple 模型)

流程:Publisher → Queue → Consumer 案例:simple.queue

  1. 在 RabbitMQ 控制台创建队列 simple.queue(代码里QueueDeclare是幂等,不存在自动创建)
  2. 生产者发送消息到队列
  3. 消费者监听队列,接收消息

SpringAMQP 开发步骤对照(方便 Java 转 Go 理解)

  1. 引入 RabbitMQ 依赖
  2. 配置 RabbitMQ 服务信息:host、port、virtual-host、username、password
  3. 发送消息:使用 RabbitTemplate
  4. 消费消息:使用 @RabbitListener 注解监听队列

Go 生产者代码(send.go)

等价 Spring rabbitTemplate.convertAndSend(queueName, msg)

Go 复制代码
package main

import (
	"fmt"
	"github.com/streadway/amqp"
)

func main() {
	// 1. 连接 rabbitmq
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	if err != nil {
		panic(err)
	}
	defer ch.Close()

	queueName := "simple.queue"
	// 3. 声明队列:幂等。队列存在则不操作,不存在自动创建
	_, err = ch.QueueDeclare(
		queueName,
		false, // durable:是否持久化
		false, // autoDelete:是否自动删除
		false, // exclusive:独占队列
		false, // noWait
		nil,   // args:额外参数
	)
	if err != nil {
		panic(err)
	}

	msg := "hello, amqp!"
	// 4. 发布消息
	err = ch.Publish(
		"",          // exchange:空=默认交换机,和Spring行为一致
		queueName,   // routingKey:直接填队列名,消息直接路由到此队列
		false,       // mandatory
		false,       // immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(msg),
		},
	)
	if err != nil {
		panic(err)
	}
	fmt.Printf("发送消息成功:%s\n", msg)
}

Go 消费者代码(consumer.go)

等价 Spring @RabbitListener(queues = "simple.queue"),持续监听队列

Go 复制代码
package main

import (
	"fmt"
	"github.com/streadway/amqp"
	"log"
)

func main() {
	// 1. 连接RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
		log.Fatalf("连接失败: %v", err)
	}
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	if err != nil {
		log.Fatalf("打开通道失败: %v", err)
	}
	defer ch.Close()

	queueName := "simple.queue"
	// 3. 声明队列(幂等)
	_, err = ch.QueueDeclare(
		queueName,
		false,
		false,
		false,
		false,
		nil,
	)
	if err != nil {
		log.Fatalf("声明队列失败: %v", err)
	}

	// 4. 注册消费者,开始消费消息
	msgs, err := ch.Consume(
		queueName, // 监听队列名
		"",        // consumer
		true,      // autoAck=true:收到消息自动确认,和Spring默认近似
		false,     // exclusive
		false,     // noLocal
		false,     // noWait
		nil,       // args
	)
	if err != nil {
		log.Fatalf("注册消费失败: %v", err)
	}

	fmt.Println("Go消费者启动,监听 simple.queue ...")
	// 循环读取消息,持续处理消息
	for d := range msgs {
		msg := string(d.Body)
		fmt.Printf("go 消费者接收到消息:[%s]\n", msg)
		fmt.Println("消息处理完成")
	}
}

四、核心要点总结

  1. 连接地址不要写错:amqp://账号:密码@ip:5672/
  2. QueueDeclare 幂等特性:重复调用不会报错,不存在则新建队列
  3. Simple 模型:空交换机,routingKey 直接写队列名,消息直接投递队列
  4. autoAck:自动确认,消息收到后 MQ 立刻删除消息;生产环境一般关闭,手动 ACK 保证可靠性
  5. SpringAMQP 和 Go streadway/amqp 底层都是 AMQP0-9-1,可以对照理解学习
相关推荐
JWASX4 小时前
Java 转 go 学习 - 基本语法
学习·golang
microrain6 小时前
首包即身份:SagooIoT 网络组件的注册包、粘包与透传设计
物联网·golang·开源·sagooiot
Q26433650237 小时前
【有源码】基于Spark的电商客户细分与盈利洞察分析系统-面向精准营销的电商客户细分模型构建与盈利能力可视化研究
大数据·hadoop·分布式·数据挖掘·数据分析·spark·毕业设计
晴空蓝天7 小时前
RabbitMQ 消息可靠投递:confirm 确认 + 消费重试 + 死信队列
rabbitmq
驭渊的小故事7 小时前
RabbitMQ 环境配置和 DirectRabbitConfig 的 SpringBoot 4.0.X 版本
spring boot·rabbitmq·java-rabbitmq
GoFly开发者7 小时前
纯 Go 桌面 AI 智能体实战:Wails3 + Eino ADK 构建 Agent 对话应用(流式输出 / 工具审批 / RAG / 打包全记录)
golang·ai agent·eino·wails3·agent桌面开发
新思维软件8 小时前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据8 小时前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机15 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python