【RabbitMQ】golang客户端教程1——HelloWorld

这篇具有很好参考价值的文章主要介绍了【RabbitMQ】golang客户端教程1——HelloWorld。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

本教程假设RabbitMQ已安装并运行在本机上的标准端口(5672)。如果你使用不同的主机、端口或凭据,则需要调整连接设置。如果你未安装RabbitMQ,可以浏览我上一篇文章Linux系统服务器安装RabbitMQ

RabbitMQ是一个消息代理:它接受并转发消息。你可以把它想象成一个邮局:当你把你想要邮寄的邮件放进一个邮箱时,你可以确定邮差先生或女士最终会把邮件送到你的收件人那里。在这个比喻中,RabbitMQ是一个邮箱、一个邮局和一个邮递员。

RabbitMQ和邮局的主要区别在于它不处理纸张,而是接受、存储和转发二进制数据块——消息。

RabbitMQ和一般的消息传递都使用一些术语。

  • 生产仅意味着发送。发送消息的程序是生产者:
    【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言

  • 队列是位于RabbitMQ内部的邮箱的名称。尽管消息通过RabbitMQ和你的应用程序流动,但它们只能存储在队列中。队列只受主机内存和磁盘限制的限制,实际上它是一个大的消息缓冲区。许多生产者可以向一个队列发送消息,而许多消费者可以尝试从一个队列接收数据。以下是我们表示队列的方式:
    【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言

  • 消费与接收具有相似的含义。消费者是一个主要等待接收消息的程序:
    【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言
    请注意,生产者,消费者和代理(broker)不必位于同一主机上。实际上,在大多数应用程序中它们不是。一个应用程序既可以是生产者,也可以是消费者。

二、Hello World

在本教程的这一部分中,我们将在Go中编写两个小程序:发送单个消息的生产者和接收消息并将其打印出来的消费者。我们将忽略Go-RabbitMQ API中的一些细节,只关注非常简单的事情,以便开始教程。这是一个消息传递版的“Hello World”。

在下图中,“ P”是我们的生产者,“ C”是我们的消费者。中间的框是一个队列——RabbitMQ代表消费者保存的消息缓冲区。

【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言

RabbitMQ讲多种协议。本教程使用amqp0-9-1,这是一个开放的、通用的消息传递协议。RabbitMQ有许多不同语言的客户端。在本教程中,我们将使用Go amqp客户端。

首先,使用go get安装amqp

go get github.com/streadway/amqp

三、发送

【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言
我们将消息发布者(发送者)称为 send.go,将消息消费者(接收者)称为receive.go。发布者将连接到RabbitMQ,发送一条消息,然后退出。

send.go中,我们需要首先导入库:

package main

import (
  "log"

  "github.com/streadway/amqp"
)

我们还需要一个辅助函数来检查每个amqp调用的返回值:

