# RabbitMQ 消息队列网关模式 **Repository Path**: ray_1998/MsgGatewayDemo ## Basic Information - **Project Name**: RabbitMQ 消息队列网关模式 - **Description**: 核心是通过 消息网关服务 C 解耦 A 和 B 之间的直接依赖,让它们只需要知道"发消息",而不用关心谁处理。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-25 - **Last Updated**: 2026-03-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MsgGatewayDemo — 消息网关架构示例 ## 架构说明 ``` A → 发消息到 RabbitMQ → C(消息网关服务)→ 调用 A 的 HTTP API A → 发消息到 RabbitMQ → C(消息网关服务)→ 调用 B 的 HTTP API B → 发消息到 RabbitMQ → C(消息网关服务)→ 调用 A 的 HTTP API B → 发消息到 RabbitMQ → C(消息网关服务)→ 调用 B 的 HTTP API ``` A 和 B **不直接调用对方**,只管往 MQ 里扔消息,C 负责路由和转发。 ## 项目结构 ``` MsgGatewayDemo/ ├── ServiceA/ # 业务服务 A(端口 5001) ├── ServiceB/ # 业务服务 B(端口 5002) ├── ServiceC/ # 消息网关服务(端口 5003) └── docker-compose.yml # 一键启动 ``` ## 快速启动 ### 方式一:本地直接运行(需要本地 RabbitMQ + Redis) ```bash # 终端 1 - 启动 ServiceA cd ServiceA dotnet run # 终端 2 - 启动 ServiceB cd ServiceB dotnet run # 终端 3 - 启动 ServiceC(网关) cd ServiceC dotnet run ``` ### 方式二:Docker Compose 一键启动 ```bash cd MsgGatewayDemo docker-compose up --build ``` ## 测试流程 ### 1. A → MQ → C → B(跨服务通知) ```http POST http://localhost:5001/api/Send/to-b Content-Type: application/json { "action": "UserCreated", "payload": { "userId": 123, "name": "张三" } } ``` 预期结果:ServiceC 日志显示 "转发成功 → ServiceB",ServiceB 日志显示 "收到回调" ### 2. B → MQ → C → A(反向通知) ```http POST http://localhost:5002/api/Send/to-a Content-Type: application/json { "action": "OrderPaid", "payload": { "orderId": 456, "amount": 99.9 } } ``` ### 3. A → MQ → C → A(自发自收) ```http POST http://localhost:5001/api/Send/to-self Content-Type: application/json { "action": "SelfCheck", "payload": { "note": "自检" } } ``` ## 端口一览 | 服务 | 地址 | Swagger | |--------|------------------------|----------------------------------| | ServiceA | http://localhost:5001 | http://localhost:5001/swagger | | ServiceB | http://localhost:5002 | http://localhost:5002/swagger | | ServiceC | http://localhost:5003 | http://localhost:5003/swagger | | RabbitMQ 管理界面 | http://localhost:15672 | guest / guest | ## 关键设计 | 特性 | 实现方式 | |------|---------| | 消息解耦 | A/B 只写 MQ,不直接调用对方 | | 幂等性去重 | ServiceC 用 Redis 记录已处理的 MessageId(TTL 24h)| | 消息持久化 | Exchange / Queue / Message 均 durable=true | | 公平分发 | BasicQos(prefetchCount=1) | | 失败重试 | 转发失败 BasicNack + requeue=true | | 路由扩展 | 只需在 ServiceC 的 appsettings.json ServiceRoutes 中加新服务 |