路径规范如果只靠约定文档,迟早会跑偏。项目把 /api/{版本}/{模块} 做成自动配置,由服务名和配置推导前缀,Controller 只保留资源路径。
一、路径结构
/api/v1/provider/user/1
│ │ │
│ │ └── 模块名:来自 service-provider
│ └────── 版本:来自 zjc.api.versions
└────────── 根路径:默认 /api
service-provider 会截取最后一个短横线后的 provider,生成 /api/v1/provider。
二、版本必须显式配置
zjc:
api:
prefix: /api
versions:
- v1
至少要配置一个版本;默认版本必须在版本列表内。启动时校验配置,避免服务带着含糊的路径规则上线。
三、Controller 不写全局前缀
Controller 里只写:
@GetMapping("/user/{id}")
实际暴露路径由公共模块追加。这样模块名、版本规则调整时,业务代码不需要大面积修改。
四、网关规则更简单
所有业务服务都遵守同一规范后,网关可以使用:
/api/*/provider/**
/api/*/consumer/**
/api/*/mail/**
不用为每个资源单独建路由。
五、经验总结
路径规范一旦可执行,就不再依赖自觉。服务名、版本、模块名和 OpenAPI 分组可以保持同一套推导逻辑。