golang对接rabbitMQ

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

此文参考如下链接:

Golang 使用 RabbitMQ - 知乎

以go rabbitmq为例子--用最少的时间最好的掌握消息队列_胡桃姓胡,蝴蝶也姓胡的博客-CSDN博客

rabbitmq的个组件、消息传递原理就不做解释了,百度一大堆。

一、rabbitMQ架构

首先要明确的是,tabbitmq是c/s架构的软件,对接rabbitMQ也就是通过client(客户端)来操作服务端,发送消息、接收消息。

二、golang对接rabbitMQ如何来组织

1.首先针对各语言,rabbitMQ官方都有提供对应语言的包,golang的包通过 go get 下载,地址:

github.com/streadway/amqp

2.首先已经明确过了rabbitMQ是c/s架构,所以我们不论是生产者还是消费者,都是通过client端来操作。

3.生产者和消费者都需要完成的步骤:

        3.1 创建与server端的连接 connection

        3.2 创建channel(发送或接收消息通道) 

4.生产者要完成的步骤:

        4.1 通过channnel声明Queue(如果Queue已经存在,服务端则会忽略,不存在,服务端则会新建一个Queue)

        4.2 通过channel声明Exchange,需要指定Exchange的Type类型(同Queue声明一样,有则忽略,没有则创建)

        4.3 创建binding,指定binding key 将Queue绑定到Exchange上,可有多个绑定关系。

        4.4 发送消息,指定消息的 bingding key 、Exchange(消息携带了bingding key 和 Exchange,到达Exchange后就知道根据什么type,以及绑定关系分发给哪个队列)

        

5. 消费者要完成的步骤:

        5.1 通过channel声明Queue(同生产者)

        5.2 从Queue中取消息

        5.3 要注意的是,消费和没必要去关注 Exchange和 绑定关系,因为这是生产者关注的点,尽管消费端也可以 创建交换机以及绑定关系。

三、实际代码实现

注意:生产者和消费者可以根据消息模式进行封装,直接调用。本代码实例即 topic模式,了解此种模式其他模式也就很简单了。文章来源地址https://www.toymoban.com/news/detail-413756.html

1.rabbitMQ的client端初始化代码(即 生产者和消费者 都需要用到的 client)

package rabbitMq

import (
 "log"

 "github.com/streadway/amqp"
) //导入mq包

// MQURL 格式 amqp://账号:密码@rabbitmq服务器地址:端口号/vhost (默认是5672端口)
// 端口可在 /etc/rabbitmq/rabbitmq-env.conf 配置文件设置,也可以启动后通过netstat -tlnp查看
const MQURL = "amqp://admin:mima@192.168.1.11:5672/"

// RabbitMQ  结构体
type RabbitMQ struct {
 Conn    *amqp.Connection
 Channel *amqp.Channel
 // 队列名称
 QueueName string
 // 交换机
 Exchange string
 // routing Key
 RoutingKey string
 //MQ链接字符串
 Mqurl string
}

// 创建结构体实例
func NewRabbitMQ(queueName, exchange, routingKey string) *RabbitMQ {
 rabbitMQ := RabbitMQ{
  QueueName:  queueName,
  Exchange:   exchange,
  RoutingKey: routingKey,
  Mqurl:      MQURL,
 }
 var err error
 //创建rabbitmq连接
 rabbitMQ.Conn, err = amqp.Dial(rabbitMQ.Mqurl)
 checkErr(err, "创建连接失败")

 //创建Channel
 rabbitMQ.Channel, err = rabbitMQ.Conn.Channel()
 checkErr(err, "创建channel失败")

 return &rabbitMQ

}

// 释放资源,建议NewRabbitMQ获取实例后 配合defer使用
func (mq *RabbitMQ) ReleaseRes() {
 mq.Conn.Close()
 mq.Channel.Close()
}

// 错误处理
func checkErr(err error, meg string) {
 if err != nil {
  log.Fatalf("%s:%s\n", meg, err)
 }
}

2.生产者代码实现

package main

import (
 "fmt"
 "mq/rabbitMq"

 "github.com/streadway/amqp"
)

