文章目录
一、说明
该工程为HTTP请求+RocketMQ的灰度路由功能演示,所有源码均有AI生成。
GitHub 地址:yangzhen/spring-demo,推荐大家点下源码,功能、测试case、脚本,非常具有欣赏性。
⏱️ 总时间:持续2 周,累计投入约 6小时。
💸 AI 工具成本:约 11 USD(VSCode + Cline + Claude)。
🧠 模式:使用 DeepSeek+ChatGPT 精炼提示词 。
二、核心组件职责
组件 | 职责 | 灰度实现方式 |
---|---|---|
Gateway | 入口路由 | 解析gray头部,路由到对应版本Consumer |
Consumer | 业务处理 | 根据灰度标识调用对应版本Provider |
Provider | 数据提供 | 多版本部署,提供不同业务逻辑 |
Nacos | 服务发现 | 通过metadata区分服务版本 |
RocketMQ | 消息队列 | 使用Tag机制实现消息版本隔离 |
三、关键功能:灰度 + RocketMQ 流程揭秘
- 全链路透传灰度标识:Gateway 中 GlobalFilter 捕获传入 header.gray,并递交 downstream。
- 灰度注册服务:consumer/provider 实例注册至 Nacos,携带 metadata.gray-version(如 gray-feat1/gray-feat2/normal)。
- 灰度 HTTP 路由:Consumer 发起 HTTP 请求时,根据 LoadBalancer 自动选择相应 provider。
- RocketMQ 消息发布:Consumer 调用 provider 时发送 MQ 消息,消息带 gray 属性。
- MQ 灰度消费:provider MQ listener注册时添加tag订阅,使用RocketMQ Tag机制在MQ层面实现消息路由,避免不必要的消息投递。
四、灰度路由
4.1 整体架构
4.2 HTTP请求灰度路由泳道
4.3 RocketMQ请求灰度路由泳道
五、提示词
第一轮:HTTP请求灰度路由
请根据以下需求,生成 consumer 调用 provider 的代码示例,实现基于灰度标识的动态路由:
【需求背景】
- consumer 使用 Java8 + Spring Boot 2.7.18 + Spring Cloud 2021.x + Spring Cloud LoadBalancer
- provider 注册到 Nacos,多个实例:
- gray-feat1(metadata.gray-version=gray-feat1)
- gray-feat2(metadata.gray-version=gray-feat2)
- normal(metadata.gray-version=normal)
【功能要求】
1. consumer 调用 provider /provider/hello 接口
2. 使用 RestTemplate + LoadBalancer
3. 实现自定义 ServiceInstanceListSupplier,逻辑如下:
- 读取请求 header.gray
- 若 gray=gray-feat1 ➔ 仅调用 metadata.gray-version=gray-feat1 的 provider 实例
- 若 gray=gray-feat2 ➔ 仅调用 metadata.gray-version=gray-feat2 的 provider 实例
- 无 gray header ➔ 调用 metadata.gray-version=normal 的 provider 实例
- 若 gray 指定实例不存在 ➔ fallback 到 normal
【目标】
我希望 consumer 根据 header.gray 实现真正的灰度路由,调用 provider 对应灰度版本实例,而非默认轮询所有实例。
请严格按上述结构与逻辑输出完整代码,便于我直接复制到工程验证。
第二轮:RocketMQ请求灰度路由
请帮我生成一套基于 Spring Boot 2.7.18 + Spring Cloud 2021.x + RocketMQ 的微服务 DEMO,要求如下:
1. 包含 3 个服务:gateway(Spring Cloud Gateway)、consumer、provider,全部注册到 Nacos。(已实现)
2. 请求流程:客户端 → gateway → consumer → provider。(已实现)
3. consumer 服务访问 provider 接口的同时,发送 RocketMQ 消息(含 header.gray 字段)。
4. provider 服务消费 MQ 消息时,按 gray 头部路由到灰度版本实例。
5. 每个 provider 实例配置 `spring.cloud.nacos.discovery.metadata.gray-version`。
6. 要求灰度实例严格匹配 gray-version,无匹配实例不消费。
7. 所有服务具备本地可运行配置(application.yml + RocketMQ 本地地址)。
第三轮:提示词纠偏
- 网关请求下游路由,初期为在yml提前配置,非Nacos动态注册发现
- consumer请求provider,初期灰度路由基于ReactorServiceInstanceLoadBalancer,生成demo一直无法跑通
- RocketMQ消息中间件,初期灰度路由为RocketMQ消费时候过滤