Rabbitmq-Golang使用简单模式

最简单的队列模式,只有一个消息生产者,一个消息消费者,一个队列,也称为点对点模式、一对一模式。适合比较简单的一对一消息通信,且不需要并发消费的场景,例如: 单一的异步发短信、发邮件、异步推送。

说明:

P 代表生产者 , C 代表消费者,红色代表队列。

基于go 1.24 rabbitmq 3.6.1

我们将消息发布者(发送者)称为 send.go,将消息消费者(接收者)称为receive.go。发布者将连接到RabbitMQ,发送一条消息,然后退出。

安装依赖包
复制代码
go mod init <your-module-name>
go get github.com/rabbitmq/amqp091-go

​ 我们将消息发布者(发送者)称为 send.go,将消息消费者(接收者)称为receive.go。发布者将连接到RabbitMQ,发送一条消息,然后退出。

1. 生产发送
1.1 导入包
复制代码
package main

import (
	"context"
	"log"
	"time"

	amqp "github.com/rabbitmq/amqp091-go" //导入amqp库
)
1.2 连接rabbitmq
复制代码
//连接rabbitmq
	conn, err := amqp.Dial("amqp://app_user:app_password@10.225.7.138:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()
1.3 创建channel会话信道
复制代码
//创建channel信道
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()
1.4 生产并发送消息
复制代码
//声明发送的队列
	q, err := ch.QueueDeclare(
		"hello", // name
		false,   // durable
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	body := "Hello World!"
	err = ch.PublishWithContext(ctx,
		"",     // exchange(交换机名字),这里忽略
		q.Name, // routing key
		false,  // mandatory
		false,  // immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "Failed to publish a message")
	
	log.Printf(" [x] Sent %s\n", body)

发送完整代码:

复制代码
package main

import (
	"context"
	"log"
	"time"

	amqp "github.com/rabbitmq/amqp091-go" //导入amqp库
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}
func main() {
	//连接rabbitmq
	conn, err := amqp.Dial("amqp://app_user:app_password@10.225.7.138:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()
	//创建channel信道
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()
	//声明发送的队列
	q, err := ch.QueueDeclare(
		"hello", // name
		false,   // durable
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	body := "Hello World!"
	err = ch.PublishWithContext(ctx,
		"",     // exchange(交换机名字),这里忽略
		q.Name, // routing key
		false,  // mandatory
		false,  // immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "Failed to publish a message")
	
	log.Printf(" [x] Sent %s\n", body)
}
2. 接受消费

消费完整代码:

复制代码
package main

import (
	"log"

	amqp "github.com/rabbitmq/amqp091-go"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}
func main() {
	conn, err := amqp.Dial("amqp://app_user:app_password@10.225.7.138:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	q, err := ch.QueueDeclare(
		"hello", // name
		false,   // durable
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")
	msgs, err := ch.Consume(
		q.Name, // queue
		"",     // consumer
		true,   // auto-ack
		false,  // exclusive
		false,  // no-local
		false,  // no-wait
		nil,    // args
	)
	failOnError(err, "Failed to register a consumer")

	var forever chan struct{}

	go func() {
		for d := range msgs {
			log.Printf("Received a message: %s", d.Body)
		}
	}()

	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
	<-forever
}

参考:

https://www.rabbitmq.com/tutorials/tutorial-one-go

https://www.tizi365.com/topic/17.html

相关推荐
报错小能手2 小时前
Go 语言结构 基础语法
开发语言·后端·golang
剩下了什么2 小时前
go语言 Ctx:「错误三:在 Context 中存储可变值」
开发语言·后端·golang
运维开发笔记3 小时前
3.7 Go panic 与 recover 学习笔记
golang
JavaPub-rodert4 小时前
我把 OpenAI 协议塞进了 Go 工具库:go-commons 开始支持 AI 了
开发语言·人工智能·golang
零域码客5 小时前
从 SQLite 到 PostgreSQL:轻量单机到分布式架构选型、避坑与迁移全解析
分布式·postgresql·sqlite·wal·架构设计·后端开发·数据库选型
ltl14 小时前
2PC 的真实失败模式:阻塞、脑裂与恢复
分布式
霸道流氓气质16 小时前
分布式系统设计:技术解析与实践
分布式
ACP广源盛1392462567319 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
汽车仪器仪表相关领域1 天前
KRYPTON坚固型IP67 EtherCAT总线数据采集模块:工业级分布式采集方案
分布式·功能测试·汽车·压力测试·可用性测试
霸道流氓气质1 天前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式