From 7aaf993d30d25537d9061d050f9f46098360a988 Mon Sep 17 00:00:00 2001 From: douxu Date: Fri, 18 Jul 2025 16:24:48 +0800 Subject: [PATCH] refactor(add-rabbitMQ-demo-with-go-language): 1. add demo of without auto ack 2.add demo of ssl conn http://server.baseware.net:9000/project/datart/us/2?milestone=6 --- rabbitmq_example/README.md | 61 +++++++++++++++++++ .../{ => deploy}/docker-compose.yml | 0 .../{ => deploy}/docker-compose1.yml | 0 rabbitmq_example/{ => deploy}/rabbitmq.conf | 0 rabbitmq_example/{ => deploy}/rabbitmq.env | 0 rabbitmq_example/go.mod | 15 +++++ rabbitmq_example/go.sum | 46 ++++++++++++++ 7 files changed, 122 insertions(+) create mode 100644 rabbitmq_example/README.md rename rabbitmq_example/{ => deploy}/docker-compose.yml (100%) rename rabbitmq_example/{ => deploy}/docker-compose1.yml (100%) rename rabbitmq_example/{ => deploy}/rabbitmq.conf (100%) rename rabbitmq_example/{ => deploy}/rabbitmq.env (100%) create mode 100644 rabbitmq_example/go.mod create mode 100644 rabbitmq_example/go.sum diff --git a/rabbitmq_example/README.md b/rabbitmq_example/README.md new file mode 100644 index 0000000..d33dad0 --- /dev/null +++ b/rabbitmq_example/README.md @@ -0,0 +1,61 @@ +# 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` 配置 diff --git a/rabbitmq_example/docker-compose.yml b/rabbitmq_example/deploy/docker-compose.yml similarity index 100% rename from rabbitmq_example/docker-compose.yml rename to rabbitmq_example/deploy/docker-compose.yml diff --git a/rabbitmq_example/docker-compose1.yml b/rabbitmq_example/deploy/docker-compose1.yml similarity index 100% rename from rabbitmq_example/docker-compose1.yml rename to rabbitmq_example/deploy/docker-compose1.yml diff --git a/rabbitmq_example/rabbitmq.conf b/rabbitmq_example/deploy/rabbitmq.conf similarity index 100% rename from rabbitmq_example/rabbitmq.conf rename to rabbitmq_example/deploy/rabbitmq.conf diff --git a/rabbitmq_example/rabbitmq.env b/rabbitmq_example/deploy/rabbitmq.env similarity index 100% rename from rabbitmq_example/rabbitmq.env rename to rabbitmq_example/deploy/rabbitmq.env diff --git a/rabbitmq_example/go.mod b/rabbitmq_example/go.mod new file mode 100644 index 0000000..be19039 --- /dev/null +++ b/rabbitmq_example/go.mod @@ -0,0 +1,15 @@ +module rabbitmq_example + +go 1.24.1 + +require ( + github.com/Azure/go-amqp v1.4.0 + github.com/rabbitmq/amqp091-go v1.10.0 + github.com/rabbitmq/rabbitmq-amqp-go-client v0.1.1 + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 +) + +require ( + github.com/google/uuid v1.6.0 // indirect + golang.org/x/crypto v0.22.0 // indirect +) diff --git a/rabbitmq_example/go.sum b/rabbitmq_example/go.sum new file mode 100644 index 0000000..a378fae --- /dev/null +++ b/rabbitmq_example/go.sum @@ -0,0 +1,46 @@ +github.com/Azure/go-amqp v1.4.0 h1:Xj3caqi4comOF/L1Uc5iuBxR/pB6KumejC01YQOqOR4= +github.com/Azure/go-amqp v1.4.0/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM= +github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= +github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= +github.com/rabbitmq/rabbitmq-amqp-go-client v0.1.1 h1:1J5coTThj/aUtXIcF3MPutixEuWS8wNimYhB1yvdS24= +github.com/rabbitmq/rabbitmq-amqp-go-client v0.1.1/go.mod h1:sWDACr1vf9I61KNzh3tJ5pIdKXYsMXNrRpuayaNaKxg= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=