使用zuul网关,hystrix不生效的问题,方法调用超时
背景
在使用zuul结合
ribbon
或feign
时实现服务转发,负载均衡,出现服务调用失败,页面总是出现500.熔断器失败的问题。
需要再zuul的配置文件中添加如下信息:
设置熔断器的超时时间
zuul:
host:
connect-timeout-millis: 60000
# socket超时时间,如果使用service-id方式是不用配置的
# socket-timeout-millis: 3000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
feign默认关闭hystrix断路器功能
feign:
hystrix:
enabled: true
如果熔断器经常被调用,说明远程调用的超时时间存在问题,我们需要重新设置超时时间。
ribbon:
#方法调用处理时间
ReadTimeout: 6000
#连接时间
ConnectTimeout: 60000
##最大自动重试次数
maxAutoRetries: 1
## 换实例重试次数
MaxAutoRetriesNextServer: 2
1/TIMEOUT
Zuul的请求通过Hystrix来进行监视,其目的是,针对长时间运行的请求做超时处理。
Hystrix提供了两种不同的执行命令来强制执行超时:
SEMAPHORE
和THREAD
执行超时。
THREAD
模式
当使用thread进行隔离的时候,Hystrix命令会通过从线程池分离一个单独的线程来执行。
Hystrix会暂停这个持有请求的线程,直到下游服务器收到响应,或者发生超时。
上游就是,需要调用你的服务的接口的服务器
下游就是,你需要去调接口的服务器
SEMAPHORE
使用SEMAPHORE隔离时,会在请求线程上执行Hystrix命令.仅在从下游服务器收到响应后才检测超时.因此,如果您将Zuul / Hystrix配置为超时5秒,并且您的服务需要30秒才能完成.只有在30秒后,您的客户才会收到超时通知 - 即使服务响应成功。
除少数情况外,Netflix建议默认执行THREAD
,SpringCloud Zuul默认集成SEMAPHORE
模式。
2/ RETRY
Ribbon 使用远程服务调用,它使用Eureka提供的信息来确定可用的服务和相应的地址。Eureka使用一个本地缓存,每30秒更新一次的本地缓存。你调用的本地服务,可能是过时的服务,或者是服务已经不存在。
Ribbon 当无法连接到服务的时候,或进行自动重试机制。通过配置,可以设置在尝试连接另一台服务器之前,重试相同的服务器几次。
# 最大的重试相同服务器次数 (不包含第一次重试)
ribbon.maxAutoRetries = 1
# 最大的尝试下一台服务器次数 (不包含第一个服务)
ribbon.MaxAutoRetriesNextServer = 2
3/ CONNECT TIMEOUT
连接远程服务器失败的时间非常短,停止服务的时间非常长。尝试连接没有服务监听的TCP端口应该立即失败,
# Connect timeout used by Apache HttpClient
ribbon.ConnectTimeout=3000
# Read timeout used by Apache HttpClient
ribbon.ReadTimeout=5000
还没有评论,来说两句吧...