我选择的是自动注入方式,好处就是不需要在配置文件一个个去配置
yaml配置
spring:
‘cloud:
gateway:
discovery:
locator:
enabled: true
代码
依赖
<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>
注意:
env需要工程能区分出来dev和test等等环境
下面这段代码放在网关模块里
import com.eoi.goblin.common.utils.EmptyUtil;
import org.springdoc.core.AbstractSwaggerUiConfigProperties;
import org.springdoc.core.SwaggerUiConfigProperties;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionLocator;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import javax.annotation.PostConstruct;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* springdoc配置
*
* @author HuangJunHao
* @since 2022/10/12
*/
@Configuration
public class SpringDocConfig {
protected final SwaggerUiConfigProperties swaggerUiConfigProperties;
protected final RouteDefinitionLocator routeDefinitionLocator;
protected final Environment env;
public SpringDocConfig(SwaggerUiConfigProperties swaggerUiConfigProperties, RouteDefinitionLocator routeDefinitionLocator, Environment env) {
this.swaggerUiConfigProperties = swaggerUiConfigProperties;
this.routeDefinitionLocator = routeDefinitionLocator;
this.env = env;
}
@PostConstruct
public void autoInitSwaggerUrls() {
String[] activeProfiles = env.getActiveProfiles();
//只有dev环境才加载doc文档
if (EmptyUtil.notEmpty(activeProfiles) && "dev".equals(activeProfiles[0])) {
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);
});
}
}
}
不是dev访问的就是如下效果
访问路径
http://gateway-host/doc.html
gateway-host:网关的地址
我的是:http://localhost:8080/doc.html#/home