[RabbitMQ] golang 클라이언트 튜토리얼 1 - HelloWorld

1. 소개

이 튜토리얼에서는 RabbitMQ가 로컬 시스템의 표준 포트(5672)에 설치되어 실행 중이라고 가정합니다. 다른 호스트, 포트 또는 자격 증명을 사용하는 경우 연결 설정을 조정해야 합니다. RabbitMQ를 설치하지 않은 경우 이전 기사 Linux 시스템 서버 설치 RabbitMQ를 찾아볼 수 있습니다.

RabbitMQ는 메시지 브로커입니다. 메시지를 수락하고 전달합니다. 우체국처럼 생각할 수 있습니다. 배달하려는 메일을 우편함에 넣으면 Mr. 또는 Ms. Postman이 결국 받는 사람에게 배달할 것이라고 확신할 수 있습니다. 이 은유에서 RabbitMQ는 우편함, 우체국, 우체부입니다.

RabbitMQ와 우체국의 주요 차이점은 종이를 다루지 않고 대신 이진 데이터 청크 메시지를 수락, 저장 및 전달한다는 것입니다.

RabbitMQ 및 메시징은 일반적으로 일부 용어를 사용합니다.

  • 생산은 단지 보내는 것을 의미합니다. 메시지를 보내는 프로그램이 생산자입니다.
    여기에 이미지 설명 삽입

  • 대기열은 RabbitMQ 내부에 있는 사서함의 이름입니다. 메시지는 RabbitMQ와 애플리케이션을 통해 흐르지만 대기열에만 저장할 수 있습니다. 대기열은 호스트의 메모리 및 디스크 제한에 의해서만 제한되며 사실상 하나의 큰 메시지 버퍼입니다. 많은 생산자가 대기열에 메시지를 보낼 수 있고 많은 소비자가 대기열에서 데이터 수신을 시도할 수 있습니다. 대기열을 나타내는 방법은 다음과 같습니다.
    여기에 이미지 설명 삽입

  • 소비한다는 것은 받는 것과 비슷한 의미를 갖는다. 소비자는 주로 메시지 수신을 기다리는 프로그램입니다.
    여기에 이미지 설명 삽입
    생산자, 소비자 및 브로커가 동일한 호스트에 있을 필요는 없습니다. 실제로 대부분의 응용 프로그램에서는 그렇지 않습니다. 애플리케이션은 생산자이자 소비자가 될 수 있습니다.

둘, Hello World

튜토리얼의 이 부분에서는 Go로 두 개의 작은 프로그램을 작성합니다. 단일 메시지를 보내는 생산자와 메시지를 수신하고 인쇄하는 소비자입니다. Go-RabbitMQ API의 일부 세부 정보는 무시하고 자습서를 시작하기 위해 매우 간단한 사항에만 집중합니다. 이것은 "Hello World"의 메시징 버전입니다.

아래 다이어그램에서 "P"는 생산자이고 "C"는 소비자입니다. 중간 상자는 큐(소비자를 대신하여 RabbitMQ가 보관하는 메시지 버퍼)입니다.

여기에 이미지 설명 삽입

RabbitMQ는 여러 프로토콜을 사용합니다. 이 자습서에서는 개방형 범용 메시징 프로토콜인 amqp0-9-1을 사용합니다. RabbitMQ에는 다양한 언어로 된 클라이언트가 있습니다. 이 자습서에서는 Go amqp 클라이언트를 사용합니다.

먼저 go get을 사용하여 amqp를 설치합니다.

go get github.com/streadway/amqp

3. 보내기

여기에 이미지 설명 삽입
메시지 게시자(발신자) 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.DialRabbitMQ에 연결을 설정하는 데 사용되는 기능이 있습니다 . AMQP이 함수의 인수는 RabbitMQ 서버에 대한 연결 문자열입니다.

amqp://<username>:<password>@<host>:<port>/<vhost>
  • username : RabbitMQ 사용자의 사용자 이름입니다.
  • 암호: RabbitMQ 사용자의 암호입니다.
  • 호스트: RabbitMQ 서버의 호스트 이름 또는 IP 주소입니다.
  • port: RabbitMQ 서버의 포트 번호입니다.
  • vhost: 연결해야 하는 가상 호스트.

연결은 소켓 연결을 추상화하고 프로토콜 버전 협상 및 인증 등을 처리합니다. 다음으로 작업을 완료하기 위한 대부분의 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:[email protected]: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)
}

4. 보내기

위는 게시자입니다. 소비자는 RabbitMQ의 메시지를 수신하므로 단일 메시지를 게시하는 게시자와 달리 메시지를 수신하고 인쇄하기 위해 소비자를 계속 실행합니다.
여기에 이미지 설명 삽입
이 코드( receive.goin)에는 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:[email protected]: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")

여기에서도 대기열을 선언합니다. 게시자보다 먼저 소비자를 시작할 수 있으므로 대기열에서 메시지를 사용하려고 시도하기 전에 대기열이 존재하는지 확인하려고 합니다.

대기열에서 메시지를 전달하도록 서버에 지시합니다. 비동기식으로 메시지를 보내므로 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

여기에 이미지 설명 삽입

go run receive.go 

여기에 이미지 설명 삽입

출처: https://www.rabbitmq.com/getstarted.html

Supongo que te gusta

Origin blog.csdn.net/m0_53328239/article/details/132004410
Recomendado
Clasificación