你当前正在访问 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 之前,首先需要创建所需的资源。
执行以下命令来创建资源组和容器应用环境。
创建变量来支持应用程序配置。 这些值是为了本课程的目的而向你提供的。 在本课中,我们对 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
容器应用中使用的容器映像。 使用 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
此环境用于托管 Gateway for Spring 组件和容器应用。
使用 Gateway for Spring Java 组件
有了容器应用环境后,可以创建容器应用来使用 Gateway for Spring Java 组件将请求路由到它们。
创建 Gateway for 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}"
运行以下命令来使用路由配置更新 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
写入日志文件。