62 lines
1.9 KiB
Markdown
62 lines
1.9 KiB
Markdown
# 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` 配置
|