共用方式為


教學課程:連線到 Azure Container Apps 中 Spring 的受控網關(預覽版)

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

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

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

重要

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

必要條件

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

考量

在 Azure Container Apps 的 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. 建立 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 屬性)

下表描述您可以為應用程式設定的閘道元件屬性。 如需詳細資訊,請參閱 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 來寫入記錄檔。