# rabbitmq-demo ## Demo 简介 该 Demo 演示了利用 RabbitMQ 官方库完成 Go 语言的生产消费模型搭建 ## 目录结构 ``` bash ├── certs # 证书文件 │   ├── ca_certificate.pem │   ├── client_certificate.pem │   └── client_key.pem ├── deploy # 部署相关文件 │   ├── docker-compose.yml │   ├── docker-compose1.yml │   ├── rabbitmq.conf │   └── rabbitmq.env ├── publisher # 生产者端代码 │   ├── publisher.go │   └── ssl # tls 连接代码 │   └── publisher_with_ssl.go └── receiver # 消费者端代码 ├── message_release # without auto ack 代码 │   └── receiver_with_release.go ├── receiver.go └── ssl # tls 连接代码 └── receiver.go ``` ## Demo分析 ### AMQP 协议简介 1. [Golang AMQP 1.0 协议](github.com/rabbitmq/rabbitmq-amqp-go-client/pkg/rabbitmqamqp) 2. [Golang AMQP 0.91 协议](github.com/rabbitmq/amqp091-go) ### Publisher 部分 * 利用 `rmq.NewEnvironment()` 方法创建连接使用的环境变量 * 利用 `env.NewConnection()` 方法连接 RabbitMQ 服务端 * 利用 `amqpConnection.Management()` 方法创建生产端管理模块 * 利用 `management.Bind()` 方法创建 `Exchange` 、`Queue` 的绑定关系 ### Receiver 部分 Receiver 部分管理与 RabbitMQ 服务端方法一致,但由于RabbitMQ 官方 AMQP 1.0 库不支持读取死信队列内消息,故死信队列消息读取切换为AMQP 0.91 协议 #### 死信队列处理 利用 `github.com/rabbitmq/amqp091-go` 库进行死信队列消息的读取 * 利用 `amqp.Dial()` 方法连接 RabbitMQ 服务端 ### SSL 部分 * 利用 `os.ReadFile()` 、 `x509.NewCertPool()` 方法读取 `CA` 文件 * 利用 `os.ReadFile()` 、 `pem.Decode()` 、 ` pkcs8.ParsePKCS8PrivateKey()`、 `x509.MarshalPKCS8PrivateKey()`、 `tls.X509KeyPair()` 等方法创建 `TLS` 配置