連接至 Azure 容器應用程式中 Spring 的受控閘道器(預覽)

Gateway for Spring 提供一種高效且強大的路由、管理及處理 API 請求的方式,作為微服務架構的一部分。 其可作為 API 閘道,將外部要求路由傳送至不同的服務,並新增各種功能,例如篩選、負載平衡等等。 在本文中,您將瞭解如何建立閘道,以將要求導向至您的容器應用程式。

在本教學課程中,您將了解:

  • 為 Spring Java 元件建立閘道器
  • 使用自定義路由更新 spring 的閘道,以將要求重新導向至容器應用程式

重要

本教學使用可能影響 Azure 帳單的服務。 如果您決定逐步執行操作,請務必刪除本文中介紹的資源,以免產生非預期的帳單。

必要條件

  • 一個有有效訂閱的 Azure 帳號。 如果您還沒有帳戶,您可以 免費建立一個。
  • Azure CLI

考量

在 Azure 容器應用程式 中執行 Gateway for Spring 時,請注意以下細節:

項目 說明
Scope Spring 的閘道會在與連線的容器應用程式相同的環境中執行。
資源 Spring 閘道的容器資源配置是固定的,CPU 核心的數目是 0.5,記憶體大小為 1Gi。
定價 適用於 Spring 的閘道器計費採用隨用隨付模式。 受管理的 Java 元件所消耗的資源會依活動/閒置速率計費。 您可以刪除不再使用的元件來停止計費。

設定

開始使用 Spring 的閘道之前,您必須先建立必要的資源。

執行下列命令來建立您的資源群組和容器應用程式環境。

  1. 建立變數以支援您的應用程式設定。 這些值是針對本課程的目的而向您提供的。 在這一課,我們會使用系統管理員的執行器端點進行 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 容器應用程式中所使用的容器映像。
  2. 用 Azure CLI 登入 Azure。

    az login
    
  3. 建立資源群組。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. 建立您的容器應用程式環境。

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

    此環境可用來裝載 Spring 元件的閘道和容器應用程式。

使用適用於 Spring 的閘道器 Java 元件

現在您已擁有 Container Apps 環境,您可以建立容器應用程式,使用適用於 spring java 元件的閘道,將要求路由傳送至它們。

  1. 建立 Gateway for Spring Java 元件。

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. 建立具有完整功能域名(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複製到文字編輯器,讓您可以在下一個步驟中使用。

更新閘道器路由以轉送請求

  1. 使用下列內容建立 YAML 檔案。 將 <MYAPP_URL> 取代為上一個步驟中的容器應用程式 FQDN。

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. 執行下列命令,以使用您的路由組態來更新 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 來寫入記錄檔。