【Golang】Golang+RabbitMQ的牛刀小试

项目简介

使用 RabbitMQ 的 Go 客户端库 github.com/streadway/amqp 来连接到 RabbitMQ 并进行消息传递。它演示了 RabbitMQ 的基本功能,包括声明队列、发布消息和消费消息等。

关于RabbitMQ

RabbitMQ 是一种开源消息代理和消息队列系统,它实现了高级消息队列协议(AMQP),可以通过多种编程语言(包括 Golang、Java、Python、Ruby 等)来与之交互。

RabbitMQ 基于 Erlang 编写,拥有很高的可扩展性和高可用性,可以处理大量的消息,并支持多种消息传递模式,包括点对点、发布-订阅、请求-应答等。

使用 RabbitMQ,您可以轻松地将不同的应用程序和系统连接在一起,实现松耦合的系统架构,并提供了消息传递和异步通信的优秀解决方案。同时,RabbitMQ 也支持消息持久化、消息确认、消息路由和消息过滤等高级特性,可以满足不同场景下的需求。

总的来说,RabbitMQ 是一个功能强大、可靠性高、易于使用的消息代理和消息队列系统,是构建可靠、高性能、分布式系统的理想选择。

项目目录

在这里插入图片描述

项目代码

  • producer.go
package main

import (
	"fmt"
	"log"

	"github.com/streadway/amqp"
)

func main() {
    
    
	// Connect to RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
    
    
		log.Fatal("Error connecting to RabbitMQ", err)
	}
	defer conn.Close()

	// Create a channel
	ch, err := conn.Channel()
	if err != nil {
    
    
		log.Fatal("Error creating channel", err)
	}
	defer ch.Close()

	// Declare a queue
	q, err := ch.QueueDeclare(
		"test-queue", // Queue name
		false,        // Durable
		false,        // Delete when unused
		false,        // Exclusive
		false,        // No-wait
		nil,          // Arguments
	)
	if err != nil {
    
    
		log.Fatal("Error declaring queue", err)
	}

	// Publish messages to the queue
	for i := 0; i < 10; i++ {
    
    
		message := fmt.Sprintf("Hello, World! %d", i)
		err := ch.Publish(
			"",    // Exchange
			q.Name, // Routing key
			false, // Mandatory
			false, // Immediate
			amqp.Publishing{
    
    
				ContentType: "text/plain",
				Body:        []byte(message),
			},
		)

		if err != nil {
    
    
			log.Fatal("Error publishing message", err)
		}
	}

	fmt.Println("Messages published successfully!")
}

  • consumer.go
package main

import (
	"fmt"
	"log"

	"github.com/streadway/amqp"
)

func main() {
    
    
	// Connect to RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
    
    
		log.Fatal("Error connecting to RabbitMQ", err)
	}
	defer conn.Close()

	// Create a channel
	ch, err := conn.Channel()
	if err != nil {
    
    
		log.Fatal("Error creating channel", err)
	}
	defer ch.Close()

	// Declare a queue
	q, err := ch.QueueDeclare(
		"test-queue", // Queue name
		false,        // Durable
		false,        // Delete when unused
		false,        // Exclusive
		false,        // No-wait
		nil,          // Arguments
	)
	if err != nil {
    
    
		log.Fatal("Error declaring queue", err)
	}

	// Consume messages from the queue
	msgs, err := ch.Consume(
		q.Name, // Queue name
		"",     // Consumer name
		true,   // Auto-acknowledge
		false,  // Exclusive
		false,  // No-local
		false,  // No-wait
		nil,    // Arguments
	)
	if err != nil {
    
    
		log.Fatal("Error consuming messages", err)
	}

	// Read messages from the channel
	for msg := range msgs {
    
    
		fmt.Println("Received message:", string(msg.Body))
	}
}

项目运行效果

  • producer.go
    在这里插入图片描述
  • consumer.go

在这里插入图片描述

  • RabbitMQ web
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/linjiuxiansheng/article/details/130002928
今日推荐