Spring Cloud Gateway系列【10】 配置Gateway详解

景俊良
2023-12-01

前言

在之前介绍了一些Spring Cloud Gateway配置项,接下来详细介绍下所有配置项。

官方文档地址

application.yml 配置项

可以在application.properties、application.yml、代码、命令行开关中指定各种属性。

本附录提供了常见 Spring Cloud Gateway 属性的列表以及对使用它们的底层类的引用。

名称默认说明
spring.cloud.gateway.default-filters作用于每个路由的过滤器列表
spring.cloud.gateway.discovery.locator.enabledfalse启用服务发现,动态路由
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expressiontrue是否在网关集成中包含服务的 SpEL 表达式,默认为:true。
spring.cloud.gateway.discovery.locator.lower-case-service-idfalse在谓词和过滤器中小写 serviceId ,默认为 false。当 eureka 自动大写 serviceId 时很有用。所以 MYSERIVCE,会匹配 /myservice/**
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefixrouteId 的前缀,默认为 discoveryClient.getClass().getSimpleName() + “_”+服务 ID 。将以创建 routeId。
spring.cloud.gateway.discovery.locator.url-expression‘lb://’+serviceId为每个路由创建 uri 的 SpEL 表达式,默认为:‘lb://’+serviceId。
spring.cloud.gateway.enabledtrue启用网关功能。
spring.cloud.gateway.fail-on-route-definition-errortrue路由定义错误失败的选项,默认为 true。否则,将记录警告。
spring.cloud.gateway.filter.add-request-header.enabledtrue启用 add-request-header 过滤器。
spring.cloud.gateway.filter.add-request-parameter.enabledtrue启用添加请求参数过滤器。
spring.cloud.gateway.filter.add-response-header.enabledtrue启用添加响应头过滤器。
spring.cloud.gateway.filter.circuit-breaker.enabledtrue启用断路器过滤器。
spring.cloud.gateway.filter.dedupe-response-header.enabledtrue启用重复数据删除响应头过滤器。
spring.cloud.gateway.filter.fallback-headers.enabledtrue启用回退标头过滤器。
spring.cloud.gateway.filter.hystrix.enabledtrue启用 hystrix 过滤器。
spring.cloud.gateway.filter.map-request-header.enabledtrue启用 map-request-header 过滤器。
spring.cloud.gateway.filter.modify-request-body.enabledtrue启用修改请求正文过滤器。
spring.cloud.gateway.filter.modify-response-body.enabledtrue启用修改响应正文过滤器。
spring.cloud.gateway.filter.prefix-path.enabledtrue启用前缀路径过滤器。
spring.cloud.gateway.filter.preserve-host-header.enabledtrue启用保留主机头过滤器。
spring.cloud.gateway.filter.redirect-to.enabledtrue启用重定向过滤器。
spring.cloud.gateway.filter.remove-hop-by-hop.headers
spring.cloud.gateway.filter.remove-hop-by-hop.order
spring.cloud.gateway.filter.remove-request-header.enabledtrue启用 remove-request-header 过滤器。
spring.cloud.gateway.filter.remove-request-parameter.enabledtrue启用删除请求参数过滤器。
spring.cloud.gateway.filter.remove-response-header.enabledtrue启用 remove-response-header 过滤器。
spring.cloud.gateway.filter.request-header-size.enabledtrue启用请求头大小过滤器。
spring.cloud.gateway.filter.request-header-to-request-uri.enabledtrue启用 request-header-to-request-uri 过滤器。
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-keytrue如果密钥解析器返回空密钥,则切换到拒绝请求,默认为 true。
spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code当 denyEmptyKey 为 true 时返回的 HttpStatus,默认为 FORBIDDEN。
spring.cloud.gateway.filter.request-rate-limiter.enabledtrue启用请求速率限制器过滤器。
spring.cloud.gateway.filter.request-size.enabledtrue启用请求大小过滤器。
spring.cloud.gateway.filter.retry.enabledtrue启用重试过滤器。
spring.cloud.gateway.filter.rewrite-location-response-header.enabledtrue启用 rewrite-location-response-header 过滤器。
spring.cloud.gateway.filter.rewrite-location.enabledtrue启用重写位置过滤器。
spring.cloud.gateway.filter.rewrite-path.enabledtrue启用重写路径过滤器。
spring.cloud.gateway.filter.rewrite-response-header.enabledtrue启用重写响应头过滤器。
spring.cloud.gateway.filter.save-session.enabledtrue启用保存会话过滤器。
spring.cloud.gateway.filter.secure-headers.content-security-policydefault-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-optionsnosniff
spring.cloud.gateway.filter.secure-headers.disable
spring.cloud.gateway.filter.secure-headers.download-optionsnoopen
spring.cloud.gateway.filter.secure-headers.enabledtrue启用安全标头过滤器。
spring.cloud.gateway.filter.secure-headers.frame-optionsDENY
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policiesnone
spring.cloud.gateway.filter.secure-headers.referrer-policyno-referrer
spring.cloud.gateway.filter.secure-headers.strict-transport-securitymax-age=631138519
spring.cloud.gateway.filter.secure-headers.xss-protection-header1 ; mode=block
spring.cloud.gateway.filter.set-path.enabledtrue启用设置路径过滤器。
spring.cloud.gateway.filter.set-request-header.enabledtrue启用 set-request-header 过滤器。
spring.cloud.gateway.filter.set-request-host-header.enabledtrue启用 set-request-host-header 过滤器。
spring.cloud.gateway.filter.set-response-header.enabledtrue启用 set-response-header 过滤器。
spring.cloud.gateway.filter.set-status.enabledtrue启用设置状态过滤器。
spring.cloud.gateway.filter.strip-prefix.enabledtrue启用带前缀过滤器。
spring.cloud.gateway.forwarded.enabledtrue启用 ForwardedHeadersFilter。
spring.cloud.gateway.global-filter.adapt-cached-body.enabledtrue启用adapt-cached-body 全局过滤器。
spring.cloud.gateway.global-filter.forward-path.enabledtrue启用转发路径全局过滤器。
spring.cloud.gateway.global-filter.forward-routing.enabledtrue启用转发路由全局过滤器。
spring.cloud.gateway.global-filter.load-balancer-client.enabledtrue启用负载平衡器客户端全局过滤器。
spring.cloud.gateway.global-filter.netty-routing.enabledtrue启用 netty-routing 全局过滤器。
spring.cloud.gateway.global-filter.netty-write-response.enabledtrue启用 netty-write-response 全局过滤器。
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabledtrue启用reactive-load-balancer-client 全局过滤器。
spring.cloud.gateway.global-filter.remove-cached-body.enabledtrue启用 remove-cached-body 全局过滤器。
spring.cloud.gateway.global-filter.route-to-request-url.enabledtrue启用 route-to-request-url 全局过滤器。
spring.cloud.gateway.global-filter.websocket-routing.enabledtrue启用 websocket-routing 全局过滤器。
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mappingfalse如果应将全局 CORS 配置添加到 URL 处理程序。
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.httpclient.compressionfalse为 Netty HttpClient 启用压缩。
spring.cloud.gateway.httpclient.connect-timeout以毫秒为单位的连接超时,默认为 45 秒。
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-interval0以指定的时间间隔在后台执行定期驱逐检查。默认禁用 ({@link Duration#ZERO})
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.metricsfalse允许在 Micrometer 中收集和注册通道池指标。默认禁用。
spring.cloud.gateway.httpclient.pool.nameproxy通道池映射名称
spring.cloud.gateway.httpclient.pool.typeHttpClient 使用的池类型,默认为 ELASTIC。
spring.cloud.gateway.httpclient.proxy.hostNetty HttpClient 代理配置的主机名。
spring.cloud.gateway.httpclient.proxy.non-proxy-hosts-pattern用于配置的主机列表的正则表达式 (Java)。应该直接到达,绕过代理
spring.cloud.gateway.httpclient.proxy.passwordNetty HttpClient 代理配置密码。
spring.cloud.gateway.httpclient.proxy.portNetty HttpClient 的代理配置端口。
spring.cloud.gateway.httpclient.proxy.typeproxyType 用于 Netty HttpClient 的代理配置。
spring.cloud.gateway.httpclient.proxy.usernameNetty HttpClient 代理配置的用户名。
spring.cloud.gateway.httpclient.response-timeout响应超时。
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout3000msSSL close_notify 刷新超时。默认为 3000 毫秒。
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout0SSL close_notify 读取超时。默认为 0 毫秒。
spring.cloud.gateway.httpclient.ssl.default-configuration-type默认的 ssl 配置类型。默认为 TCP。
spring.cloud.gateway.httpclient.ssl.handshake-timeout10000msSSL 握手超时。默认为 10000 毫秒
spring.cloud.gateway.httpclient.ssl.key-password密钥密码,默认与keyStorePassword 相同。
spring.cloud.gateway.httpclient.ssl.key-storeNetty HttpClient 的密钥库路径。
spring.cloud.gateway.httpclient.ssl.key-store-password密钥库密码。
spring.cloud.gateway.httpclient.ssl.key-store-providerNetty HttpClient 的密钥库提供程序,可选字段。
spring.cloud.gateway.httpclient.ssl.key-store-typeJKSNetty HttpClient 的密钥库类型,默认为 JKS。
spring.cloud.gateway.httpclient.ssl.trusted-x509-certificates用于验证远程端点证书的可信证书。
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-managerfalse安装 netty InsecureTrustManagerFactory。这是不安全的,不适合生产。
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length最大帧有效载荷长度。
spring.cloud.gateway.httpclient.websocket.proxy-pingtrue代理 ping 帧到下游服务,默认为 true。
spring.cloud.gateway.httpclient.wiretapfalse为 Netty HttpClient 启用窃听调试。
spring.cloud.gateway.httpserver.wiretapfalse为 Netty HttpServer 启用窃听调试。
spring.cloud.gateway.loadbalancer.use404false
spring.cloud.gateway.metrics.enabledfalse启用指标数据的收集。
spring.cloud.gateway.metrics.prefixspring.cloud.gateway网关发出的所有指标的前缀。
spring.cloud.gateway.metrics.tags添加到指标的标签映射。
spring.cloud.gateway.predicate.after.enabledtrue启用 after 谓词。
spring.cloud.gateway.predicate.before.enabledtrue启用 before 谓词。
spring.cloud.gateway.predicate.between.enabledtrue启用 between 谓词。
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabledtrue启用 cloud-foundry-route-service 谓词。
spring.cloud.gateway.predicate.cookie.enabledtrue启用 cookie 谓词。
spring.cloud.gateway.predicate.header.enabledtrue启用标头谓词。
spring.cloud.gateway.predicate.host.enabledtrue启用主机谓词。
spring.cloud.gateway.predicate.method.enabledtrue启用方法谓词。
spring.cloud.gateway.predicate.path.enabledtrue启用路径谓词。
spring.cloud.gateway.predicate.query.enabledtrue启用查询谓词。
spring.cloud.gateway.predicate.read-body.enabledtrue启用 read-body 谓词。
spring.cloud.gateway.predicate.remote-addr.enabledtrue启用远程地址谓词。
spring.cloud.gateway.predicate.weight.enabledtrue启用权重谓词。
spring.cloud.gateway.redis-rate-limiter.burst-capacity-headerX-RateLimit-Burst-Capacity返回突发容量配置的标头名称。
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headerstrue是否包含包含速率限制器信息的标头,默认为 true。
spring.cloud.gateway.redis-rate-limiter.remaining-headerX-RateLimit-Remaining返回当前秒内剩余请求数的标头名称。
spring.cloud.gateway.redis-rate-limiter.replenish-rate-headerX-RateLimit-Replenish-Rate返回补货率配置的标题名称。
spring.cloud.gateway.redis-rate-limiter.requested-tokens-headerX-RateLimit-Requested-Tokens返回请求的令牌配置的标头的名称。
spring.cloud.gateway.routesroute 路由集合。
spring.cloud.gateway.set-status.original-status-header-name包含代理请求的 http 代码的标头名称。
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabledtrue启用 XForwardedHeadersFilter。
spring.cloud.gateway.x-forwarded.for-appendtrue如果已启用将 X-Forwarded-For 作为列表附加。
spring.cloud.gateway.x-forwarded.for-enabledtrue如果启用 X-Forwarded-For。
spring.cloud.gateway.x-forwarded.host-appendtrue如果启用将 X-Forwarded-Host 作为列表附加。
spring.cloud.gateway.x-forwarded.host-enabledtrueX-Forwarded-Host 启用。
spring.cloud.gateway.x-forwarded.order0XForwardedHeadersFilter 的顺序。
spring.cloud.gateway.x-forwarded.port-appendtrue如果启用将 X-Forwarded-Port 作为列表附加。
spring.cloud.gateway.x-forwarded.port-enabledtrue如果启用 X-Forwarded-Port。
spring.cloud.gateway.x-forwarded.prefix-appendtrue如果将 X-Forwarded-Prefix 作为列表附加已启用。
spring.cloud.gateway.x-forwarded.prefix-enabledtrue
spring.cloud.gateway.x-forwarded.proto-appendtrue如果启用将 X-Forwarded-Proto 作为列表附加。
spring.cloud.gateway.x-forwarded.proto-enabledtrue如果启用 X-Forwarded-Proto。

其他配置

Http超时配置

可以为所有路由配置 Http 超时(响应和连接),并可以为每个路由特定配置。

1. 全局超时

配置全局 http 超时:

  • connect-timeout必须以毫秒为单位指定。
  • response-timeout必须指定为 java.time.Duration

示例:

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 1000
        response-timeout: 5s

2 . 每个路由超时

要配置每条路由超时:

  • connect-timeout必须以毫秒为单位指定。
  • response-timeout必须以毫秒为单位指定。
  - id: per_route_timeouts
    uri: https://example.org
    predicates:
      - name: Path
        args:
          pattern: /delay/{timeout}
    metadata:
      response-timeout: 200
      connect-timeout: 200

3. 使用 Java 代码为每条路由超时配置

import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR;
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPONSE_TIMEOUT_ATTR;

      @Bean
      public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
         return routeBuilder.routes()
               .route("test1", r -> {
                  return r.host("*.somehost.org").and().path("/somepath")
                        .filters(f -> f.addRequestHeader("header1", "header-value-1"))
                        .uri("http://someuri")
                        .metadata(RESPONSE_TIMEOUT_ATTR, 200)
                        .metadata(CONNECT_TIMEOUT_ATTR, 200);
               })
               .build();
      }

使用 Java API配置路由

为了允许在 Java 中进行简单配置,该RouteLocatorBuilderbean 包括一个流畅的 API。以下清单显示了它的工作原理:

// static imports from GatewayFilters and RoutePredicates
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGatewayFilterFactory throttle) {
    return builder.routes()
            .route(r -> r.host("**.abc.org").and().path("/image/png")
                .filters(f ->
                        f.addResponseHeader("X-TestHeader", "foobar"))
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.path("/image/webp")
                .filters(f ->
                        f.addResponseHeader("X-AnotherHeader", "baz"))
                .uri("http://httpbin.org:80")
                .metadata("key", "value")
            )
            .route(r -> r.order(-1)
                .host("**.throttle.org").and().path("/get")
                .filters(f -> f.filter(throttle.apply(1,
                        1,
                        10,
                        TimeUnit.SECONDS)))
                .uri("http://httpbin.org:80")
                .metadata("key", "value")
            )
            .build();
}

这种风格还允许更多的自定义谓词断言。Route Definition Locator bean定义的谓词使用逻辑组合and。通过使用流利的Java API,你可以使用and(),or()以及negate()的Predicate类。

Discovery Client路由 配置谓词和过滤器

默认情况下,网关使用DiscoveryClient.

默认谓词是使用模式定义的路径谓词/serviceId/**,其中serviceId是DiscoveryClient.

默认过滤器是带有正则表达式/serviceId/?(?< remaining>.*)和替换的重写路径过滤器/${ remaining}。这会在向下游发送请求之前从路径中剥离服务 ID。

如果要自定义DiscoveryClient路由使用的谓词或过滤器,请设置spring.cloud.gateway.discovery.locator.predicates[x]spring.cloud.gateway.discovery.locator.filters[y]。这样做时,如果您想保留该功能,您需要确保包含前面显示的默认谓词和过滤器。以下示例显示了它的样子:

spring.cloud.gateway.discovery.locator.predicates[0].name: Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name: Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name: CircuitBreaker
spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId
spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/?(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"

CORS 配置

您可以配置网关以控制 CORS 行为。全局 CORS 配置是 URL 模式到Spring Framework Cors Configuration的映射。以下示例配置 CORS:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "https://docs.spring.io"
            allowedMethods:
            - GET

在前面的示例中,允许来自docs.spring.io所有 GET 请求路径的请求的 CORS 请求。

要为某些网关路由谓词未处理的请求提供相同的 CORS 配置,请将spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping属性设置为true。

 类似资料: