1. 程式人生 > >Spring-Cloud-Gateway原始碼分析系列 | Spring-Cloud-Gateway之GatewayProperties初始化載入

Spring-Cloud-Gateway原始碼分析系列 | Spring-Cloud-Gateway之GatewayProperties初始化載入

推薦 Spring Boot/Cloud 視訊:

在Spring-Cloud-Gateway初始化時我們在GatewayAutoConfiguration配置中看到了有初始化載入GatewayProperties例項的配置,接下來學習下GatewayProperties都載入了哪些資訊

GatewayAutoConfiguration中我看到載入GatewayProperties如下:

    //載入配置beans
    // ConfigurationProperty beans
    @Bean
    public GatewayProperties gatewayProperties() {
        return new GatewayProperties();
    }
    

GatewayProperties的程式碼如下:

/**
 * 閘道器配置資訊載入
 * 從appliccation.yml中解析字首為spring.cloud.gateway的配置
 * @author Spencer Gibb
 */
@ConfigurationProperties("spring.cloud.gateway")
@Validated
public class GatewayProperties {

    /**
     * 路由定義列表
     * 載入配置key=spring.cloud.gateway.routes 列表
     * List of Routes
     */
    @NotNull
    @Valid
    private List<RouteDefinition> routes = new ArrayList<>();

    /**
     * 預設的過濾器定義列表
     * 載入配置 key = spring.cloud.gateway.default-filters 列表
     * List of filter definitions that are applied to every route.
     */
    private List<FilterDefinition> defaultFilters = new ArrayList<>();

    /**
     * 網媒體型別列表
     * 載入配置 key = spring.cloud.gateway.streamingMediaTypes 列表
     * 預設包含{text/event-stream,application/stream+json}
     */
    private List<MediaType> streamingMediaTypes = Arrays.asList(MediaType.TEXT_EVENT_STREAM,
            MediaType.APPLICATION_STREAM_JSON);
}          

由GatewayProperties程式碼可以看出其包含如下配置資訊

  • spring.cloud.gateway.routes:閘道器路由定義配置,列表形式
  • spring.cloud.gateway.default-filters: 閘道器預設過濾器定義配置,列表形式
  • spring.cloud.gateway.streamingMediaTypes:閘道器網路媒體型別,列表形式

同時,我們看到程式碼中的routes其實RouteDefinition集合,defaultFilters是FilterDefinition集合,在Spring-Cloud-Gateway之route資料模型我們已經分析了這兩個資料模型所有的欄位含義以及型別了。通過資料模型以及程式碼可以看出配置中可以包含的具體資訊。

  • spring.cloud.gateway.routes
id:路由ID 編號,唯一
uri: 路由指向的URI
order: 順序
predicates:謂語陣列,列表形式
  • spring.cloud.gateway.default-filters
name:過濾器定義名稱
args: 引數

接下來看下Spring-Cloud-Gateway給的樣例工程(spring-cloud-gateway-sample)中的配置

spring:
  cloud:
    gateway:
      default-filters:
      - PrefixPath=/httpbin
      - AddResponseHeader=X-Response-Default-Foo, Default-Bar
      routes:
      - id: websocket_test
        uri: ws://localhost:9000
        order: 9000
        predicates:
        - Path=/echo
      - id: default_path_to_httpbin
        uri: ${test.uri}
        order: 10000
        predicates:
        - Path=/**
  • 備註 default-filters下配置PrefixPath=/httpbin字串,可以檢視FilterDefinition中建構函式,它接收一個text字串解析字元傳並建立例項資訊。同樣predicates配置與其一致。 字元傳格式:name=param1,param2,param3…。

如下:

    public FilterDefinition(String text) {
        int eqIdx = text.indexOf("=");
        if (eqIdx <= 0) {
            setName(text);
            return;
        }
        setName(text.substring(0, eqIdx));

        String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ",");

        for (int i=0; i < args.length; i++) {
            this.args.put(NameUtils.generateName(i), args[i]);
        }
    }
  

上面的配置可以很容易的知道最終加載出來GatewayProperties例項中都包含哪些資訊。

弄懂了配置的具體載入以及初始化會加深對閘道器整體流程的理解,合理的使用配置檔案定義我們自己的需求,快速的根據配置定位,瞭解服務的詳細情況

專家推薦

“隨著微服務架構的發展,Spring Cloud 使用得越來越廣泛。馳狼課堂 Spring Boot 快速入門,Spring Boot 與Spring Cloud 整合,docker+k8s,大型電商商城等多套免費實戰教程可以幫您真正做到快速上手,將技術點切實運用到微服務專案中。”