http各种超时配置-创新互联

  1. httpclient–请求方浏览器
    connectTimeOut:建立连接时间 三次握手 org.apache.http.conn.HttpHostConnectException: Connect to 1.2.3.4:80 [/1.2.3.4] failed: Connection timed out: connect
    socketTimeOut:链接建立成功后,数据包传输之间时间超时限制,数据包,非此次接口调用时间,一定要设置 否则长时间等待
    java.net.SocketTimeoutException: Read timed out
    connectionRequestTimeOut:从连接池获取连接的超时限制,不常用
  2. nginx–响应方服务器
    client_header_timeout:读取客户端请求头超时时间,默认为60s,如果在此超时时间内客户端没有发送完请求头,则响应408(RequestTime-out)
    client_body_timeout:同上
    send_timeout
    keepalive_timeout timeout [header_timeout]:关联httpclient连接池 重要:设置HTTP长连接超时时间,其中,第一个参数timeout是告诉Nginx长连接超时时间是多少,默认为75s。第二个参数header_timeout是用于设置响应头“Keep-Alive: timeout=time”,即告知客户端长连接超时时间。两个参数可以不一样,“Keep-Alive:timeout=time”响应头可以在Mozilla和Konqueror系列浏览器起作用,而MSIE长连接默认大约为60s,而不会使用“Keep-Alive: timeout=time”。如Httpclient框架会使用“Keep-Alive: timeout=time”响应头的超时(如果不设置默认,则认为是永久)。如果timeout设置为0,则表示禁用长连接。
    还有各种转发超时
  3. Spring Cloud各个框架超时配置
    feign:default或feignName或contextId:feign 作为最前端暴露给用户使用的,一般其超时设置相当于对用户的一个承诺,所以Spring在处理这一块的时候,会有意识地使用feign的超时时间来设置后面的ribbon 和http client组件。需要注意的是:hystrix的超时处理和feign之间在当前的Spring Cloud框架规划中,并没有相关关系。
    feign.client.config.default.connectTimeout:网络连接
    feign.client.config.default.readTimeout:数据读取
    hystrix:Hystrix的超时设置,在于命令执行的时间,一般而言,这个时间要稍微比Feign的超时时间稍微长些,因为Command除了请求调用之外,还有一些业务代码消耗。Hystrix的超时时间是站在命令执行时间来看的,和Feign设置的超时时间在设置上并没有关联关系。Hystrix不仅仅可以封装Http调用,还可以封装任意的代码执行片段。Hystrix是从命令对象的角度去定义,某个命令执行的超时时间,超过此此时间,命令将会直接熔断。假设hystrix 的默认超时时间设置了10000,即10秒,而feign 设置的是20秒,那么Hystrix会在10秒到来是直接熔断返回,不会等到feign的20秒执行结束,也不会中断尚未执行完的feign调用。
    hystrix.command.default.execution.isolation.strategy = THREAD
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 10000
    hystrix.command.default.execution.timeout.enabled = true
    hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true
    hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel = false
    ribbon:当feign设置了超时时间,Ribbon会依据feign的设置同步。Ribbon的这个超时时间,用于指导真正调用接口时,设置真正实现者的超时时间。Ribbon和Feign是相对独立的组件,在一个Spring Cloud框架运行环境中,可以没有Feign。那么,在这种场景下,假设Http Client客户端使用的是OKHttp,并且通过ribbon.okhttp.enabled 指定ribbon调用时,会使用ribbon的超时配置来初始化OkHttp.为了保证整个组件调用链的超时关系,一般Spring Cloud采取的策略是:依赖方的超时配置覆盖被依赖方的配置。当然这个也不是绝对的,实际上对于Feign而言,可以直接指定Feign和HttpClient之间的配置关系
    feign.httpclient.maxConnections = 200http //client大连接数,默认200
    feign.httpclient.maxConnectionsPerRoute= 50 //每个IP路由大连接数量
    feign.httpclient.timeToLive = 900 //连接存活时间
    feign.httpclient.timeToLiveUnit = SECONDS //连接存活时间单位
    feign.httpclient.connectionTimeout = 2000 //连接超时时间
    fein.httpclient.connectionTimeout=3000 //连接超时定时器的执行频率
    Hystrix的超时时间和Feign或者Http Client的超时时间关系
    Hystrix的超时意义是从代码执行时间层面控制超时;而Feign或Http Client 则是通过Http底层TCP/IP的偏网络层层面控制的超时。
    建议是:一般情况下,Hystrix 的超时时间要大于Feign或Http Client的超时时间;而对于特殊需求的接口调用上,为了避免等待时间太长,需要将对应的Hystrix command 超时时间配置的偏小一点,满足业务侧的要求。
    zuul
    zuul.host.socket-timeout-millis=2000 #默认1000
    zuul.host.connect-timeout-millis=4000 #默认2000

others
#断路器详细设置
#当在配置时间窗口内达到此数量的失败后,进行短路。默认20个)
#hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
#短路多久以后开始尝试是否恢复,默认5s)
#hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5
#出错百分比阈值,当达到此阈值后,开始短路。默认50%)
#hystrix.command.default.circuitBreaker.errorThresholdPercentage=50%
#重试机制
#该参数用来开启重试机制,默认是关闭
spring.cloud.loadbalancer.retry.enabled=true
#对所有操作请求都进行重试
ribbon.OkToRetryOnAllOperations=true
#对当前实例的重试次数
ribbon.MaxAutoRetries=1
#切换实例的重试次数
ribbon.MaxAutoRetriesNextServer=1
#根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置),如果不行,就换一个实例进行访问,如果还是不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),
zuul请求也是通过Ribbon负载均衡客户端去调用其他服务的,ribbon客户端默认是用HttpClient来发起http请求调用,ribbon内部又会构造hystrix command来执行请求(所以我们常说ribbon的超时时间设置要大于等于hystrix 超时时间,不然导致command还没执行完,ribbon却超时了)

创新互联提供成都做网站、成都网站建设、网页设计,成都品牌网站建设广告投放平台等致力于企业网站建设与公司网站制作,十余年的网站开发和建站经验,助力企业信息化建设,成功案例突破近1000家,是您实现网站建设的好选择.

feign调用原理
feign调用

zuul路由拦截器

Ribbon有哪些负载均衡策略:
轮询策略
权重策略
随机策略
最小连接数策略
重试策略
可用性敏感策略
区域敏感策略

Feign和Ribbon的重试机制相当于一个双层循环,feign重试机制在外层,Ribbon的重试机制在里层,每执行一次feign的重试机制,内层的Ribbon的重试机制都会全部执行一次。Feign和OpenFeign的底层就是Ribbon,所以当项目使用了Feign或OpenFeign的重试机制,就不要开启Ribbon的重试机制,反之亦然。否则重试配置重叠,实际重试次数是二者的笛卡尔积。

ribbon的重试机制是使用RequestSpecificRetryHandler和LoadBalancerCommand来处理的,我们可以在配置文件定义参数,Spring框架会自动帮我们加载到RequestSpecificRetryHandler和LoadBalancerCommand的属性中去

feign的重试机制的实现类是Retryer,他的核心参数含义如下:
maxAttempts-大尝试次数,默认值为5,首次请求也算一次,请求1次,重试4次。
period;-初始时间,用于参与计算线程休眠时间。
maxPeriod;-线程休眠的单次大时间上限。
attempt;-尝试次数,每次尝试+1。
sleptForMillis;-线程累计休眠总时间。

Spring Cloud组件那么多超时设置,我们如何理解和运用?

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:http各种超时配置-创新互联
分享链接:http://myzitong.com/article/djdogc.html