• SpringCloudGateway集成SpringDoc


    SpringCloudGateway集成SpringDoc

    最近在搞Spring版本升级,按客户要求升级Spring版本,原来用着SpringBoot 2.2.X版本,只需要升级SpringBoot 2.X最新版本也就可以满足客户Spring版本安全要求,可是好像最新的SpringBoot 2.X貌似也不支持Swagger2了,综合考虑,把项目的环境升级到SpringBoot3

    版本

    • SpringBoot 3.1.2
    • SpringCloud 2022.0.3 (SpringCloudGateway 4.0.6)
    • SpringDoc-OpenAPI 2.2.0

    引入SpringDoc-OpenAPI依赖

    <dependency>
    	<groupId>org.springdocgroupId>
    	<artifactId>springdoc-openapi-starter-webflux-apiartifactId>
    	<version>2.2.0version>
    dependency>
    <dependency>
    	<groupId>org.springdocgroupId>
    	<artifactId>springdoc-openapi-starter-webflux-uiartifactId>
    	<version>2.2.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    自动配置

    思路

    跟以前Swagger2集成Gateway差不多,读取Gateway的路由配置信息,刷新到SpringDoc-Swagger-UI属性去

    实现

    @Configuration
    @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
    public class DocIntegrationConfig {
        @Autowired
        private SwaggerUiConfigProperties swaggerUiConfigProperties;
        @Autowired
        private RouteDefinitionLocator locator;
    
    
        @PostConstruct
        public void apis() {
            //获取所有的路径配置
            List<RouteDefinition> definitions = locator.getRouteDefinitions().collectList().block();
            //过滤,只要lb模块式
            List<RouteDefinition> serviceRoutes = definitions.stream().filter(route -> null != route.getUri() && route.getUri().getScheme().equals("lb")).collect(Collectors.toList());
            //按根据PredicateDefinition参数值和/** 确定是否路径匹配
            Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> lbRouteUrl = new HashSet<>();
            Optional.ofNullable(serviceRoutes).orElse(Collections.emptyList()).forEach(route -> {
                AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl();
                //获取路径前缀
                List<PredicateDefinition> predicates = route.getPredicates();
                if (null == predicates || predicates.size() <= 0) {
                    return;
                }
                String prefix = "";
                for (PredicateDefinition predicate : predicates) {
                    String predicateName = predicate.getName();
                    if ("path".equalsIgnoreCase(predicateName)) {
                        for (String regex : predicate.getArgs().values()) {
                            if (regex.endsWith("/**")) {
                                prefix = regex.substring(0, regex.length() - 3);
                                continue;
                            }
                        }
    
                    }
                }
                //不是路径匹配的路由,跳过
                if (StringUtils.isBlank(prefix)) {
                    return;
                }
    
                swaggerUrl.setUrl(prefix + Constants.DEFAULT_API_DOCS_URL);
                swaggerUrl.setName(prefix);
                swaggerUrl.setDisplayName(route.getId());
                lbRouteUrl.add(swaggerUrl);
            });
    
            //添加swaggerUI服务集成匹配
            if (lbRouteUrl.size() > 0) {
                Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> propertiesUrls = swaggerUiConfigProperties.getUrls();
                if (null == propertiesUrls || propertiesUrls.size() <= 0) {
                    propertiesUrls = lbRouteUrl;
                } else {
                    propertiesUrls.addAll(lbRouteUrl);
                }
                swaggerUiConfigProperties.setUrls(propertiesUrls);
            }
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    然后就可以根据gateway的路由配置,自动在gateway springdoc界面生成各服务项,选择就可以查看该服务的在线文档。

    借助swagger-ui.urls手动配置

    springdoc,也提供配置的形式集成,配置swagger-ui.urls,就可以了,name为显示名称,url为服务api-docs,默认 /v3/api-docs。

    springdoc:
      api-docs:
        #是否开启文档功能,默认为true,可不配置
        enabled: true
      webjars:
        # 设置为空,不要前缀
        prefix:
      swagger-ui:
        path: /doc.html
        urls:
          - name: 网关服务接口
            url: /v3/api-docs
          - name: 某某服务接口
            url: /xxxx/v3/api-docs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在集成页面的右上角可看到配置的服务项,选择具体的服务
    在这里插入图片描述

    集成后CORS问题,请求查看下一篇文章

  • 相关阅读:
    Node.JS是什么
    使用WildCard充值ChatGPT Plus 会员
    MySQL 流程控制
    五子棋游戏AI智能算法设计
    ARMday2(环境创建+工程配置+创建文件+单步调试)
    JAVA面试题2:什么是面向对象?
    一键迁移接口,即刻搭建企业接口开放平台 - YesApi接口大师v3.15
    C++ Reference: Standard C++ Library reference: C Library: cwchar: wcsrchr
    【Vue】监视属性
    cookie和session的跨域怎么解决?
  • 原文地址:https://blog.csdn.net/huangliuyu00/article/details/132639132