java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > swagger整合gateway实现文档集中化

swagger整合gateway实现文档集中化过程

作者:哀愁

本文介绍了如何将Swagger与Spring Cloud Gateway整合,实现API文档的集中化管理,通过Spring Boot的自动装配,配置了网关Swagger资源提供程序,实现了通过gateway路由的方式聚合Swagger文档,整个过程包括了文件夹结构、自动装配文件内容等详细步骤

swagger整合gateway文档集中化

swagger的公用配置

@ConfigurationProperties("my.swagger")
@Getter
@Setter
public class SwaggerProperties {
    /**
     * swagger2默认的url后缀
     */
    private String swagger2Url = "/v2/api-docs";

    private String oas30Url = "/v3/api-docs";

    private String swaggerVersion = "2.0";


    /**
     * 自动生成文档的路由名称,设置了generateRoutes之后,ignoreRoutes不生效
     */
    private Set<String> generateRoutes = new HashSet<>();

    /**
     * 不自动生成文档的路由名称,设置了generateRoutes之后,本配置不生效
     */
    private Set<String> ignoreRoutes = new HashSet<>();

    /**
     * 是否显示该路由
     */
    public boolean isShow(String route) {
        int generateRoutesSize = generateRoutes.size();
        int ignoreRoutesSize = ignoreRoutes.size();

        if (generateRoutesSize > 0 && !generateRoutes.contains(route)) {
            return false;
        }

        if (ignoreRoutesSize > 0 && ignoreRoutes.contains(route)) {
            return false;
        }

        return true;
    }


}

网关 Swagger 资源提供程序gateway 路由的方式聚合swagger文档

@EnableConfigurationProperties(SwaggerProperties.class)
@Primary
public class GatewaySwaggerResourceProvider implements SwaggerResourcesProvider {
    @Resource
    private SwaggerProperties swaggerProperties;
    private final RouteLocator routeLocator;
    private final GatewayProperties gatewayProperties;

    @Autowired
    public GatewaySwaggerResourceProvider(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
        this.routeLocator = routeLocator;
        this.gatewayProperties = gatewayProperties;
    }

    /**
     * 获取所有的swagger资源配置
     *
     * @return
     */
    @Override
    public List<SwaggerResource> get() {
        List<SwaggerResource> resources = new ArrayList<>();
        Set<String> routes = new HashSet<>();
        //取出Spring Cloud Gateway中的route
        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
        //结合application.yml中的路由配置,只获取有效的route节点
        gatewayProperties.getRoutes().stream().filter(
                routeDefinition -> (
                        routes.contains(routeDefinition.getId()) && swaggerProperties.isShow(routeDefinition.getId())
                )
        ).forEach(routeDefinition -> routeDefinition.getPredicates().stream()
                .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
                .forEach(predicateDefinition -> resources.add(
                        swaggerResource(
                                routeDefinition.getId(),
                                predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", swaggerProperties.getSwagger2Url())
                        )
                        )
                )
        );
        return resources;


    }

    private SwaggerResource swaggerResource(String name, String location) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion(swaggerProperties.getSwaggerVersion());
        return swaggerResource;
    }
}

这里使用的SpringBoot的自动装配

文件夹的结构为

文件内的内容为

Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.mn.swagger.SwaggerProperties,
com.mn.swagger.GatewaySwaggerResourceProvider

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

您可能感兴趣的文章:
阅读全文