教學課程:連線到 Azure Container Apps 中 Spring 的受控網關(預覽版)
Spring 的閘道提供有效率且功能強大的方式,可在微服務架構中路由、管理及處理 API 要求。 其可作為 API 閘道,將外部要求路由傳送至不同的服務,並新增各種功能,例如篩選、負載平衡等等。 在本文中,您將瞭解如何建立閘道,以將要求導向至您的容器應用程式。
在本教學課程中,您將了解:
- 建立 Spring Java 元件的閘道
- 使用自定義路由更新 spring 的閘道,以將要求重新導向至容器應用程式
重要
本教學課程所使用的服務,可能會影響您的 Azure 帳單。 如果您決定逐步執行操作,請務必刪除本文中介紹的資源,以免產生非預期的帳單。
必要條件
考量
在 Azure Container Apps 的 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 區域位置。 ENVIRONMENT
適用於您示範應用程式的 Azure 容器應用程式環境名稱。 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 元件的閘道,將要求路由傳送至它們。
建立 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 屬性)
下表描述您可以為應用程式設定的閘道元件屬性。 如需詳細資訊,請參閱 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 |
標頭的名稱,其中包含 Proxy 要求的 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 |
millis 中的連線逾時。 預設值是 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 |
Proxy Ping 畫面到下游服務。 預設值是 true 。 |
true |
spring.cloud.gateway.httpclient.wiretap |
啟用 Netty HttpClient 的竊點偵錯。 |
false |
spring.cloud.gateway.httpserver.wiretap |
啟用 Netty HttpServer 的竊點偵錯。 |
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 |
如果應該開啟 Micrometer Observability 支援。 | true |
一般設定
下列清單描述常見的組態:
- 記錄相關設定:
logging.level.*
logging.group.*
logging.*
命名空間下的任何其他設定都應該禁止。 例如,應該禁止使用logging.file
來寫入記錄檔。