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` 配置
|