一、CORS 配置
你可以配置網關來控制全局或每個路由的 CORS 行為。兩者都提供同樣的可能性。
1. Global CORS 配置
“global” CORS配置是對 Spring Framework CorsConfiguration 的URL模式的映射。下面的例子配置了 CORS。
Example 77. application.yml
spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowedOrigins: "https://docs.spring.io"allowedMethods:- GET
在前面的例子中,對于所有GET請求的路徑,允許來自 docs.spring.io 的請求的CORS請求。
要為未被某些網關路由謂詞處理的請求提供相同的 CORS 配置,請將 spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping 屬性設為 true。當你試圖支持 CORS 預檢請求,而你的路由謂詞因為 HTTP 方法是 options 而不能評估為 true 時,這很有用。
2. 路由的 CORS 配置
“route” configuration 允許將CORS直接應用于帶有key CORS 的路由作為元數據。像全局配置一樣,這些屬性屬于 Spring Framework CorsConfiguration。
如果路由中沒有 Path 謂詞,則將應用 '/**'。
Example 78. application.yml
spring:cloud:gateway:routes:- id: cors_routeuri: https://example.orgpredicates:- Path=/service/**metadata:corsallowedOrigins: '*'allowedMethods:- GET- POSTallowedHeaders: '*'maxAge: 30
二、路由元數據配置
你可以通過使用元數據為每個路由配置額外的參數,如下所示。
Example 73. application.yml
spring:cloud:gateway:routes:- id: route_with_metadatauri: https://example.orgmetadata:optionName: "OptionValue"compositeObject:name: "value"iAmNumber: 1
你可以從一個 exchange 所獲取所有的元數據屬性,如下所示
Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
// get all metadata properties
route.getMetadata();
// get a single metadata property
route.getMetadata(someKey);
三、配置(Configuration)
Spring Cloud Gateway 的配置是由 RouteDefinitionLocator 實例的集合驅動的。下面的列表顯示了 RouteDefinitionLocator 接口的定義。
Example 71. RouteDefinitionLocator.java
public interface RouteDefinitionLocator {Flux<RouteDefinition> getRouteDefinitions();
}
默認情況下,PropertiesRouteDefinitionLocator 通過使用Spring Boot的 @ConfigurationProperties 機制加載屬性。
前面的配置例子都使用了一種快捷方式,即使用位置參數而不是命名參數。下面的兩個例子是等價的。
Example 72. application.yml
spring:cloud:gateway:routes:- id: setstatus_routeuri: https://example.orgfilters:- name: SetStatusargs:status: 401- id: setstatusshortcut_routeuri: https://example.orgfilters:- SetStatus=401
對于網關的某些用途來說,屬性已經足夠了,但一些生產用例會從外部來源(如數據庫)加載配置中受益。未來的里程碑版本將有基于 Spring Data Repository 的 RouteDefinitionLocator 實現,如 Redis、MongoDB和Cassandra。
四、TLS 和 SSL
網關可以通過遵循通常的 Spring server configuration 來監聽 HTTPS 請求。下面的例子顯示了如何做到這一點。
Example 67. application.yml
server:ssl:enabled: truekey-alias: scgkey-store-password: scg1234key-store: classpath:scg-keystore.p12key-store-type: PKCS12
你可以將網關路由到HTTP和HTTPS后端。如果你要路由到HTTPS后端,你可以通過以下配置將網關配置為信任所有下游的證書。
Example 68. application.yml
spring:cloud:gateway:httpclient:ssl:useInsecureTrustManager: true
使用不安全的 trust manager 不適合于生產。對于生產部署,你可以用一組已知的證書來配置網關,它可以通過以下配置來信任。
Example 69. application.yml
spring:cloud:gateway:httpclient:ssl:trustedX509Certificates:- cert1.pem- cert2.pem
如果 Spring Cloud Gateway 沒有配置受信任的證書,就會使用默認的 trust store(你可以通過設置 javax.net.ssl.trustStore 系統屬性來覆蓋它)。
1. TLS 握手
網關維護著一個client pool,它用來路由到后端。當通過HTTPS進行通信時,客戶端發起了一個TLS握手。一些 timeout 配置與這個握手相關。你可以對這些 timeouts 進行配置,如下(默認值)。
Example 70. application.yml
spring:cloud:gateway:httpclient:ssl:handshake-timeout-millis: 10000close-notify-flush-timeout-millis: 3000close-notify-read-timeout-millis: 0