SpringCloud GateWay配置—TLS 和 SSL、Http超时配置
一、TLS 和 SSL
网关可以按照通常的 Spring 服务器配置侦听 HTTPS 上的请求。 以下示例演示如何执行此操作:
application.yml
server:ssl:enabled: truekey-alias: scgkey-store-password: scg1234key-store: classpath:scg-keystore.p12key-store-type: PKCS12
您可以将网关路由路由到 HTTP 和 HTTPS 后端。 如果要路由到 HTTPS 后端,则可以使用以下配置将网关配置为信任所有下游证书:
application.yml
spring:cloud:gateway:httpclient:ssl:useInsecureTrustManager: true
使用不安全的信任管理器不适合生产。 对于生产部署,您可以使用一组已知证书配置网关,这些证书可以通过以下配置信任这些证书:
application.yml
spring:cloud:gateway:httpclient:ssl:trustedX509Certificates:- cert1.pem- cert2.pem
如果Spring Cloud Gateway没有配置受信任的证书,则使用默认的信任存储(您可以通过设置javax.net.ssl.trustStore系统属性来覆盖该存储)。
1、TLS 握手
网关维护用于路由到后端的客户端池。 通过 HTTPS 进行通信时,客户端会启动 TLS 握手。 许多超时与此握手相关联。 您可以配置这些超时,可以按如下方式配置(显示默认值):
spring:cloud:gateway:httpclient:ssl:handshake-timeout-millis: 10000close-notify-flush-timeout-millis: 3000close-notify-read-timeout-millis: 0
二、Http超时配置
1、全局超时
要配置全局 http 超时:
必须以毫秒为单位指定。
必须指定为 java.time.Durationconnect-timeoutresponse-timeout
全局 HTTP 超时示例
spring:cloud:gateway:httpclient:connect-timeout: 1000response-timeout: 5s
2、Per-route 超时
要配置每个路由超时:
连接超时必须以毫秒为单位指定。
必须以毫秒为单位指定响应超时。
- id: per_route_timeoutsuri: https://example.orgpredicates:- name: Pathargs:pattern: /delay/{timeout}metadata:response-timeout: 200connect-timeout: 200
使用 Java DSL 的每路由超时配置
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR;
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPONSE_TIMEOUT_ATTR;@Beanpublic 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();}
per-route 的response-timeout值为负值将禁用response-timeout的值。
- id: per_route_timeoutsuri: https://example.orgpredicates:- name: Pathargs:pattern: /delay/{timeout}metadata:response-timeout: -1
3、Fluent Java Routes API
为了在Java中实现简单的配置,RouteLocatorBuilder bean包含了一个流畅的API。下面的列表显示了它的工作原理:
GatewaySampleApplication.java
// 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();
}
这种样式还允许更多的自定义谓词断言。RouteDefinitionLocator bean定义的谓词使用逻辑和组合。通过使用流利的Java API,可以在Predicate类上使用and()、or()和negative()运算符。
4、The DiscoveryClient Route Definition Locator
您可以将网关配置为基于在DiscoveryClient兼容服务注册表中注册的服务创建路由。
要启用此功能,请将spring.cloud.gateway.discovery.locater.enabled=true设置为true,并确保类路径上已启用DiscoveryClient实现(如Netflix Eureka、Consul或Zookeeper)。