//生产者发布流程
func main() {
 // 初始化mq
 mq := rabbitMq.NewRabbitMQ("queue_publisher", "exchange_publisher", "key1")
 defer mq.ReleaseRes() // 完成任务释放资源

 // 1.声明队列
 /*
  如果只有一方声明队列,可能会导致下面的情况:
   a)消费者是无法订阅或者获取不存在的MessageQueue中信息
   b)消息被Exchange接受以后,如果没有匹配的Queue,则会被丢弃

  为了避免上面的问题,所以最好选择两方一起声明
  ps:如果客户端尝试建立一个已经存在的消息队列,Rabbit MQ不会做任何事情,并返回客户端建立成功的
 */
 _, err := mq.Channel.QueueDeclare( // 返回的队列对象内部记录了队列的一些信息,这里没什么用
  mq.QueueName, // 队列名
  true,         // 是否持久化
  false,        // 是否自动删除(前提是至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。注意:生产者客户端创建这个队列,或者没有消费者客户端与这个队列连接时,都不会自动删除这个队列)
  false,        // 是否为排他队列(排他的队列仅对“首次”声明的conn可见[一个conn中的其他channel也能访问该队列],conn结束后队列删除)
  false,        // 是否阻塞
  nil,          //额外属性(我还不会用)
 )
 if err != nil {
  fmt.Println("声明队列失败", err)
  return
 }

 // 2.声明交换器
 err = mq.Channel.ExchangeDeclare(
  mq.Exchange, //交换器名
  "topic",     //exchange type:一般用fanout、direct、topic
  true,        // 是否持久化
  false,       //是否自动删除(自动删除的前提是至少有一个队列或者交换器与这和交换器绑定,之后所有与这个交换器绑定的队列或者交换器都与此解绑)
  false,       //设置是否内置的。true表示是内置的交换器,客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式
  false,       // 是否阻塞
  nil,         // 额外属性
 )
 if err != nil {
  fmt.Println("声明交换器失败", err)
  return
 }

 // 3.建立Binding(可随心所欲建立多个绑定关系)
 err = mq.Channel.QueueBind(
  mq.QueueName,  // 绑定的队列名称
  mq.RoutingKey, // bindkey 用于消息路由分发的key
  mq.Exchange,   // 绑定的exchange名
  false,         // 是否阻塞
  nil,           // 额外属性
 )
 // err = mq.Channel.QueueBind(
 //  mq.QueueName,  // 绑定的队列名称
 //  "routingkey2", // bindkey 用于消息路由分发的key
 //  mq.Exchange,   // 绑定的exchange名
 //  false,         // 是否阻塞
 //  nil,           // 额外属性
 // )
 if err != nil {
  fmt.Println("绑定队列和交换器失败", err)
  return
 }

 // 4.发送消息
 mq.Channel.Publish(
  mq.Exchange,   // 交换器名
  mq.RoutingKey, // routing key
  false,         // 是否返回消息(匹配队列),如果为true, 会根据binding规则匹配queue,如未匹配queue,则把发送的消息返回给发送者
  false,         // 是否返回消息(匹配消费者),如果为true, 消息发送到queue后发现没有绑定消费者,则把发送的消息返回给发送者
  amqp.Publishing{ // 发送的消息,固定有消息体和一些额外的消息头,包中提供了封装对象
   ContentType: "text/plain",           // 消息内容的类型
   Body:        []byte("hello jochen"), // 消息内容
  },
 )
}

3.消费者代码

package main

import (
 "fmt"
 "mq/rabbitMq"
)

// 消费者订阅
func main() {
 // 初始化mq
 mq := rabbitMq.NewRabbitMQ("queue_publisher", "exchange_publisher", "key1")
 defer mq.ReleaseRes() // 完成任务释放资源

 // 1.声明队列(两端都要声明,原因在生产者处已经说明)
 _, err := mq.Channel.QueueDeclare( // 返回的队列对象内部记录了队列的一些信息,这里没什么用
  mq.QueueName, // 队列名
  true,         // 是否持久化
  false,        // 是否自动删除(前提是至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除。注意:生产者客户端创建这个队列,或者没有消费者客户端与这个队列连接时,都不会自动删除这个队列)
  false,        // 是否为排他队列(排他的队列仅对“首次”声明的conn可见[一个conn中的其他channel也能访问该队列],conn结束后队列删除)
  false,        // 是否阻塞
  nil,          // 额外属性(我还不会用)
 )
 if err != nil {
  fmt.Println("声明队列失败", err)
  return
 }

 // 2.从队列获取消息(消费者只关注队列)consume方式会不断的从队列中获取消息
 msgChanl, err := mq.Channel.Consume(
  mq.QueueName, // 队列名
  "",           // 消费者名,用来区分多个消费者,以实现公平分发或均等分发策略
  true,         // 是否自动应答
  false,        // 是否排他
  false,        // 是否接收只同一个连接中的消息,若为true,则只能接收别的conn中发送的消息
  true,         // 队列消费是否阻塞
  nil,          // 额外属性
 )
 if err != nil {
  fmt.Println("获取消息失败", err)
  return
 }

 for msg := range msgChanl {
  // 这里写你的处理逻辑
  // 获取到的消息是amqp.Delivery对象,从中可以获取消息信息
  fmt.Println(string(msg.Body))
  // msg.Ack(true) // 主动应答

 }

}

