多微服务OpenAPI代码生成重复组件:如何避免前端TypeScript文件重复?
要不要合并两个微服务的API?
没必要硬合并。微服务拆分的核心是业务解耦,强行合并会破坏架构设计的初衷,除非这两个API从业务逻辑上本来就属于同一个服务范畴。我们应该从OpenAPI规范复用和代码生成配置层面解决重复文件问题。
具体解决方案
1. 抽离共用Schema到独立的OpenAPI文件
把ContactInfo这类跨API共用的组件单独定义在一个公共的OpenAPI规范文件(比如common-components.yaml)里,然后在API A和API B的OpenAPI文件中通过$ref引用该文件的内容:
# common-components.yaml openapi: 3.0.3 components: schemas: ContactInfo: type: object properties: name: type: string phone: type: string email: type: string
在API A的OpenAPI文件中引用:
# api-a.yaml openapi: 3.0.3 # ... 其他配置 components: schemas: ContactInfo: $ref: './common-components.yaml#/components/schemas/ContactInfo' # API A专属的其他Schema
API B的OpenAPI文件做同样的引用配置。这样在生成代码时,只要让OpenAPI Generator识别到公共组件的引用关系,就能统一生成一份类型文件。
2. 配置OpenAPI Generator统一输出公共模型
针对Angular的TypeScript生成器,通过命令行参数指定公共模型的输出目录,让两个API的生成脚本共享同一目录:
生成API A代码的命令:
openapi-generator generate -i api-a.yaml -g typescript-angular -o ./src/app/api-a --model-package ../shared/models
生成API B代码的命令:
openapi-generator generate -i api-b.yaml -g typescript-angular -o ./src/app/api-b --model-package ../shared/models
这样两个API的模型都会输出到src/app/shared/models目录,重复的Schema会自动复用已生成的文件(如果内容一致,生成器默认不会重复覆盖,也可以添加--skip-overwrite参数明确跳过已存在的文件)。
3. 手动维护公共类型(适合小型项目)
如果共用组件数量不多,可以手动在Angular项目的共享目录创建contact-info.ts,然后通过配置让生成器跳过生成该文件:
创建openapi-generator-ignore文件,添加需要忽略的路径:
src/app/api-a/models/contactInfo.ts src/app/api-b/models/contactInfo.ts
生成代码时,生成器会自动跳过这些文件,你只需要在API的调用代码中手动导入共享目录的ContactInfo类型即可。
总结
优先通过复用OpenAPI Schema和配置生成器参数解决重复文件问题,保留微服务的架构优势。只有当两个微服务的业务边界模糊、API耦合度极高时,再考虑合并API的方案。
内容的提问来源于stack exchange,提问作者AdriL.

