最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Gateway+Swagger2配置聚合文檔方式

 更新時間:2023年03月30日 08:42:37   作者:星辰明夜  
這篇文章主要介紹了Gateway+Swagger2配置聚合文檔方式,具有很好的參考價值,希望對大家有所幫助。

Spring Cloud Gateway網(wǎng)關模塊聚合各微服務的Swagger接口文檔

效果如下圖

相關pom依賴

        <!-- 網(wǎng)關路由代理 (僅網(wǎng)關)-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <!--swagger2 (網(wǎng)關和服務端)-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.7.0.RELEASE</version>
        </dependency>

Gateway配置

因為Swagger暫不支持webflux項目,所以Gateway里不能配置SwaggerConfig

import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述: 采用路由id做資源名稱,predicates.Path做映射的方式.
 * 如果需要自定義資源名稱,可以單獨配置一個集合(route.id,name),創(chuàng)建swaggerResource時,
 * 通過route.id獲取name.
 * <p>例如:     swagger:
 *               route_names:
 *                 - name: 訂單
 *                   id: order_route
 *                 - name: 訂單1
 *                   id: order_route1
 *              spring: cloud: gateway: routes:
 *                                         - id: order_route
 *                                         - id: order_route1
 *  </p>
 * 重新Gateway的方法還沒研究出來 - -||
 *
 * @Author:
 * @Date: 2021-04-25 15:38
 * @Version 1.0
 **/
@Component
@Primary
public class Swagger2 implements SwaggerResourcesProvider {

    protected static final String API_URI = "/v2/api-docs";//固定后綴
    private final RouteLocator routeLocator;
    private final GatewayProperties gatewayProperties;
    //資源集合
    private static List<SwaggerResource> resources;
	//自定義資源名稱需要在這里初始化
    public Swagger2(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
        this.routeLocator = routeLocator;
        this.gatewayProperties = gatewayProperties;
    }

    @Override
    public List<SwaggerResource> get() {
    //做了一個簡單緩存,沒仔細設計,其實可有可無用處不大
        if (resources == null) {
            resources = new ArrayList<>();

            List<String> routes = new ArrayList<>();
            routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
            //結(jié)合配置的route-路徑(Path),和route過濾,只獲取有效的route節(jié)點
            gatewayProperties.getRoutes().stream()
                    .filter(routeDefinition -> routes.contains(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("/**", API_URI)))));
        }
        return resources;
    }

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

}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;

import java.util.Optional;

@RestController
@RequestMapping("/swagger-resources")
public class SwaggerHandler {
    @Autowired(required = false)
    private SecurityConfiguration securityConfiguration;
    @Autowired(required = false)
    private UiConfiguration uiConfiguration;
    private final SwaggerResourcesProvider swaggerResources;

    @Autowired
    public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
        this.swaggerResources = swaggerResources;
    }


    @GetMapping("/configuration/security")
    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("/configuration/ui")
    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
        return Mono.just(new ResponseEntity<>(
                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
    }

    @GetMapping("")
    public Mono<ResponseEntity> swaggerResources() {
    	//入口
        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
    }
}

swagger地址過濾器

使用swagger 的 try it out 功能發(fā)現(xiàn)路徑錯誤,缺少服務器映射前綴的時候在用下面的過濾器.swagger 在拼裝URL 數(shù)據(jù)時候,會增加X-Forwarder-Prefix 請求頭里面的信息為前綴

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

@Component
public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory {
    private static final String HEADER_NAME = "X-Forwarded-Prefix";

    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            String path = request.getURI().getPath();
            if (!StringUtils.endsWithIgnoreCase(path, Swagger2.API_URI)) {
                return chain.filter(exchange);
            }

            String basePath = path.substring(0, path.lastIndexOf(Swagger2.API_URI));

            ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build();
            ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
            return chain.filter(newExchange);
        };
    }

}

配置文件

spring: cloud: gateway: routes:
        #路由的ID,沒有固定規(guī)則但要求唯一,簡易配合服務名
        - id: order_route
          #匹配后提供服務的路由地址
          #uri: http://localhost:8001
          #匹配后提供服務的路由地址,lb后跟提供服務的微服務的名,不要寫錯
          uri: lb://order
          #斷言
          predicates:
          #路徑相匹配的進行路由
            - Path=/order/**
          #過濾掉url里的city,例如http://ip:port/city/getCity -> http://ip:port/getCity
          #filters:
          #  - RewritePath=/city/(?<segment>.*), /$\{segment} 
          filters:
          # - SwaggerHeaderFilter
            - StripPrefix=1 #不要忘了

服務端

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述: Swagger2 接口文檔
 *
 * @Author: 
 * @Date: 2021-04-23 15:59
 * @Version 1.0
 **/
