spring gateway route超时时间原理解析和gateway调用流
1、HttpClientProperties 设置网关路由超时时间
private Integer connectTimeout; private Duration responseTimeout;2、GateayAutoConfiguration配置类当用户没有配置httpclient,gateayHttpClient方法会用HttpClientProperties 配置httpclient对象,配置httpclient的tcp默认的connectTimeout。
其中还会根据HttpClientProperties 配置 最大的响应头、Proxy、ssl、ConnectionProvider
@Bean @ConditionalOnMissingBean public HttpClient gateayHttpClient(HttpClientProperties properties, List3、NettyRoutingFilter 负责路由的服务调用,此类中根据路由配置设置远程调用的一些参数。customizers) {
getHttpClient方法会尝试 从路由信息中获取connect-timeout,如果存在则设置tcp 的connectTimeout参数。
getResponseTimeout方法 会尝试 从路由信息中获取response-timeout参数,如果存在,给http调用设置超时回调
protected HttpClient getHttpClient(Route route, ServerWebExchange exchange) { Object connectTimeoutAttr = route.getMetadata().get(CONNECT_TIMEOUT_ATTR); if (connectTimeoutAttr != null) { Integer connectTimeout = getInteger(connectTimeoutAttr); return this.httpClient.tcpConfiguration((tcpClient) -> tcpClient .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectTimeout)); } return httpClient; }
private Duration getResponseTimeout(Route route) { Object responseTimeoutAttr = route.getMetadata().get(RESPONSE_TIMEOUT_ATTR); Long responseTimeout = null; if (responseTimeoutAttr != null) { if (responseTimeoutAttr instanceof Number) { responseTimeout = ((Number) responseTimeoutAttr).longValue(); } else { responseTimeout = Long.valueOf(responseTimeoutAttr.toString()); } } return responseTimeout != null ? Duration.ofMillis(responseTimeout) : properties.getResponseTimeout(); }
{
Duration responseTimeout = getResponseTimeout(route); if (responseTimeout != null) { responseFlux = responseFlux .timeout(responseTimeout, Mono.error(ne TimeoutException( "Response took longer than timeout: " + responseTimeout))) .onErrorMap(TimeoutException.class, th -> ne ResponseStatusException(HttpStatus.GATEWAY_TIMEOUT, th.getMessage(), th)); }
}
4、参数配置spring: cloud: gateay: discovery: locator: enabled: true loer-case-service-id: true httpclient: connect-timeout: 1 response-timeout: 1S routes: - id: yoci-api # uri: lb://yoci-api # 动态路由方式需要配合eureka、nacos注册中心使用 uri: http://localhost:8082 predicates: - Path=/api/ filters: - StripPrefix=1 metadata: connect-timeout: 10 #单位毫秒 response-timeout: 10000 - id: autho2-server # uri: lb://yoci-auth # 动态路由方式需要配合eureka、nacos注册中心使用 uri: http://localhost:8081 predicates: - Path=/auth/ filters:5、filter 链
1、RemoveCachedBodyFilter
请求处理完后,释放缓存的 cachedRequestBody
2、AdaptCachedBodyGlobalFilter
缓存的 cachedRequestBody
3、NettyWriteResponseFilter
1、 过滤器链处理出现异常,释放下游服务的请求链接
2、请求会正常,从ServerWebExchange,获取下游服务的请求链接connection和 当前请求的response。从下游服务的链接中接收下游服务响应数据。并且根据响应头,将数据返回分为流式数据和非流式数据。流式通过connection .inbound() .receive() .retain() .map(byteBuf -> rap(byteBuf, response)); 不停的产生数据给client
4、ForardPathFilter
从路由信息中获取路由地址,如果不是以forard开头,则直接放过。否则 修改当前请求的地址为 路由forard地址
5、ReritePathGateayFilterFactory
获取请求url 放入gateayOriginalRequestUrl 变量中, 根据配置,修改请求的path,
例如 /apiserver/helloadmin to /helloadmin
6、RouteToRequestUrlFilter
获取路由信息,获取lb 的服务名,请求的path,重新构建请求path
gateayRequestUrl lb://apiserver/helloadmin
7、LoadBalancerClientFilter
如果gateayRequestUrl 请求的地址 的schemePrefix 是lb ,则
通过LoadBalancerClien和 lb://apiserver/helloadmin的host从注册中心获取一个可用的ServiceInstance,并且lb://apiserver 替换为 实例的协议、ip、port ,构建新的请求路径,
将原有的路径添加到gateayOriginalRequestUrl中,将新路径添加到gateayRequestUrl属性中。8、WebsocketRoutingFilter
如果是ebsocket请求,拦截,协议升级,走ebsocket 逻辑WebSocketService
9、NettyRoutingFilter(只处理http 和https)
获取gateayRequestUrl 属性中此时真正要访问的路径,以及当前请求的httpMethod、headers、body为发起请求做准备。
1、根据路由信息中的metadata中的connect-timeout信息配置httpclient的tcp
2、 设置请求头和请求方法、路径,并发送请求
3、响应处理。cliRes 和 connection 设置到ServerWebExchange的gateayClientResponse、gateayClientResponseConnection 属性中。并获取cliRes的响应头和响应码,设置到ServerWebExchange中的response对象中。connection 将在NettyWriteResponseFilter 中使用,往调用发写数据。4、根据route中的metadata中的response-timeout信息和 HttpClientProperties中的responseTimeout,设置超时监控。优先级 route > HttpClientProperties。如果都没有配置超时时间,则不设置超时回调。
10、ForardRoutingFilter如果是转发路径 forard// 则调用DispatcherHandler 进行服务转发
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线