你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 容器应用 中连接到 Spring 的托管网关(预览版)

适用于 Spring 的网关提供了一种高效且强大的方法来路由、管理和处理 API 请求,作为微服务体系结构的一部分。 它充当 API 网关,用于将外部请求路由到不同的服务,并添加各种功能(例如筛选、负载均衡等)。 本文介绍如何创建将请求定向到容器应用的网关。

在本教程中,学习:

  • 为 Spring Java 组件创建网关
  • 使用自定义路由更新Spring框架的网关,以将请求重定向到容器化应用程序。

重要

本教程使用可能影响Azure帐单的服务。 如果你决定按部就班,请确保删除本文中特别推荐的资源,以避免意外计费。

先决条件

注意事项

在 Azure 容器应用 的 Gateway for Spring 中运行时,请注意以下详细信息:

说明
Scope Gateway for Spring 与连接的容器应用在同一环境中运行。
资源 Gateway for Spring 的容器资源分配是固定的,CPU 核心数为 0.5,内存大小为 1Gi。
定价 Gateway for Spring 计费属于按需定价。 托管Java组件消耗的资源按活动/空闲费率计费。 可以删除不再使用的组件以停止计费。

安装

在开始使用 Gateway for 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
    

    此环境用于托管 Gateway for Spring 组件和容器应用。

请使用用于 Spring Java 组件的网关

有了容器应用环境后,可以创建容器应用,并使用用于 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. 运行以下命令来使用路由配置更新 Gateway for 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 访问此 URL 应将请求路由到应用的 actuator/health 终结点,并返回 {"status":"UP","groups":["liveness","readiness"]}

清理资源

本教程中创建的资源对Azure帐单产生影响。 如果不打算长期使用这些服务,请运行以下命令来删除本教程中创建的所有内容。

az group delete --resource-group $RESOURCE_GROUP

路由文件格式

Gateway for Spring 组件支持通过 ID、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 Gateway 允许的配置列表 (#configurable-properties)

下表介绍了可为应用配置的网关组件属性。 有关详细信息,请参阅 Spring Cloud Gateway 常见应用程序属性

属性名称 说明 默认值
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() + "_"。 服务 ID 被附加上去以创建 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 的窃听调试。 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 可观测性支持。 true

常见配置

以下列表描述了常见配置:

  • 日志记录相关配置:
    • logging.level.*
    • logging.group.*
    • 应禁止 logging.* 命名空间下的任何其他配置。 例如,应禁止使用 logging.file 写入日志文件。