引入依賴
gateway 需要引入 springdoc 的 webflux 類型依賴
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webflux-ui</artifactId>
</dependency>
編寫代碼
- 只在gateway啟動(dòng)時(shí)獲取服務(wù),不會(huì)定時(shí)刷新
@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<>();
// 獲取所有可用的服務(wù)地址
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;
}
}
- 定時(shí)刷新,獲取最新注冊的服務(wù)
@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() {
// 獲取所有可用的服務(wù)地址: 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);
}
}