当前位置:   article > 正文

SpringCloud:Gateway聚合Swagger

SpringCloud:Gateway聚合Swagger

场景

微服务中集成了swagger时,gateway中的过滤器也会对其进行过滤,经常会应该一些检验规则导致无法访问。

我这是增加了服务的权限校验,导致无法访问swagger相应路径,虽然增加了免校验规则,但由于相关页面较多,这种方式显得较为笨重。

PS:filter中的忽略规则自行处理。可参考SpringCloud:Gateway网关中自定义过滤器

方法1:忽略路径

将下列路径跳过校验即可访问swagger的资源。

  1. token:
  2. rules:
  3. ignore: #需要过滤的路径
  4. - /**/swagger-ui.html
  5. - /**/swagger-resources/**
  6. - /**/swagger-resources
  7. - /**/v2/api-docs
  8. - /**/swagger-resources/configuration/ui

方法2: 聚合显示

在gateway中增加swagger,集成相应的接口

  • 引入swagger包
  1. <!--swagger-->
  2. <dependency>
  3. <groupId>io.springfox</groupId>
  4. <artifactId>springfox-swagger-ui</artifactId>
  5. <version>2.9.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>io.springfox</groupId>
  9. <artifactId>springfox-swagger2</artifactId>
  10. <version>2.9.2</version>
  11. </dependency>
  • 重写swagger获取服务源的get方法
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.cloud.gateway.route.RouteLocator;
  4. import org.springframework.context.annotation.Profile;
  5. import org.springframework.stereotype.Component;
  6. import springfox.documentation.swagger.web.SwaggerResource;
  7. import springfox.documentation.swagger.web.SwaggerResourcesProvider;
  8. import java.util.ArrayList;
  9. import java.util.HashSet;
  10. import java.util.List;
  11. import java.util.Set;
  12. /**
  13. * @description: 获取具体服务apidocs
  14. * @author: lizz
  15. * @date: 2020/4/28 11:01
  16. */
  17. @Component
  18. public class GwSwaggerResourceProvider implements SwaggerResourcesProvider {
  19. /**
  20. * swagger2默认的url后缀
  21. */
  22. private static final String SWAGGER2URL = "/v2/api-docs";
  23. /**
  24. * 网关应用名称
  25. * 配置集成的服务,名称与gateway中route的Path一致,用于拼接路径访问后端服务的swagger路径
  26. * 如:swagger.serivces = rider,user
  27. */
  28. @Value("${swagger.serivces}")
  29. private List<String> swaggerServices;
  30. @Override
  31. public List<SwaggerResource> get() {
  32. List<SwaggerResource> resources = new ArrayList<>();
  33. List<String> routeHosts = new ArrayList<>();
  34. // 记录已经添加过的server,存在同一个应用注册了多个服务在nacos上
  35. Set<String> dealed = new HashSet<>();
  36. swaggerServices.forEach(instance -> {
  37. // 拼接url,样式为/serviceId/v2/api-info,当网关调用这个接口时,会自动通过负载均衡寻找对应的主机
  38. String url = "/swagger/" + instance + SWAGGER2URL;
  39. if (!dealed.contains(url)) {
  40. dealed.add(url);
  41. SwaggerResource swaggerResource = new SwaggerResource();
  42. swaggerResource.setUrl(url);
  43. swaggerResource.setName(instance);
  44. resources.add(swaggerResource);
  45. }
  46. });
  47. return resources;
  48. }
  49. }
  • 重写swagger的数据接口
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.annotation.Profile;
  3. import org.springframework.http.HttpStatus;
  4. import org.springframework.http.ResponseEntity;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import springfox.documentation.swagger.web.*;
  8. import java.util.List;
  9. /**
  10. * @description: swagger访问页面
  11. * 限制dev和test环境下访问
  12. * @author: lizz
  13. * @date: 2020/4/28 11:02
  14. */
  15. @RestController
  16. @RequestMapping("/swagger-resources")
  17. @Profile({"dev","test"})
  18. public class SwaggerResourceController {
  19. private GwSwaggerResourceProvider swaggerResourceProvider;
  20. @Autowired
  21. public SwaggerResourceController(GwSwaggerResourceProvider swaggerResourceProvider) {
  22. this.swaggerResourceProvider = swaggerResourceProvider;
  23. }
  24. @RequestMapping(value = "/configuration/security")
  25. public ResponseEntity<SecurityConfiguration> securityConfiguration() {
  26. return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);
  27. }
  28. @RequestMapping(value = "/configuration/ui")
  29. public ResponseEntity<UiConfiguration> uiConfiguration() {
  30. return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);
  31. }
  32. @RequestMapping
  33. public ResponseEntity<List<SwaggerResource>> swaggerResources() {
  34. return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);
  35. }
  36. }
  • 因为需要访问服务的api-docs接口,因此需要对该接口进行忽略,在gateway过滤规则中增加。
    1. token:
    2. ignore:
    3. - /**/api-docs

     

效果

访问服务网关的swagger-ui.html页面即可,如:http://ip:port/swagger-ui.html,在select a spec选择想看的服务即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/490749
推荐阅读
相关标签
  

闽ICP备14008679号