核心在于隔离、显式、可审计:保留规则须独立命名、禁用继承,存于reserved-proxies.yml并打标metadata:{reserved:true};动态路由注入前强制路径trie冲突检测,拒绝覆盖;运行时加载为不可变对象,全局filter跳过reserved路由;/actuator/reserved-routes端点只读暴露,ci/cd强管控变更。

避免在动态扩展运行时路由时误覆盖保留 Proxy 规则,核心在于**隔离、显式、可审计**——不是靠人工记忆哪条是“保留规则”,而是让系统天然拒绝冲突、自动识别覆盖、留痕每一次变更。
保留规则必须独立命名并禁用继承
所有保留类 Proxy 规则(如 /health、/metrics、/actuator、/gateway/admin)应定义在专属配置块中,不参与任何动态路由的继承链或模板复用:
- 禁止在 base.yml 或 shared-routes.yml 中定义保留路径;必须单独存为 reserved-proxies.yml,且仅被网关主配置
include,不被任何extends引用 - 为每条保留规则显式添加元数据标签,例如:
metadata: { reserved: true, owner: "platform" },供运行时校验器扫描识别 - 若使用 Spring Cloud Gateway,通过自定义
RouteDefinitionLocator过滤掉带reserved=true标签的路由参与动态刷新,从源头隔离
动态路由注入前强制执行路径冲突检测
每次触发路由热更新(如监听配置中心变更、调用 actuator/gateway/routes 端点),必须先执行静态路径分析,而非直接 reload:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 构建内存中当前全部路由的 路径前缀 Trie 树,对新注入的每条路由
Path=/api/v2/**向上逐级检查是否存在已注册的保留前缀(如/api、/)或精确匹配项(如/api/v2/health) - 检测到冲突时,拒绝加载并返回明确错误:「Route conflict: /api/v2/** overlaps reserved path /api/v2/health (reserved-proxies.yml#L12)」
- 支持白名单绕过机制,但需二次确认:仅当请求头含
X-Override-Reserved: <reason>+<approver></approver></reason>且通过 RBAC 鉴权后才放行
运行时保留规则加锁与只读保护
在网关进程内建立运行时保护层,防止任何中间件、Filter 或插件意外改写保留路由行为:
- 启动时将保留规则加载为 不可变 RouteDefinition 对象,其
getPredicates()和getFilters()返回不可修改集合(如Collections.unmodifiableList) - 所有全局 Filter(如鉴权、日志)在执行前检查当前匹配路由是否标记为
reserved,若是,则跳过 filter 执行,避免 StripPrefix、AddRequestHeader 等操作污染 - 暴露
/actuator/reserved-routes端点,只读返回当前生效的保留规则列表及加载来源,便于巡检和审计
配置即代码 + 变更门禁
把保留规则纳入 CI/CD 流水线强管控,杜绝手工覆盖:
- 所有保留规则 YAML 文件启用 Git 保护分支(如
main),合并 PR 必须通过 保留规则专用 Check:验证无路径重复、无非法字段(如不允许StripPrefix=0)、URI 不指向测试环境 - 流水线中插入
route-conflict-scan步骤,对比本次变更与基线分支的保留规则路径集,输出差异报告并阻断高风险变更 - 生产环境禁止通过 API 动态新增/删除保留规则,仅允许通过配置发布流程灰度生效,并附带 15 分钟回滚窗口期










