前言
如果有必要使用Spring Doc时,好像官方的文档相对较少,为此重新尝试了一把,SpringDoc的基本使用请查看官网,这里关键说下Spring Gateway 的配置。
POM.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webflux-ui</artifactId>
<version>1.6.9</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-springdoc-ui</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
application.xml
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
方式一:通过动态配置
@Configuration
public class SpringDocConfig {
protected final SwaggerUiConfigProperties swaggerUiConfigProperties;
protected final RouteDefinitionLocator routeDefinitionLocator;
public SpringDocConfig(SwaggerUiConfigProperties swaggerUiConfigProperties, RouteDefinitionLocator routeDefinitionLocator) {
this.swaggerUiConfigProperties = swaggerUiConfigProperties;
this.routeDefinitionLocator = routeDefinitionLocator;
}
@PostConstruct
public void autoInitSwaggerUrls() {
List<RouteDefinition> definitions = routeDefinitionLocator.getRouteDefinitions().collectList().block();
definitions.stream().forEach(routeDefinition -> {
AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl(
routeDefinition.getId().replace("ReactiveCompositeDiscoveryClient_", "").toLowerCase(),
routeDefinition.getUri().toString().replace("lb://", "").toLowerCase() + "/v3/api-docs"
);
Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> urls = swaggerUiConfigProperties.getUrls();
if (urls == null) {
urls = new LinkedHashSet<>();
swaggerUiConfigProperties.setUrls(urls);
}
urls.add(swaggerUrl);
});
}
}
原理是自动注入到gateway的服务,通过一定的规则 {name:service-id,url: service-id}的形式去自动添加到spring doc的url配置中。
方式二:通过配置文件指定
application.xml
springdoc:
swagger-ui:
urls:
- name: user-service
url: /user-service/v3/api-docs
- name: role-service
url: /role-service/v3/api-docs
这种方式可以根据所需明确指定swagger公开的服务及文档地址,但是不能主动发现和添加服务的Swagger接口
访问
通过 http://gateway-host/doc.html访问Knife4J的页面