使用zuul网关,hystrix不生效的问题,方法调用超时

背景

在使用zuul结合ribbonfeign时实现服务转发,负载均衡,出现服务调用失败,页面总是出现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提供了两种不同的执行命令来强制执行超时:SEMAPHORETHREAD执行超时。

  • 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

你可能感兴趣的:(SpringCloud)