• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

分布式接口文档的实现,Gateway集成Swagger3

武飞扬头像
kabit
帮助1

最近在做一个分布式项目,目前到了整合阶段,突然发现接口文档十分分散,于是想要集成到一起。网上找了很多文章,对我都没有太大帮助,最后再几经辗转加上自己修改了一些代码后,终于成功了。

默认你的分布式架构已经搭建完毕,只差将全部的接口文档都整合到一个端口下。

如下:

学新通

学新通 学新通

 第一步:

在你的Gateway和Provider中全部引入Jar:

  1.  
    <!--swagger-->
  2.  
    <dependency>
  3.  
    <groupId>io.springfox</groupId>
  4.  
    <artifactId>springfox-boot-starter</artifactId>
  5.  
    <version>3.0.0</version>
  6.  
    </dependency>
  7.  
     
  8.  
    <!--swagger-ui 这里是用了一个好看一点ui界面-->
  9.  
    <dependency>
  10.  
    <groupId>com.github.xiaoymin</groupId>
  11.  
    <artifactId>swagger-bootstrap-ui</artifactId>
  12.  
    <version>1.9.6</version>
  13.  
    </dependency>

 第二步:

在你的Provider中创建文件:SwaggerConfig.java

里面的一些信息记得改...

  1.  
    package com.zk.f.config;
  2.  
     
  3.  
    import org.springframework.beans.factory.annotation.Value;
  4.  
    import org.springframework.context.annotation.Bean;
  5.  
    import org.springframework.context.annotation.Configuration;
  6.  
    import org.springframework.http.HttpMethod;
  7.  
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8.  
    import springfox.documentation.builders.ApiInfoBuilder;
  9.  
    import springfox.documentation.builders.PathSelectors;
  10.  
    import springfox.documentation.builders.RequestHandlerSelectors;
  11.  
    import springfox.documentation.service.*;
  12.  
    import springfox.documentation.spi.DocumentationType;
  13.  
    import springfox.documentation.spi.service.contexts.SecurityContext;
  14.  
    import springfox.documentation.spring.web.plugins.Docket;
  15.  
     
  16.  
    import java.util.*;
  17.  
     
  18.  
    @Configuration
  19.  
     
  20.  
    public class SwaggerConfig implements WebMvcConfigurer {
  21.  
    //配置了Swagger的Docket的bean实例
  22.  
    //enable是否启动swagger,如果为False则Swagger不能在浏览器访问
  23.  
    @Bean
  24.  
    public Docket docket() {
  25.  
    Set<String> set = new HashSet<>();
  26.  
    set.add("https");
  27.  
    set.add("http");
  28.  
    return new Docket(DocumentationType.SWAGGER_2).pathMapping("/")
  29.  
    .enable(true)//定义是否开启swagger,false为关闭,可以通过变量控制
  30.  
    // 微信关注开发者技术前线:定义是否开启swagger,false为关闭,可以通过变量控制
  31.  
    .apiInfo(apiInfo())//将api的元信息设置为包含在json ResourceListing响应中。
  32.  
    .select()
  33.  
    .apis(RequestHandlerSelectors.basePackage("com.zk.f"))
  34.  
    //paths()过滤什么路径
  35.  
    .paths(PathSelectors.any())
  36.  
    .build()
  37.  
    .protocols(set)// 支持的通讯协议集合
  38.  
    .securitySchemes(securitySchemes())// 授权信息设置,必要的header token等认证信息
  39.  
    .securityContexts(securityContexts());// 授权信息全局应用
  40.  
    }
  41.  
    //作者信息
  42.  
    Contact contact = new Contact("kabit","www.百度.com","kabit@sina.cn");
  43.  
     
  44.  
    //配置Swagger 信息 = ApiInfo
  45.  
    private ApiInfo apiInfo()
  46.  
    {
  47.  
    return new ApiInfo("数字渔业网关Api文档",
  48.  
    "szyy",
  49.  
    "1.0",
  50.  
    "www.百度.com",
  51.  
    contact,
  52.  
    "Apache 2.0",
  53.  
    "http://www.apache.org/licenses/LICENSE-2.0",
  54.  
    new ArrayList<>());
  55.  
    }
  56.  
    /**
  57.  
    * 设置授权信息
  58.  
    */
  59.  
    private List<SecurityScheme> securitySchemes()
  60.  
    {
  61.  
    List<ApiKey> result = new ArrayList<>();
  62.  
    ApiKey apiKey = new ApiKey("Authorization","Authorization" ,"Header" );
  63.  
    result.add(apiKey);
  64.  
    return Collections.singletonList(apiKey);
  65.  
    }
  66.  
    /**
  67.  
    * 授权信息全局应用
  68.  
    */
  69.  
    private List<SecurityContext> securityContexts() {
  70.  
    return Collections.singletonList(
  71.  
    SecurityContext.builder()
  72.  
    .securityReferences(Collections.singletonList(new SecurityReference("Authorization", new AuthorizationScope[]{new AuthorizationScope("global", "Authorization")})))
  73.  
    .build()
  74.  
    );
  75.  
    }
  76.  
     
  77.  
    }
  78.  
     
  79.  
     
  80.  
     