到了这里,关于golang对接rabbitMQ的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献

    Zotero以其丰富的插件而闻名,使用起来十分的带劲,最重要的是它是免费的、不卡顿,不像某专业软件。 然而Zotero在word插入参考文献时,无法为参考文献添加超链接,这是一个不得不提的遗憾。 不过,有大佬已经写出了基于Word VBA语言的代码,可以为Zotero在Word中的参考文献

    2024年02月02日
    浏览(55)
  • golang语言websocket百万长链接

    是简单demo测试 cup 最理想的处理大概是每秒100万次,已经到了极限 减少网络小包的发送,小包大概几百字节,把同一秒中的推送的条数合并成一条,合并后 每秒推送的次数 等于 连接数 , 打包json

    2023年04月13日
    浏览(39)
  • c++ MES 对接之2(MQTT、Restful、RabbitMQ)

    以下是一个简单的C++程序,演示如何使用MQTT、Restful和RabbitMQ进行MES对接: //c++ #include iostream #include string #include cstdlib #include cstdio #include cstring #include unistd.h #include mosquitto.h #include curl/curl.h #include amqp.h #include amqp_tcp_socket.h using namespace std; // MQTT回调函数 void on_message (struct mosq

    2024年02月09日
    浏览(42)
  • c# MES 对接之二(MQTT、Restful、RabbitMQ)

    //以下是C# MES对接的示例代码: //1. MQTT //使用M2Mqtt库实现C#与MQTT的通信,示例代码如下: //csharp using System; using System.Text; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; class Program {     static void Main(string[] args)     {         // 创建MQTT客户端实例         MqttCl

    2024年02月09日
    浏览(42)
  • 参考RabbitMQ实现一个消息队列

    消息队列的本质就是阻塞队列,它的最大用途就是用来实现生产者消费者模型,从而实现 解耦合 以及 削峰填谷 。 在分布式系统中不再是单个服务器而是服务器“集群”,如果我们我们直接A服务器给B服务器发送请求,B服务器给A服务器返回响应,这样的话我们AB的耦合较大

    2024年02月14日
    浏览(86)
  • 《消息队列MyMQ》——参考RabbitMQ实现

    目录 一、什么是消息队列? 二、需求分析 1)核心概念 2)核心API 3)交换机类型 4)持久化 5)网络通信 ​编辑 6)消息应答 三、 模块划分 四、创建核心类 1.ExChange 2.MSGQueue  3.Binding 4. Message 五. 数据库设计  1.配置 sqlite 引⼊ pom.xml 依赖  配置数据源 application.yml 2.实现创建

    2024年02月04日
    浏览(37)
  • 【华为OD机试真题 Golang语言】68、矩阵扩散 | 机试真题+思路参考+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Golang语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 存在一个m*n的二维数组,其成员取值范围为0或

    2024年02月03日
    浏览(56)
  • Golang使用消息队列(RabbitMQ)

    最近在使用Golang做了一个网盘项目(类似百度网盘),这个网盘项目有一个功能描述如下:用户会删除一个文件到垃圾回收站,回收站的文件有一个时间期限,比如24h,24h后数据库中记录和oss中文件会被删除,在之前的版本中,可以使用定时任务来检查数据库记录中删除时间

    2024年02月10日
    浏览(54)
  • node.js 安装及配置环境变量只看此文

    node.js 安装完成后会带相应的npm 包管理工具。 node js 官网下载 选择合适的版本进行下载。 这里选择稳定版本。一步一步执行安装,期间安装盘默认C 盘,建议更换到盘符。 我是安装到E 盘 使用 window + R 快捷键,启动 cmd命令行 验证 node.js 是否安装成功 更改全局安装路径: 如

    2024年02月10日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包