SpringDoc + Spring Gateway + Knife4j 集成

前言

如果有必要使用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的页面

猜你喜欢

转载自blog.csdn.net/qq_39609993/article/details/126136180