我是靠谱客的博主 顺心书本,最近开发中收集的这篇文章主要介绍go语言学习--RabbitMQ学习(概论及hellowold实例),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.什么是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),
})

最后

以上就是顺心书本为你收集整理的go语言学习--RabbitMQ学习(概论及hellowold实例)的全部内容,希望文章能够帮你解决go语言学习--RabbitMQ学习(概论及hellowold实例)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部