统一 API 路径约定 api 版本模块

zjc 于 2026-08-19 发布

路径规范如果只靠约定文档,迟早会跑偏。项目把 /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

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-provider/src/main/resources/config/application-api.yaml

至少要配置一个版本;默认版本必须在版本列表内。启动时校验配置,避免服务带着含糊的路径规则上线。

三、Controller 不写全局前缀

Controller 里只写:

@GetMapping("/user/{id}")

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-provider/src/main/java/com/zjc/provider/controller/UserController.java

实际暴露路径由公共模块追加。这样模块名、版本规则调整时,业务代码不需要大面积修改。

四、网关规则更简单

所有业务服务都遵守同一规范后,网关可以使用:

/api/*/provider/**
/api/*/consumer/**
/api/*/mail/**

不用为每个资源单独建路由。

五、经验总结

路径规范一旦可执行,就不再依赖自觉。服务名、版本、模块名和 OpenAPI 分组可以保持同一套推导逻辑。