go语言学习--RabbitMQ学习(概论及hellowold实例)

5 篇文章 0 订阅

一.什么是RabbitMQ?
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
二.RabbitMQ可以用来干什么?
用于程序之间进行通信,可以是一个程序,也可以是多个程序。通信过程为,生产者程序将消息发送给消息队列(RabbitMQ的服务端),消费者可以从消息队列获取消息。
三.RabbitMQ原理是什么?
在这里插入图片描述生产者:产生消息,并将消息发送给消息队列。
消费者:从消息队列中获取消息。
交换器:
我们不是把消息直接发送到队列里面的,而是先发送到了交换器,交换器再根据路由键把我们的消息投递到对应的队列。每种交换器定义了不同的路由算法来把消息投递到对应的队列。
交换器的种类:
direct、fanout、topic 以及 headers,headers 用的比较少。
实际就是路由键的匹配方式不同。

direct
路由键全文匹配
当你发送一条消息到 direct 交换器时,它会根据路由键全文匹配去寻找绑定到此交换器上的匹配成功的队列,然后投递消息。
如图,生产者使用路由键 “fruit.apple” 发送消息到 direct 交换器,交换器会根据绑定信息,全文匹配路由键,所以只有 apple 队列符合。
在这里插入图片描述fanout
当你发送一条消息到 fanout 交换器时,它会把消息投递给所有绑定到此交换器上的队列,而且会忽略路由键。
生产者使用路由键 “fruit.apple” 发送消息到 fanout 交换器,但是交换器会忽略路由键,所以 apple 队列、banana 队列、orange 队列都符合。
在这里插入图片描述topic
路由键通配符匹配
当你发送一条消息到 topic 交换器时,它会根据路由键通配符匹配去寻找绑定到此交换器上的匹配成功的队列,然后投递消息。
生产者使用路由键 “fruit.apple” 发送消息到 topic 交换器,交换器会根据绑定信息,通配符匹配路由键,所以 apple 队列、banana 队列、orange 队列都符合。

可以使用操作符 “#” 配置所有的规则。
“*” 操作符将 “.” 视为分割符。
“#” 操作符没有分块的概念,它将任意 “.” 字符均视为关键字的匹配部分。

在这里插入图片描述参考:https://blog.csdn.net/nextyu/article/details/79265676
四.RabbitMQ如何使用?
例1.生产者和消费者客户端
使用go语言的amqp包实现客户端。
生产者客户端

package main

import(
	"fmt"
	"log"
	"github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
	if err != nil {
	  log.Fatalf("%s: %s", msg, err)
	}
  }
func main()  {
	  fmt.Println("rabbitMQ study")
	  //连接到服务器
	  conn, err := amqp.Dial("amqp://guest:guest@localhost: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")
	  
	  //把消息发布到队列中
	  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")
}

消费者客户端

package main

import (
  "log"

  "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
  if err != nil {
    log.Fatalf("%s: %s", msg, err)
  }
}
func main()  {
  //打开一个连接
  conn, err := amqp.Dial("amqp://guest:guest@localhost: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")
  
  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
}

问题:为何此处没有使用交换器呢?
使用了默认交换器“”//exchange

err = ch.Publish(
  "",     // exchange
  q.Name, // routing key
  false,  // mandatory
  false,  // immediate
  amqp.Publishing{
    ContentType: "text/plain",
    Body:        []byte(body),
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiZhi_BUAA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值