如何使用Spring Boot承载两套不同的API服务?
针对你的场景的方案建议
拆分独立应用的合理性与并发问题说明
拆分两套API到独立Spring Boot应用是符合最佳实践的设计,完全不存在过度设计的问题:
- 两类API面向调用方、认证体系、权限规则完全不同:前端API面向C端/业务用户,开放全CRUD且返回字段需要做权限过滤;M2M API面向可信内部服务,仅开放读操作且返回全量字段。物理隔离彻底避免了单应用内多认证体系适配的hack实现,也不会出现权限配置错误导致的接口越权访问风险,同时两套应用可以独立做扩缩容、限流、日志审计等运维操作,适配不同的调用量需求。
- 该设计不会引发额外并发问题:两个应用仅作为访问层共享同一数据库,你已经限制了M2M API只有读操作,完全不会产生写冲突。就算后续M2M需要开放写能力,只要两类应用复用同一套数据层的事务、锁规则,和单应用访问数据库的并发表现完全一致,没有额外风险。
如果你的团队运维资源有限,也可以选择单应用的优雅实现方案:Spring Security 5.2及以上版本原生支持多OAuth2授权服务器配置,你只需要给两类API分配不同的路径前缀(比如前端API走/api/web/**,M2M API走/api/m2m/**),分别配置独立的SecurityFilterChain,各自绑定对应的授权服务器issuer、JWT校验规则即可实现逻辑隔离,实现成本也很低。
同仓库复用公共代码的实现方案
完全可以将两个应用放在同一代码仓库中,推荐用多模块架构实现代码复用:
- 抽取独立的公共core模块:存放所有公用的实体类、DAO层代码、通用业务Service、工具类等两套应用都需要调用的逻辑
- 新建两个独立的启动模块:
web-api模块存放前端侧的控制器、专属认证配置、web端业务逻辑;m2m-api模块存放M2M侧的控制器、对应授权服务器的认证配置、M2M专属业务逻辑 - 两个启动模块均依赖core模块,不需要重复开发数据层相关代码,同时两套应用的配置、专属逻辑完全隔离,后续如果需要拆分为独立仓库也可以快速实现。
这种单仓多模块的架构既可以实现代码复用,也支持独立打包、独立部署,不会引入代码耦合问题。
内容的提问来源于stack exchange,提问作者le-cardinal
相关产品推荐
相关产品推荐

