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

相关推荐
用户8307196840824 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者1 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者3 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
花酒锄作田4 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
让我上个超影吧4 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖4 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农4 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
qwfys2004 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
初次攀爬者4 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀4 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式