介绍

RabbitMQ是消息中间件:它接受并转发消息。

您可以将其视为邮局系统:将要发送的邮件放在邮箱中时,

可以确保邮递员最终将邮件传递给收件人。

以此类推,RabbitMQ是一个邮箱,一个邮局和一个邮递员。

RabbitMQ与邮局之间的主要区别在于,

它不处理纸张,而是接收,存储和转发数据消息的二进制数据。

以下是RabbitMQ和消息发送的术语

  • Producer:生产者。负责生产消息。

  • Queue:队列。负责存储消息。队列在RabbitMQ中充当邮箱的角色,消息传递到RabbitMQ中,只能存储在队列中。队列受主机内存和磁盘大小的约束。本质是一个很大的消息缓冲区。

    许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。

  • Consumer:消费者。负责处理消息。

** 笔者补充

  • 参考连接

  • Connect:连接。生产者和RabbitMQ服务之间建立的TCP连接。

  • Channel:信道,一条连接可包含多条信道,不同信道之间通信互不干扰。考虑下多线程应用场景,每个线程对应一条信道,而不是对应一条连接,这样可以提高性能。

  • body:消息主体,要传递的数据。

  • exchange:交换器,负责把消息转发到对应的队列。交换器本身没有缓存消息的功能,消息是在队列中缓存的,如果队列不存在,则交换器会直接丢弃消息。常用的有四种类型的交换器:direct、fanout、topic、headers。不同类型的交换器有不同的交换规则,交换器会根据交换规则把消息转发到对应的队列。

  • exchangeName:交换器名称,每个交换器对应一个名称,发送消息时会附带交换器名称,根据交换器名称选择对应的交换器。

  • BandingKey:绑定键,一个队列可以有一个到多个绑定键,通过绑定操作可以绑定交换器和队列,交换器会根据绑定键的名称找到对应的队列。

  • RotingKey:路由键,发送消息时,需要附带一条路由键,交换器会对路由键和绑定键进行匹配,如果匹配成功,则消息会转发到绑定键对应的队列中。

**简而言之就是:

  1. 生产者指定路由Key和交换器的名字发送给RabbitMQ服务

  2. 指定名字的交换器根据路由key去找到绑定的队列

  3. 将消息放入队列当中

  4. 消费者从队列中取出消息进行处理

**linux安装RabbitMQ服务

**Docker安装RabbitMQ服务

实战 "Hello World"

golang语言实现

在本教程的这一部分中,我们将用Go编写两个小程序。 发送单个消息的生产者和接收消息并打印出来的消费者。 我们将介绍Go RabbitMQ API中的一些细节,仅着眼于此非常简单的事情。 这是消息传递的“ Hello World”。

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

Go RabbitMQ客户端库

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

go get github.com/streadway/amqp

生产者发送数据到队列

#send.go 生产者,发送消息到消息队列中

package main

import (
"github.com/streadway/amqp"
"log"
) func main(){
// 连接RabbitMQ服务器
conn, err := amqp.Dial("amqp://guest:guest@127.0.0.1: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", // 队列名称
false, // 是否持久化
false, // 是否自动删除
false, // 是否独立
false,nil,
)
failOnError(err, "Failed to declare a queue")
// 发送消息到队列中
body := "Hello World!"
err = ch.Publish(
"", // exchange
q.Name, // routing key
false, // mandatory
false, // immediate
amqp.Publishing {
ContentType: "text/plain",
Body: []byte(body),
})
failOnError(err, "Failed to publish a message")
fmt.Println("send message success\n"
} // 帮助函数检测每一个amqp调用
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}

消费者从队列接收数据


package main import (
"github.com/streadway/amqp"
"log"
) func main(){
// 连接RabbitMQ服务器
conn, err := amqp.Dial("amqp://admin:admin@47.97.215.189:5672/admin")
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", // 队列名称
false, // 是否持久化
false, // 是否自动删除
false, // 是否独立
false,nil,
)
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")
// 申明一个goroutine,一遍程序始终监听
forever := make(chan bool) 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
} // 帮助函数检测每一个amqp调用
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}

RabbitMQ官方教程一Hello World(GOLANG语言实现)的更多相关文章

  1. RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现)

    RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现) 在上一个教程中,我们创建了一个工作队列. 工作队列背后的假设是,每个任务都恰好交付给一个worker处理. 在这 ...

  2. RabbitMQ官方教程二 Work Queues(GOLANG语言实现)

    RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...

  3. Cobalt Strike使用教程一

    Cobalt Strike使用教程一     0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...

  4. NGUI系列教程一

    NGUI是Unity的一个插件,使用它来制作你的游戏UI必定将事半功倍.为什么这么说呢?首先我们说说GUI与NGUI的区别,GUI是Unity自带的绘制界面工具,它的成像原理是基于表层的,所以执行效率 ...

  5. RabbitMQ系列教程之二:工作队列(Work Queues)(转载)

    RabbitMQ系列教程之二:工作队列(Work Queues)     今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示)          ...

  6. Quartz教程一:使用quartz

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  7. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  8. CRL快速开发框架系列教程一(Code First数据表不需再关心)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. hbase rest api接口链接管理【golang语言版】

    # go-hbase-resthbase rest api接口链接管理[golang语言版]关于hbase的rest接口的详细信息可以到官网查看[http://hbase.apache.org/boo ...

随机推荐

  1. learning java AWT BoxLayout布局管理器

    import javax.swing.*; import java.awt.*; public class BoxSpaceTest { private Frame f = new Frame(&qu ...

  2. WebAPI学习

    WebAPI概述 今天的web计算平台包含了广泛的功能,其中的大部分均可以通过API(应用程序编程接口)访问. web平台归为6个基本设施,都会用到webapi,包括存储服务.消息服务.计算服务.信息 ...

  3. 洛谷 P3258 [JLOI2014]松鼠的新家 题解

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  4. 从海量文本中统计出前k个频率最高的词语

    现有如下题目:有一个海量文本,存储的是汉语词语,要求从中找出前K个出现频率最高的词语,写出最优算法,兼顾时间和空间复杂度. 思路分析:熟悉搜索引擎的程序员,应该不是难题.用传统的HashMap是无法解 ...

  5. 三大框架 之 spring-JDBC

    目录 spring-JDBC模板 Spring的JDBC的模板 JDBC模板使用的入门 引入jar包 创建数据库和表 使用JDBC的模板 将连接池和模板交给Spring管理 配置文件配置Bean 使用 ...

  6. CENTOS7安装OPENSSL

    CENTOS7安装OPENSSL yum install openssl yum install openssl-devel

  7. JVM 初始化阶段的重要意义分析

    1.创建一个Mytest6类和Singleton类 public class MyTest6 { public static void main(String[] args) { Singleton ...

  8. Java IO系统--字符流

    字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ...

  9. composer.lock文件的作用

    在使用composer后目录中会出现2个文件,composer.lock和composer.json,现在来说说这两个文件的作用. 1.composer.json composer.json文件中保存 ...

  10. Python3基础 complex 声明复数

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...