引入依赖
gateway 需要引入 springdoc 的 webflux 类型依赖
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webflux-ui</artifactId>
</dependency>
编写代码
- 只在gateway启动时获取服务,不会定时刷新
@Component
public class SwaggerProvider {
public static final String API_URI = "/%s/v3/api-docs";
@Bean
public List<GroupedOpenApi> apis(SwaggerUiConfigProperties configProperties, RouteDefinitionLocator routeLocator) {
List<GroupedOpenApi> groups = new ArrayList<>();
// 获取所有可用的服务地址
List<RouteDefinition> definitions = routeLocator.getRouteDefinitions().collectList().block();
if (CollectionUtils.isEmpty(definitions)) {
return groups;
}
Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> urls = new HashSet<>();
definitions.stream().filter(route -> route.getUri().getHost() != null)
.distinct()
.forEach(route -> {
String name = route.getUri().getHost();
AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl();
swaggerUrl.setName(name);
swaggerUrl.setUrl(String.format(API_URI, name));
urls.add(swaggerUrl);
}
);
configProperties.setUrls(urls);
return groups;
}
}
- 定时刷新,获取最新注册的服务
@Component
@EnableScheduling
public class SwaggerProvider {
public static final String API_URI = "/%s/v3/api-docs";
private final SwaggerUiConfigProperties configProperties;
private final RouteDefinitionLocator routeLocator;
public SwaggerProvider(SwaggerUiConfigProperties configProperties, RouteDefinitionLocator routeLocator) {
this.configProperties = configProperties;
this.routeLocator = routeLocator;
}
@Scheduled(fixedDelay = 5)
public void apis() {
// 获取所有可用的服务地址: host
List<RouteDefinition> definitions = routeLocator.getRouteDefinitions().collectList().block();
if (CollectionUtils.isEmpty(definitions)) {
return;
}
Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> urls = new HashSet<>();
definitions.stream().filter(route -> route.getUri().getHost() != null)
.distinct()
.forEach(route -> {
String name = route.getUri().getHost();
AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl();
swaggerUrl.setName(name);
swaggerUrl.setUrl(String.format(API_URI, name));
urls.add(swaggerUrl);
}
);
configProperties.setUrls(urls);
}
}