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

连接到 Azure 容器应用中托管的 Gateway for Spring(预览版)

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

在本教程中,学习:

  • 创建 Gateway for Spring Java 组件
  • 使用自定义路由更新 Gateway for 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 组件的名称。 在本例中,你将创建一个 Gateway for 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 组件和容器应用。

使用 Gateway for Spring Java 组件

有了容器应用环境后,可以创建容器应用来使用 Gateway for 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. 运行以下命令来使用路由配置更新 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}"

Gateway for Sprin 允许的配置列表 (#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
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 是否应启用 Micrometer 可观测性支持。 true

常见配置

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

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