zoukankan      html  css  js  c++  java
  • Zuul超时问题,微服务响应超时,zuul进行熔断

    天碰到了微服务响应超时问题,而且超时时间特别短,2秒就超时,zuul就走熔断了。
    我采用zuul作为网关,根据不同的访问路径进行微服务的路由,譬如有个服务是user,我访问user服务的某个接口时,该接口执行时间很慢,2秒多,然后还没执行完,zuul就执行熔断了,进入了我配好的ZuulFallbackProvider里。所以来研究一下zuul的超时处理。
    前提,zuul和微服务都已经注册到了eureka中,zuul采用service-id来进行路由,当访问/user时进入到user服务中。而且,已经为user服务设置好了zuul的熔断,譬如已经写好了UserFallbackProvider implements ZuulFallbackProvider。我特别设置了模拟超时的接口,就是搞几个接口sleep不同的时间。

    @GetMapping("/test1")
    public Object test1() {
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    return "dbToEs";
    }

    @GetMapping("/test2")
    public Object test2() {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    return "dbToEs";
    }

    @GetMapping("/test3")
    public Object test3() {
    try {
    Thread.sleep(5500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    return "dbToEs";
    }

    关键是zuul的配置文件,通过配置不同的超时策略来完成超时处理。
    注意看官方的文档:http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_zuul_timeouts
    这里就是讲zuul的超时的,配置很简单:
    ribbon.ReadTimeout, ribbon.SocketTimeout这两个就是ribbon超时时间设置,当在yml写时,应该是没有提示的,给人的感觉好像是不是这么配的一样,其实不用管它,直接配上就生效了。
    还有zuul.host.connect-timeout-millis, zuul.host.socket-timeout-millis这两个配置,这两个和上面的ribbon都是配超时的。区别在于,如果路由方式是serviceId的方式,那么ribbon的生效,如果是url的方式,则zuul.host开头的生效。(此处重要!使用serviceId路由和url路由是不一样的超时策略)
    如果你在zuul配置了熔断fallback的话,熔断超时也要配置,不然如果你配置的ribbon超时时间大于熔断的超时,那么会先走熔断,相当于你配的ribbon超时就不生效了。
    熔断超时是这样的:
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
    default代表默认,如果你想为某个特定的service配熔断超时策略,可以用这种方式:

    总结起来就是三种超时配置:
    网关的超时层级
    zuul

    zuul:
    max:
    host:
    connections: 500
    host:
    socket-timeout-millis: 60000
    connect-timeout-millis: 60000

    ribbon

    ribbon:
    ReadTimeout: 10000
    ConnectTimeout: 10000
    MaxAutoRetries: 0
    MaxAutoRetriesNextServer: 1
    eureka:
    enabled: true

    hystrix

    hystrix:
    command:
    default:
    execution:
    timeout:
    enabled: true
    isolation:
    thread:
    timeoutInMilliseconds: 60000
    这里面ribbon和hystrix是同时生效的,哪个值小哪个生效,另一个就看不到效果了。
    我的例子是这样配置的
    我启动项目,访问test1,也就是sleep3秒那个时,会进入熔断超时,访问test2,sleep1秒时能正常返回,访问test3同样进入熔断。
    可以自行修改超时时间来测试一下。

  • 相关阅读:
    About “condition variables”
    路由表的读法(zz)
    C++字符串之一(字符表示)
    Audio Codec Summary
    关于telnet
    C++ 之 new
    (转)让ubuntu9.10开机自动挂载NTFS分区
    WorkSpace And Static Library In GarbageXcode4
    mac os x 10.7下配置svn服务器
    ubuntu下设置双显示器扩展桌面
  • 原文地址:https://www.cnblogs.com/maohuidong/p/9871516.html
Copyright © 2011-2022 走看看