如何将多个Spring Boot应用的SwaggerUI合并为统一界面?
解决方案
一、可以实现单个SwaggerUI聚合所有应用的OpenAPI定义
完全可以像对接Prometheus那样,通过内部网络动态拉取各应用的OpenAPI文档,聚合到单个SwaggerUI中,无需对外暴露各应用的管理端口。
具体实现步骤
利用你已有的那个带SwaggerUI的Spring Boot应用,添加以下配置(基于springdoc-openapi 2.8.5版本),让它从内部网络访问其他应用管理端口上的OpenAPI定义:
- 确保所有应用都已添加springdoc依赖(和现有应用一致):
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.8.5</version> </dependency>
- 在已有SwaggerUI的应用的
application.properties或application.yml中添加聚合配置:
# 配置多个应用的OpenAPI文档地址(内部网络可访问的地址) springdoc.swagger-ui.urls[0].name=现有应用 springdoc.swagger-ui.urls[0].url=/v3/api-docs springdoc.swagger-ui.urls[1].name=应用2 springdoc.swagger-ui.urls[1].url=http://app2-internal:管理端口/v3/api-docs springdoc.swagger-ui.urls[2].name=应用3 springdoc.swagger-ui.urls[2].url=http://app3-internal:管理端口/v3/api-docs # 依次配置剩余3个应用
这样用户访问该应用的SwaggerUI时,就能通过页面顶部的下拉菜单切换查看所有6个应用的API文档,全程只用一个URL,且各应用的管理端口无需对外暴露(内部网络访问即可,和Prometheus对接Actuator的逻辑一致)。
二、替代方案:静态文件导入独立SwaggerUI容器
如果不想通过动态聚合的方式,也可以用springdoc-openapi-maven-plugin生成静态openapi.json文件,再导入独立的SwaggerUI Docker容器:
- 给每个应用添加maven插件配置:
<plugin> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-maven-plugin</artifactId> <version>2.8.0</version> <!-- 对应springdoc版本选择兼容版本 --> <executions> <execution> <phase>compile</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <apiDocsUrl>http://localhost:管理端口/v3/api-docs</apiDocsUrl> <outputFileName>openapi-appX.json</outputFileName> <outputDir>${project.build.directory}</outputDir> </configuration> </plugin>
- 生成所有应用的
openapi-appX.json文件后,部署SwaggerUI Docker容器,将这些文件挂载到容器的指定目录(比如/usr/share/nginx/html/docs),然后修改SwaggerUI的配置文件(swagger-initializer.js),添加多个文档的入口:
window.onload = function() { window.ui = SwaggerUIBundle({ urls: [ { name: "应用1", url: "/docs/openapi-app1.json" }, { name: "应用2", url: "/docs/openapi-app2.json" } // 其他应用配置 ], dom_id: '#swagger-ui', // 其他默认配置 }); };
不过这种方式需要手动维护静态文件,API变更后需重新生成并更新容器,灵活性不如动态聚合。
内容的提问来源于stack exchange,提问作者DJViking
相关产品推荐
相关产品推荐