@Configuration
@EnableSwagger2
public class Swagger2 {
    //是否開啟swagger,正式環(huán)境一般是需要關閉的,可根據(jù)springboot的多環(huán)境配置進行設置
    @Value(value = "${swagger.enabled}")
    private Boolean swaggerEnabled;
    //顯示文檔版本
    @Value(value = "${swagger.version}")
    private String version;
    //標題
    @Value(value = "${swagger.title}")
    private String title;
    //描述信息
    @Value(value = "${swagger.description}")
    private String description;
    //掃描接口位置 也可以配置到nacos中
    private static final String base_package = "com.demo.controller";

    @Bean
    public Docket createRestApi() {

        return new Docket(DocumentationType.SWAGGER_2)// 指定api類型為swagger2
                .apiInfo(apiInfo())// 用于定義api文檔匯總信息
                // 是否開啟
                .enable(swaggerEnabled).select()
                // 掃描的路徑包
                .apis(RequestHandlerSelectors.basePackage(base_package))
                // 指定路徑處理PathSelectors.any()代表所有的路徑
                .paths(PathSelectors.any()).build()
                .pathMapping("/")
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }

    //securitySchemes的ApiKey中增加一個名為“Authorization”,type為“header”的參數(shù)
    private List<ApiKey> securitySchemes() {
        List<ApiKey> apiKeyList = new ArrayList();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }

    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build());
        return securityContexts;
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(title)// 文檔頁標題
                .contact(new Contact("s","s.com","s@163.com"))// 詳細信息
                .version(version)// 文檔版本號
                .termsOfServiceUrl("www.baidu.com")// 網(wǎng)站地址
                .description(description)
                .build();
    }
}

```java

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java抽象類的構(gòu)造模板模式用法示例

    Java抽象類的構(gòu)造模板模式用法示例

    這篇文章主要介紹了Java抽象類的構(gòu)造模板模式用法,結(jié)合實例形式分析了java使用抽象類構(gòu)造模板模式相關操作技巧,需要的朋友可以參考下
    2019-09-09
  • PostMan傳@RequestParam修飾的數(shù)組方式

    PostMan傳@RequestParam修飾的數(shù)組方式

    這篇文章主要介紹了PostMan傳@RequestParam修飾的數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • IDEA中try catch拋異??旖萱I分享

    IDEA中try catch拋異常快捷鍵分享

    在編寫Java代碼時,使用IDEA的快捷鍵CTRL+ALT+t可以快速生成try..catch語句塊,有效提高編碼效率,首先選擇需要處理的代碼片段,然后按下快捷鍵,選擇try/catch選項,即可自動包圍選中代碼,這一快捷操作簡化了異常處理步驟,減少了手動編寫的時間,是編程中的實用技巧
    2024-10-10
  • 簡介Java的Hibernate框架中的Session和持久化類

    簡介Java的Hibernate框架中的Session和持久化類

    這篇文章主要介紹了Java的Hibernate框架中的Session和持久化類,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • springboot + mybatis + druid + 多數(shù)據(jù)源的問題詳解

    springboot + mybatis + druid + 多數(shù)據(jù)源的問題詳解

    這篇文章主要介紹了springboot + mybatis + druid + 多數(shù)據(jù)源的問題詳解,示例代碼文字相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java線程池7個參數(shù)的含義

    Java線程池7個參數(shù)的含義

    這篇文章主要介紹了Java線程池7個參數(shù)的含義,所謂的線程池的?7?大參數(shù)是指,在使用?ThreadPoolExecutor?創(chuàng)建線程池時所設置的?7?個參數(shù),下文更多詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • Java實現(xiàn)簡易計算器(逆波蘭表達式)

    Java實現(xiàn)簡易計算器(逆波蘭表達式)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡易計算器,逆波蘭表達式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 將ResultSet中得到的一行或多行結(jié)果集封裝成對象的實例

    將ResultSet中得到的一行或多行結(jié)果集封裝成對象的實例

    這篇文章主要介紹了將ResultSet中得到的一行或多行結(jié)果集封裝成對象的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實現(xiàn)方式

    Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實現(xiàn)方式

    在實際開發(fā)中經(jīng)常會遇到在spring容器加載完某個bean之后,需要執(zhí)行一些業(yè)務代碼的場景,本文給大家介紹Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實現(xiàn)方式,感興趣的朋友一起看看吧
    2024-01-01
  • springboot @ComponentScan注解原理解析

    springboot @ComponentScan注解原理解析

    這篇文章主要介紹了springboot @ComponentScan注解原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02

最新評論

辰溪县| 广平县| 彭水| 洛南县| 盘锦市| 永登县| 新乡县| 长春市| 吴川市| 静宁县| 彰化县| 山阳县| 新巴尔虎左旗| 河北区| 紫金县| 珲春市| 启东市| 海兴县| 沈阳市| 渝北区| 邯郸县| 大洼县| 辽阳县| 武鸣县| 义乌市| 乐清市| 岑巩县| 禄劝| 曲沃县| 汶川县| 新丰县| 扬州市| 湘潭县| 南澳县| 修武县| 通州市| 大邑县| 桦甸市| 上栗县| 霍林郭勒市| 宜君县|