func failOnErrorSend(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

然后连接到RabbitMQ服务器

// 1. 尝试连接RabbitMQ,建立连接
// 该连接抽象了套接字连接,并为我们处理协议版本协商和认证等。
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnErrorSend(err, "Failed to connect to RabbitMQ")
defer conn.Close()

其中,amqp.Dial 是用于建立连接到 RabbitMQ 的函数,它使用 AMQP 协议进行通信。该函数的参数是 RabbitMQ 服务器的连接字符串。

amqp://<username>:<password>@<host>:<port>/<vhost>
  • username : RabbitMQ 用户的用户名。
  • password: RabbitMQ 用户的密码。
  • host: RabbitMQ服务器的主机名或IP地址。
  • port: RabbitMQ 服务器的端口号。
  • vhost:需要连接的虚拟主机。

连接抽象了socket连接,并为我们处理协议版本协商和认证等。接下来,我们创建一个通道,这是大多数用于完成任务的API所在的位置:

// 2. 接下来,我们创建一个通道,大多数API都是用过该通道操作的。
ch, err := conn.Channel()
failOnErrorSend(err, "Failed to open a channel")
defer ch.Close()

要发送,我们必须声明要发送到的队列。然后我们可以将消息发布到队列:

// 3. 声明消息要发送到的队列
q, err := ch.QueueDeclare(
  "hello", // 队列的名称
  false,   // 队列是否持久化
  false,   // 队列是否在最后一个消费者断开连接后自动删除
  false,   // 是否设置队列为独占模式
  false,   // 是否不等待服务器的响应
  nil,     // 队列的可选参数
)
failOnErrorSend(err, "Failed to declare a queue")

body := "Hello World!"
// 4.将消息发布到声明的队列
err = ch.Publish(
  "",     // 要发布消息的目标交换器的名称。
  q.Name, // 消息的路由键。交换器根据路由键将消息路由到相应的队列。
  false,  // 是否要求至少一个队列接收该消息
  false,  // 是否要求消息在发布时立即被消费者接收
  amqp.Publishing { 
    ContentType: "text/plain",
    Body:        []byte(body),
  })//要发布的消息内容
failOnErrorSend(err, "Failed to publish a message")

声明队列是幂等的——仅当队列不存在时才创建。消息内容是一个字节数组,因此你可以在此处编码任何内容。

完整代码:

package main

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

func failOnErrorSend(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}
func main() {
	//1.连接RabbitMQ,建立连接
	//该连接抽象了套接字连接,并为我们处理协议版本协商和认证等。
	conn, err := amqp.Dial("amqp://licong:123456@8.130.85.112:5672/")
	failOnErrorSend(err, "Failed to connect to RabitMQ")
	defer conn.Close()

	//2.接下来,我们创建一个通道,这是大多数用户完成任务的API所在的位置:
	ch, err := conn.Channel()
	failOnErrorSend(err, "Fail to open a channel")
	defer ch.Close()

	//3.声明消息要发送的队列
	q, err := ch.QueueDeclare(
		"hello", //name
		false,   //durable
		false,   //delete when unused
		false,   //exclusive
		false,   //no-wait
		nil,     //arguments
	)
	failOnErrorSend(err, "Failed to declare a queue")
	body := "Hello World!"
	//4.将消息发布到声明的队列
	err = ch.Publish(
		"",     //exchange
		q.Name, //routing key
		false,  //mandatory
		false,  //immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		},
	)
	failOnErrorSend(err, "Failed to publish a message")
	log.Printf(" [x] Sent %s\n", body)
}

四、发送

上面是我们的发布者。我们的消费者监听来自RabbitMQ的消息,因此与发布单个消息的发布者不同,我们将使消费者保持运行状态以监听消息并打印出来。
【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言
该代码(在receive.go中)具有与send相同的导入和帮助功能:

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

func failOnErrorReceive(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

设置与发布者相同;我们打开一个连接和一个通道,并声明要消耗的队列。请注意,这与send发布到的队列匹配。

//建立连接
	conn, err := amqp.Dial("amqp://licong:123456@8.130.85.112:5672/")
	failOnErrorReceive(err, "Failed to connect to RabbitMQ")
	defer conn.Close()
	//获取channel
	ch, err := conn.Channel()
	failOnErrorReceive(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,     //argument
	)
	failOnErrorReceive(err, "Failed to declare a queue")
failOnError(err, "Failed to declare a queue")

请注意,我们也在这里声明队列。因为我们可能在发布者之前启动使用者,所以我们希望在尝试使用队列中的消息之前确保队列存在。

我们将告诉服务器将队列中的消息传递给我们。由于它将异步地向我们发送消息,因此我们将在goroutine中从通道(由amqp::Consume返回)中读取消息。

//获取接收消息的Delivery通道
   msgs, err := ch.Consume(
   	q.Name, //要消费消息的队列名称
   	"",     //消费者标识,留空字符串会自动生成一个唯一标识符。
   	true,   //是否自动确认消息
   	false,  //是否设置队列为独占模式
   	false,  //是否禁止消费者接收自己发布的消息
   	false,  //是否不等待服务器的响应
   	nil,    //队列的可选参数
   )
   failOnErrorReceive(err, "Failed to register a consumer")
   forever := make(chan bool)
   go func() {
   	for d := range msgs {
   		log.Printf("Reveived a message:%s", d.Body)
   	}
   }()
   log.Printf("[*] Waiting for messages. To exit press CTRL+C")
   <-forever

五、运行

终端运行:

go run send.go

【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言

go run receive.go 

【RabbitMQ】golang客户端教程1——HelloWorld,RabbitMQ,rabbitmq,golang,中间件,后端,开发语言

源自:https://www.rabbitmq.com/getstarted.html文章来源地址https://www.toymoban.com/news/detail-620826.html

到了这里,关于【RabbitMQ】golang客户端教程1——HelloWorld的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ客户端清空所有消息

    打开RabbitMq管理页面,进入队列。 点击 Get messages Requeue 改成No Mesaages 设置一个值 点击Get messages 打开RabbitMq管理页面,进入队列。 点击Purge 点击按钮Purge Messages

    2024年02月08日
    浏览(51)
  • springboot RabbitMQ客户端连接故障恢复

    最近做RabbitMQ故障演练发现RabbitMQ服务器停止后,基于springboot的消费端不可以自动的恢复,队列的消费者消失,消息一直积压到队列中,这种情况肯定是不可接收的;通过研究源代码找到了解决方案。 一、添加自动恢复配置automaticRecovery 通过上述配置如果RabbitMQ服务器发生故

    2024年02月11日
    浏览(53)
  • (五)「消息队列」之 RabbitMQ 主题(使用 .NET 客户端)

    先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口( 5672 )上运行。如果您使用了不同的主机、端口或凭证,则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题,可以通过邮件列表或者 RabbitMQ 社区 Slack 与 RabbitMQ 官方取得联系。 在上一篇教程中

    2024年02月16日
    浏览(54)
  • 【RabbitMQ 实战】09 客户端连接集群生产和消费消息

    下面的链接是最快最简单的一种集群部署方法 3分钟部署一个RabbitMQ集群 上的的例子中,没有映射端口,所以没法从宿主机外部连接容器,下面的yml文件中,暴露了端口。 每个容器应用都映射了宿主机的端口,分别是5602,5612,5622 docker compse文件如下 通过docker-compose up命令,

    2024年02月07日
    浏览(38)
  • (四)「消息队列」之 RabbitMQ 路由(使用 .NET 客户端)

    先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口( 5672 )上运行。如果您使用了不同的主机、端口或凭证,则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题,可以通过邮件列表或者 RabbitMQ 社区 Slack 与 RabbitMQ 官方取得联系。 在上一篇教程中

    2024年02月17日
    浏览(41)
  • rabbitmq中客户端30分钟未ack报错解决

    错误日志 : ERROR MESSAGE 这个错误发生在 RabbitMQ 客户端,提示连接已经被关闭,并给出了关闭的原因: close-reason,由对等方(Peer)发起; code=406,表示 PRECONDITION_FAILED; text=‘PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be

    2024年02月10日
    浏览(41)
  • (七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

    发布者确认 是一个 RabbitMQ 扩展,用于实现可靠的发布。当在通道上启用发布者确认时,客户端发布的消息将由代理 异步确认 ,这意味着它们已在服务器端得到处理。 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口( 5672 )上运行。如果您使用了不同的主

    2024年02月16日
    浏览(40)
  • 根据源码,模拟实现 RabbitMQ - 网络通讯设计,实现客户端Connection、Channel(完结)

    目录 一、客户端代码实现 1.1、需求分析 1.2、具体实现 1)实现 ConnectionFactory 2)实现 Connection 3)实现 Channel 二、编写 Demo  2.1、实例  2.1、实例演示 RabbitMQ 的客户端设定:一个客户端可以有多个模块,每个模块都可以和 broker server 之间建立 “逻辑上的连接” (channel),这

    2024年02月11日
    浏览(44)
  • Spring Cloud【Config客户端配置与测试、Config客户端之动态刷新 、什么是Spring Cloud Bus、Docker安装RabbitMQ】(十)

      目录 分布式配置中心_Config客户端配置与测试 为什么要引入bootstrap 

    2024年02月15日
    浏览(43)
  • Idea+maven+springboot项目搭建系列--2 整合Rabbitmq完成客户端&服务器端消息收发

    前言:本文通过springBoot -maven 框架,对Rabbitmq 进行整合,完成客户端消息的发送和消费; 1 为什么要使用Rabbitmq: RabbitMQ 是一个可靠的、灵活的、开源的消息中间件,具有以下优点: 异步通信:RabbitMQ 支持异步通信,使得消息发送者和接收者能够异步处理,提高了系统性能和

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包