Gateway for Spring 提供一種高效且強大的路由、管理及處理 API 請求的方式,作為微服務架構的一部分。 其可作為 API 閘道,將外部要求路由傳送至不同的服務,並新增各種功能,例如篩選、負載平衡等等。 在本文中,您將瞭解如何建立閘道,以將要求導向至您的容器應用程式。
在本教學課程中,您將了解:
- 為 Spring Java 元件建立閘道器
- 使用自定義路由更新 spring 的閘道,以將要求重新導向至容器應用程式
重要
本教學使用可能影響 Azure 帳單的服務。 如果您決定逐步執行操作,請務必刪除本文中介紹的資源,以免產生非預期的帳單。
必要條件
考量
在 Azure 容器應用程式 中執行 Gateway for Spring 時,請注意以下細節:
| 項目 | 說明 |
|---|---|
| Scope | Spring 的閘道會在與連線的容器應用程式相同的環境中執行。 |
| 資源 | Spring 閘道的容器資源配置是固定的,CPU 核心的數目是 0.5,記憶體大小為 1Gi。 |
| 定價 | 適用於 Spring 的閘道器計費採用隨用隨付模式。 受管理的 Java 元件所消耗的資源會依活動/閒置速率計費。 您可以刪除不再使用的元件來停止計費。 |
設定
開始使用 Spring 的閘道之前,您必須先建立必要的資源。
執行下列命令來建立您的資源群組和容器應用程式環境。
建立變數以支援您的應用程式設定。 這些值是針對本課程的目的而向您提供的。 在這一課,我們會使用系統管理員的執行器端點進行 Spring 範例應用程式。
export LOCATION=eastus export RESOURCE_GROUP=my-spring-cloud-resource-group export ENVIRONMENT=my-spring-cloud-environment export JAVA_COMPONENT_NAME=mygateway export APP_NAME=myapp export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"變數 描述 LOCATION就是你建立容器應用程式和 Java 元件的 Azure 區域位置。 ENVIRONMENTAzure 容器應用程式 環境的名稱,用於你的示範應用程式。 RESOURCE_GROUP示範應用程式的 Azure 資源群組名稱。 JAVA_COMPONENT_NAME為你的容器應用程式建立的 Java 元件名稱。 在這種情況下,你要為 Spring Java 元件建立一個閘道。 IMAGE容器應用程式中所使用的容器映像。 用 Azure CLI 登入 Azure。
az login建立資源群組。
az group create --name $RESOURCE_GROUP --location $LOCATION建立您的容器應用程式環境。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION此環境可用來裝載 Spring 元件的閘道和容器應用程式。
使用適用於 Spring 的閘道器 Java 元件
現在您已擁有 Container Apps 環境,您可以建立容器應用程式,使用適用於 spring java 元件的閘道,將要求路由傳送至它們。
建立 Gateway for Spring Java 元件。
az containerapp env java-component gateway-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \建立具有完整功能域名(FQDN)的容器應用程式。
az containerapp create \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --environment $ENVIRONMENT \ --image $IMAGE \ --ingress external \ --target-port 8080 \ --query properties.configuration.ingress.fqdn此命令會傳回取用組態資料之容器應用程式的 URL。 將URL複製到文字編輯器,讓您可以在下一個步驟中使用。
更新閘道器路由以轉送請求
使用下列內容建立 YAML 檔案。 將
<MYAPP_URL>取代為上一個步驟中的容器應用程式 FQDN。springCloudGatewayRoutes: - id: "route1" uri: "<MYAPP_URL>" predicates: - "Path=/myapp/{path}" filters: - "SetPath=/actuator/{path}"執行下列命令,以使用您的路由組態來更新 Spring 元件的閘道。
az containerapp env java-component gateway-for-spring update \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --route-yaml <PTAH_TO_ROUTE_YAML_FILE> \ --query properties.ingress.fqdn此命令會更新閘道器路由,並回傳使用設定資料的閘道器 URL。
命令會傳回閘道的 URL。 使用路徑
/myapp/health瀏覽此網址時,應將要求路由至您的應用程式的actuator/health端點,並回傳{"status":"UP","groups":["liveness","readiness"]}。
清除資源
本教學中建立的資源會影響你的 Azure 帳單。 如果您不會長期使用這些服務,請執行下列命令來刪除本教學課程中建立的所有內容。
az group delete --resource-group $RESOURCE_GROUP
路由檔案格式
Spring 的閘道元件支援透過識別碼、URI、述詞和篩選的屬性定義路由。 如需詳細資訊,請參閱 Spring Cloud Gateway 檔。 以下是示範如何設定這些屬性的 YAML 檔案範例。
springCloudGatewayRoutes:
- id: "route1"
uri: "https://otherjavacomponent.myenvironment.test.net"
predicates:
- "Path=/v1/{path}"
- "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
filters:
- "SetPath=/{path}"
- id: "route2"
uri: "https://otherjavacomponent.myenvironment.test.net"
predicates:
- "Path=/v2/{path}"
- "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
filters:
- "SetPath=/{path}"
您的 Spring 閘道允許的組態清單(#configurable-properties)
下表描述您可以為應用程式設定的閘道元件屬性。 如需詳細資訊,請參閱 Spring Cloud Gateway Common 應用程式屬性。
| 屬性名稱 | 描述 | 預設值 |
|---|---|---|
spring.cloud.gateway.default-filters |
套用至每個路由的篩選條件定義清單。 | |
spring.cloud.gateway.enabled |
啟用閘道功能。 | true |
spring.cloud.gateway.fail-on-route-definition-error |
在路由定義發生錯誤時是否失敗的選項,預設為 true。 否則,會記錄警告。 | true |
spring.cloud.gateway.handler-mapping.order |
RoutePredicateHandlerMapping的順序。 |
1 |
spring.cloud.gateway.loadbalancer.use404 |
false |
|
spring.cloud.gateway.discovery.locator.enabled |
啟用 DiscoveryClient 閘道整合的旗標。 |
false |
spring.cloud.gateway.discovery.locator.filters |
||
spring.cloud.gateway.discovery.locator.include-expression |
用於判斷是否將服務納入閘道器整合的 SpEL 運算式。 預設值是 true。 |
true |
spring.cloud.gateway.discovery.locator.lower-case-service-id |
提供在述詞和篩選條件中使用小寫 serviceId 的選項。 預設值是 false。 當 Eureka 自動大寫 serviceId時,它很有用。 因此, MYSERVICE 會相符 /myservice/** |
false |
spring.cloud.gateway.discovery.locator.predicates |
||
spring.cloud.gateway.discovery.locator.route-id-prefix |
routeId的預設前綴是discoveryClient.getClass().getSimpleName() + "_". 服務識別碼被加上以創建 routeId。 |
|
spring.cloud.gateway.discovery.locator.url-expression |
建立每個路由 URI 的 SpEL 運算式。 預設值是 'lb://'+serviceId。 |
'lb://'+serviceId |
spring.cloud.gateway.filter.add-request-header.enabled |
add-request-header啟用篩選。 |
true |
spring.cloud.gateway.filter.add-request-parameter.enabled |
add-request-parameter啟用篩選。 |
true |
spring.cloud.gateway.filter.add-response-header.enabled |
add-response-header啟用篩選。 |
true |
spring.cloud.gateway.filter.circuit-breaker.enabled |
circuit-breaker啟用篩選。 |
true |
spring.cloud.gateway.filter.dedupe-response-header.enabled |
dedupe-response-header啟用篩選。 |
true |
spring.cloud.gateway.filter.fallback-headers.enabled |
fallback-headers啟用篩選。 |
true |
spring.cloud.gateway.filter.hystrix.enabled |
hystrix啟用篩選。 |
true |
spring.cloud.gateway.filter.json-to-grpc.enabled |
啟用 JSON 至 gRPC 過濾器。 | true |
spring.cloud.gateway.filter.local-response-cache.enabled |
local-response-cache啟用篩選。 |
false |
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy |
||
spring.cloud.gateway.filter.local-response-cache.size |
此路由的快取項目清除最大大小,單位為 KB、MB 與 GB。 | |
spring.cloud.gateway.filter.local-response-cache.time-to-live |
快取專案到期的時間,以 s 秒為單位、 m 分鐘和 h 小時表示。 |
5m |
spring.cloud.gateway.filter.map-request-header.enabled |
map-request-header啟用篩選。 |
true |
spring.cloud.gateway.filter.modify-request-body.enabled |
modify-request-body啟用篩選。 |
true |
spring.cloud.gateway.filter.modify-response-body.enabled |
modify-response-body啟用篩選。 |
true |
spring.cloud.gateway.filter.prefix-path.enabled |
prefix-path啟用篩選。 |
true |
spring.cloud.gateway.filter.preserve-host-header.enabled |
preserve-host-header啟用篩選。 |
true |
spring.cloud.gateway.filter.redirect-to.enabled |
redirect-to啟用篩選。 |
true |
spring.cloud.gateway.filter.remove-hop-by-hop.headers |
||
spring.cloud.gateway.filter.remove-hop-by-hop.order |
0 |
|
spring.cloud.gateway.filter.remove-request-header.enabled |
remove-request-header啟用篩選。 |
true |
spring.cloud.gateway.filter.remove-request-parameter.enabled |
remove-request-parameter啟用篩選。 |
true |
spring.cloud.gateway.filter.remove-response-header.enabled |
remove-response-header啟用篩選。 |
true |
spring.cloud.gateway.filter.request-header-size.enabled |
request-header-size啟用篩選。 |
true |
spring.cloud.gateway.filter.request-header-to-request-uri.enabled |
request-header-to-request-uri啟用篩選。 |
true |
spring.cloud.gateway.filter.request-rate-limiter.default-key-resolver |
||
spring.cloud.gateway.filter.request-rate-limiter.default-rate-limiter |
||
spring.cloud.gateway.filter.request-rate-limiter.enabled |
request-rate-limiter啟用篩選。 |
true |
spring.cloud.gateway.filter.request-size.enabled |
request-size啟用篩選。 |
true |
spring.cloud.gateway.filter.retry.enabled |
retry啟用篩選。 |
true |
spring.cloud.gateway.filter.rewrite-location-response-header.enabled |
rewrite-location-response-header啟用篩選。 |
true |
spring.cloud.gateway.filter.rewrite-location.enabled |
rewrite-location啟用篩選。 |
true |
spring.cloud.gateway.filter.rewrite-path.enabled |
rewrite-path啟用篩選。 |
true |
spring.cloud.gateway.filter.rewrite-request-parameter.enabled |
rewrite-request-parameter啟用篩選。 |
true |
spring.cloud.gateway.filter.rewrite-response-header.enabled |
rewrite-response-header啟用篩選。 |
true |
spring.cloud.gateway.filter.save-session.enabled |
save-session啟用篩選。 |
true |
spring.cloud.gateway.filter.secure-headers.content-security-policy |
default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline' |
|
spring.cloud.gateway.filter.secure-headers.content-type-options |
nosniff |
|
spring.cloud.gateway.filter.secure-headers.disable |
||
spring.cloud.gateway.filter.secure-headers.download-options |
noopen |
|
spring.cloud.gateway.filter.secure-headers.enabled |
secure-headers啟用篩選。 |
true |
spring.cloud.gateway.filter.secure-headers.frame-options |
DENY |
|
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies |
none |
|
spring.cloud.gateway.filter.secure-headers.referrer-policy |
no-referrer |
|
spring.cloud.gateway.filter.secure-headers.strict-transport-security |
max-age=631138519 |
|
spring.cloud.gateway.filter.secure-headers.xss-protection-header |
1 ; mode=block |
|
spring.cloud.gateway.filter.set-path.enabled |
set-path啟用篩選。 |
true |
spring.cloud.gateway.filter.set-request-header.enabled |
set-request-header啟用篩選。 |
true |
spring.cloud.gateway.filter.set-request-host-header.enabled |
set-request-host-header啟用篩選。 |
true |
spring.cloud.gateway.filter.set-response-header.enabled |
set-response-header啟用篩選。 |
true |
spring.cloud.gateway.filter.set-status.enabled |
set-status啟用篩選。 |
true |
spring.cloud.gateway.filter.strip-prefix.enabled |
strip-prefix啟用篩選。 |
true |
spring.cloud.gateway.forwarded.enabled |
啟用ForwardedHeadersFilter。 |
true |
spring.cloud.gateway.global-filter.adapt-cached-body.enabled |
adapt-cached-body啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.forward-path.enabled |
forward-path啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.forward-routing.enabled |
forward-routing啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.load-balancer-client.enabled |
load-balancer-client啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.local-response-cache.enabled |
local-response-cache啟用所有路由的篩選,這可讓您使用LocalResponseCache篩選在路由層級新增特定組態。 |
true |
spring.cloud.gateway.global-filter.netty-routing.enabled |
netty-routing global啟用篩選。 |
true |
spring.cloud.gateway.global-filter.netty-write-response.enabled |
netty-write-response啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled |
reactive-load-balancer-client啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.remove-cached-body.enabled |
remove-cached-body啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.route-to-request-url.enabled |
route-to-request-url啟用全域篩選。 |
true |
spring.cloud.gateway.global-filter.websocket-routing.enabled |
websocket-routing啟用全域篩選。 |
true |
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping |
如果應該將全域 CORS 設定新增至 URL 處理程式。 | false |
spring.cloud.gateway.globalcors.cors-configurations |
||
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header |
回傳突發容量組態的標頭名稱。 | X-RateLimit-Burst-Capacity |
spring.cloud.gateway.redis-rate-limiter.config |
||
spring.cloud.gateway.redis-rate-limiter.include-headers |
是否要包含包含速率限制子信息的標頭。 預設值是 true。 |
true |
spring.cloud.gateway.redis-rate-limiter.remaining-header |
回傳目前秒內剩餘請求數的標頭名稱。 | X-RateLimit-Remaining |
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header |
回傳補充速率設定的標頭名稱。 | X-RateLimit-Replenish-Rate |
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header |
傳回要求之令牌組態的標頭名稱。 | X-RateLimit-Requested-Tokens |
spring.cloud.gateway.restrictive-property-accessor.enabled |
限制 SpEL 中的方法和屬性存取。 | true |
spring.cloud.gateway.predicate.after.enabled |
啟用 after 條件。 |
true |
spring.cloud.gateway.predicate.before.enabled |
啟用 before 條件。 |
true |
spring.cloud.gateway.predicate.between.enabled |
啟用 between 條件。 |
true |
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled |
啟用 cloud-foundry-route-service 條件。 |
true |
spring.cloud.gateway.predicate.cookie.enabled |
啟用 cookie 條件。 |
true |
spring.cloud.gateway.predicate.header.enabled |
啟用 header 條件。 |
true |
spring.cloud.gateway.predicate.host.enabled |
啟用 host 條件。 |
true |
spring.cloud.gateway.predicate.host.include-port |
在比對主機名稱時包含連接埠。 | true |
spring.cloud.gateway.predicate.method.enabled |
啟用 method 條件。 |
true |
spring.cloud.gateway.predicate.path.enabled |
啟用 path 條件。 |
true |
spring.cloud.gateway.predicate.query.enabled |
啟用 query 條件。 |
true |
spring.cloud.gateway.predicate.read-body.enabled |
啟用 read-body 條件。 |
true |
spring.cloud.gateway.predicate.remote-addr.enabled |
啟用 remote-addr 條件。 |
true |
spring.cloud.gateway.predicate.weight.enabled |
啟用 weight 條件。 |
true |
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled |
啟用 xforwarded-remote-addr 條件。 |
true |
spring.cloud.gateway.set-status.original-status-header-name |
包含代理請求 HTTP 程式碼的標頭名稱。 | |
spring.cloud.gateway.streaming-media-types |
||
spring.cloud.gateway.x-forwarded.enabled |
指示XForwardedHeadersFilter 是否已啟用。 |
true |
spring.cloud.gateway.x-forwarded.for-append |
是否啟用將 X-Forwarded-For 以清單形式附加。 |
true |
spring.cloud.gateway.x-forwarded.for-enabled |
指示X-Forwarded-For 是否已啟用。 |
true |
spring.cloud.gateway.x-forwarded.host-append |
是否啟用將 X-Forwarded-Host 以清單形式附加。 |
true |
spring.cloud.gateway.x-forwarded.host-enabled |
指示X-Forwarded-Host 是否已啟用。 |
true |
spring.cloud.gateway.x-forwarded.order |
XForwardedHeadersFilter的順序。 |
0 |
spring.cloud.gateway.x-forwarded.port-append |
是否啟用將 X-Forwarded-Port 以清單形式附加。 |
true |
spring.cloud.gateway.x-forwarded.port-enabled |
指示X-Forwarded-Port 是否已啟用。 |
true |
spring.cloud.gateway.x-forwarded.prefix-append |
是否啟用將 X-Forwarded-Prefix 以清單形式附加。 |
true |
spring.cloud.gateway.x-forwarded.prefix-enabled |
指示X-Forwarded-Prefix 是否已啟用。 |
true |
spring.cloud.gateway.x-forwarded.proto-append |
是否啟用將 X-Forwarded-Proto 以清單形式附加。 |
true |
spring.cloud.gateway.x-forwarded.proto-enabled |
指示X-Forwarded-Proto 是否已啟用。 |
true |
spring.cloud.gateway.httpclient.compression |
啟用 Netty HttpClient的壓縮。 |
false |
spring.cloud.gateway.httpclient.connect-timeout |
連線逾時的時間以毫秒計算。 預設值是 30s。 |
|
spring.cloud.gateway.httpclient.max-header-size |
響應標頭大小上限。 | |
spring.cloud.gateway.httpclient.max-initial-line-length |
最大初始行長度。 | |
spring.cloud.gateway.httpclient.pool.acquire-timeout |
僅適用於類型 FIXED,取得資源時等待的最大時間 (毫秒)。 |
|
spring.cloud.gateway.httpclient.pool.eviction-interval |
依指定間隔在背景定期執行清除檢查。 預設為停用({@link Duration#ZERO})。 |
0 |
spring.cloud.gateway.httpclient.pool.max-connections |
僅適用於類型 FIXED,在開始對現有連線進行待處理取得之前的最大連線數。 | |
spring.cloud.gateway.httpclient.pool.max-idle-time |
以毫秒計的時間,之後頻道會關閉。 如果 NULL為 ,則沒有最大空閒時間。 |
|
spring.cloud.gateway.httpclient.pool.max-life-time |
通道關閉后的持續時間。 如果 NULL為 ,則沒有最大存留時間。 |
|
spring.cloud.gateway.httpclient.pool.metrics |
允許在 Micrometer 中收集並註冊通道集區計量。 預設為停用。 | false |
spring.cloud.gateway.httpclient.pool.name |
頻道池圖名稱。 預設值是 proxy。 |
proxy |
spring.cloud.gateway.httpclient.pool.type |
要使用的 HttpClient 集區類型,預設為 ELASTIC。 |
|
spring.cloud.gateway.httpclient.response-timeout |
回應逾時。 | |
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout |
SSL close_notify 傳送逾時。 預設值是 3000 ms。 |
3000ms |
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout |
SSL close_notify 讀取逾時。 預設值是 0 ms。 |
0 |
spring.cloud.gateway.httpclient.ssl.handshake-timeout |
SSL 交握逾時。 預設值是 10000 ms. |
10000ms |
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager |
安裝 netty InsecureTrustManagerFactory。 這個數值不安全,不適合生產。 |
false |
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length |
最大框架承載長度。 | |
spring.cloud.gateway.httpclient.websocket.proxy-ping |
將 ping 框架代理至下游服務。 預設值是 true。 |
true |
spring.cloud.gateway.httpclient.wiretap |
為 Netty HttpClient 啟用 wiretap 偵錯。 |
false |
spring.cloud.gateway.httpserver.wiretap |
為 Netty HttpServer 啟用 wiretap 偵錯。 |
false |
spring.cloud.gateway.metrics.enabled |
啟用度量資料收集。 | false |
spring.cloud.gateway.metrics.prefix |
閘道器發出之所有指標的前綴。 | spring.cloud.gateway |
spring.cloud.gateway.metrics.tags |
新增至度量的標籤對應。 | |
spring.cloud.gateway.observability.enabled |
指示是否應開啟微尺可偵測性支援。 | true |
一般設定
下列清單描述常見的組態:
- 記錄相關設定:
logging.level.*logging.group.*-
logging.*命名空間下的任何其他設定都應該禁止。 例如,應該禁止使用logging.file來寫入記錄檔。