学新通

第三步:

在Gateway中创建文件:

SwaggerProvider.java

  1.  
    package com.zk.e.config;
  2.  
     
  3.  
    import org.springframework.beans.factory.annotation.Autowired;
  4.  
    import org.springframework.cloud.gateway.config.GatewayProperties;
  5.  
    import org.springframework.cloud.gateway.route.RouteLocator;
  6.  
    import org.springframework.cloud.gateway.support.NameUtils;
  7.  
    import org.springframework.context.annotation.Primary;
  8.  
    import org.springframework.stereotype.Component;
  9.  
    import springfox.documentation.spi.DocumentationType;
  10.  
    import springfox.documentation.swagger.web.SwaggerResource;
  11.  
    import springfox.documentation.swagger.web.SwaggerResourcesProvider;
  12.  
     
  13.  
    import java.util.ArrayList;
  14.  
    import java.util.List;
  15.  
     
  16.  
    /**
  17.  
    * <p></p>
  18.  
    *
  19.  
    * @author kabit
  20.  
    * @createTime 2021/9/21 17:13
  21.  
    * @since 1.0
  22.  
    */
  23.  
    @Component
  24.  
    @Primary
  25.  
    public class SwaggerProvider implements SwaggerResourcesProvider {
  26.  
    /**
  27.  
    * RouteLocator,GatewayProperties这两个类都是springcloud提供的springbean对象直接注入即可
  28.  
    */
  29.  
    private final RouteLocator routeLocator;
  30.  
    //gateway配置文件
  31.  
    private final GatewayProperties gatewayProperties;
  32.  
     
  33.  
     
  34.  
    @Override
  35.  
    public List<SwaggerResource> get() {
  36.  
    List<SwaggerResource> resources = new ArrayList<>();
  37.  
    List<String> routes = new ArrayList<>();
  38.  
    routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
  39.  
    //从配置文件中获取并配置SwaggerResource
  40.  
    gatewayProperties.getRoutes().stream()
  41.  
    //过滤路由
  42.  
    .filter(routeDefinition -> routes.contains(routeDefinition.getId()))
  43.  
    //循环添加,从路由的断言中获取,一般来说路由都会配置断言Path信息,这就不多说了
  44.  
    .forEach(route -> {
  45.  
    route.getPredicates().stream()
  46.  
    //获取Path信息
  47.  
    .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
  48.  
    //开始添加SwaggerResource
  49.  
    .forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),
  50.  
    predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX "0")
  51.  
    .replace("**", "v2/api-docs"))));
  52.  
    });
  53.  
     
  54.  
    return resources;
  55.  
    }
  56.  
     
  57.  
    private SwaggerResource swaggerResource(String name, String location) {
  58.  
    SwaggerResource swaggerResource = new SwaggerResource();
  59.  
    swaggerResource.setName(name);
  60.  
    swaggerResource.setLocation(location);
  61.  
    swaggerResource.setSwaggerVersion(DocumentationType.OAS_30.getVersion());
  62.  
    return swaggerResource;
  63.  
    }
  64.  
     
  65.  
    @Autowired
  66.  
    public SwaggerProvider(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
  67.  
    this.routeLocator = routeLocator;
  68.  
    this.gatewayProperties = gatewayProperties;
  69.  
    }
  70.  
     
  71.  
    }
学新通

附上我的Gateway部分配置文件:

  1.  
    spring.cloud.gateway.discovery.locator.enabled=true
  2.  
    spring.cloud.gateway.discovery.locator.lower-case-service-id=true
  3.  
    spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOrigins=*
  4.  
    spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[0]=GET
  5.  
    spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedMethods[1]=POST
  6.  
     
  7.  
    spring.cloud.gateway.routes[0].id=auth
  8.  
    spring.cloud.gateway.routes[0].uri=http://localhost:8189
  9.  
    spring.cloud.gateway.routes[0].predicates[0]=Path=/auth/**
  10.  
    spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
  11.  
     
  12.  
    spring.cloud.gateway.routes[1].id=public-provider
  13.  
    spring.cloud.gateway.routes[1].uri=lb://public-provider
  14.  
    spring.cloud.gateway.routes[1].predicates[0]=Path=/public/**
  15.  
    spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1
  16.  
     
  17.  
    org.my.jwt.skip-auth-urls[0]=/auth
  18.  
    org.my.jwt.skip-auth-urls[1]=/public/v2/api-docs
学新通

最后http://ip 端口/doc.html#/访问就好了,如果不行的话,自己尝试改一改,毕竟我也是一路改过来的。

由于看了几十篇博客,真的忘了其中代码出自哪位大佬了。

十分感谢就完了~

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggcabf
系列文章
更多 icon
同类精品
更多 icon
继续加载