如何在Spring Cloud网关中聚合多个Springwolf文档?
聚合Springwolf文档到Spring Cloud网关的实现方案
核心思路
Springwolf没有类似Swagger的SwaggerUiConfigParameters类,但可以通过其提供的SpringwolfUiProperties配置类,动态从网关路由中提取服务信息,批量添加各个微服务的Springwolf文档地址,实现聚合效果。
步骤与代码实现
前置准备
- 所有微服务已集成Springwolf,且
/springwolf/docs端点可通过网关正常访问 - 网关项目已引入Springwolf UI依赖(若未添加,需在pom.xml或build.gradle中引入对应依赖)
- 所有微服务已集成Springwolf,且
编写网关配置类
@Configuration public class SpringwolfAggregationConfig { @Bean public CommandLineRunner configureSpringwolfUi( RouteDefinitionLocator locator, SpringwolfUiProperties springwolfUiProperties) { return args -> { // 从网关路由中提取符合命名规则的服务名 List<String> serviceNames = Objects.requireNonNull(locator.getRouteDefinitions().collectList().block()) .stream() .map(RouteDefinition::getId) .filter(id -> id.matches(".*-service")) .map(id -> id.replace("-service", "")) .toList(); // 为每个服务构建Springwolf文档的网关访问地址 List<SpringwolfUiProperties.BaseUrl> serviceDocsUrls = serviceNames.stream() .map(serviceName -> { SpringwolfUiProperties.BaseUrl baseUrl = new SpringwolfUiProperties.BaseUrl(); baseUrl.setName(serviceName); // 根据你的网关路由规则调整URL,示例为/{serviceName}/springwolf/docs baseUrl.setUrl("/" + serviceName + "/springwolf/docs"); return baseUrl; }) .toList(); // 将聚合地址设置到Springwolf UI配置中 springwolfUiProperties.setBaseUrls(serviceDocsUrls); }; } }
注意事项
- 路由规则适配:如果你的网关路由不是以服务名作为前缀,需要修改URL构建逻辑,确保指向对应服务的
/springwolf/docs端点 - 版本兼容:部分旧版本Springwolf的
SpringwolfUiProperties中baseUrls的类型为List<Map<String, String>>,需调整代码为:List<Map<String, String>> serviceDocsUrls = serviceNames.stream() .map(serviceName -> { Map<String, String> urlMap = new HashMap<>(); urlMap.put("name", serviceName); urlMap.put("url", "/" + serviceName + "/springwolf/docs"); return urlMap; }) .toList(); springwolfUiProperties.setBaseUrls(serviceDocsUrls); - 跨域处理:若网关与微服务存在跨域问题,需在网关或微服务的Springwolf配置中开启跨域支持
内容的提问来源于stack exchange,提问作者Momchil Trenchev
相关产品推荐
相关产品推荐

