简单谈谈什么是Hystrix,以及SpringCloud的各种超时时间配
置效果,和简单谈谈。。。
1. 前⾔(以下的springcloud版本是Dalston.RC1)
以下的springcloud版本是Dalston.RC1
Springcloud框架中,超时时间的设置通常有三个层⾯:
zuul⽹关
1#默认1000
2zuul.host.socket-timeout-millis=2000
3#默认2000
t-timeout-millis=4000
ribbon
1ribbon:
2  OkToRetryOnAllOperations: false #对所有操作请求都进⾏重试,默认false
3  ReadTimeout: 5000  #负载均衡超时时间,默认值5000
4  ConnectTimeout: 3000 #ribbon请求连接的超时时间,默认值2000
5  MaxAutoRetries: 0    #对当前实例的重试次数,默认0
6  MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1
熔断器Hystrix
1hystrix:
2  command:
3    default:  #default全局有效,service id指定应⽤有效
4      execution:
5        timeout:
6          #如果enabled设置为false,则请求超时交给ribbon控制,为true,则超时作为熔断根据
7          enabled: true
8        isolation:
9          thread:
10            timeoutInMilliseconds: 1000 #断路器超时时间,默认1000ms
11
abled: true
2.测试各个配置的效果
这⾥我开了⼀个Eureka服务中⼼
开了两个个服务eureka-client,端⼝分别为8087和8088,进⾏负载均衡
开了⼀个服务eureka-feign8080去调⽤eureka-client的⽅法,模拟eureka-client处理时间过长的时候出现的情况
⽣产者eureka-client的⽅法:
1/**
2  * 测试重试时间
3  *
4  * @return
5  */
6  @RequestMapping("/timeOut")
7  public String timeOut(@RequestParam int mills) {
8    log.info("[client服务-{}] [timeOut⽅法]收到请求,阻塞{}ms", port, mills);
9    try {
10      Thread.sleep(mills);
11    } catch (InterruptedException e) {
12        e.printStackTrace();
13    }
14    log.info("[client服务-{}] [timeOut]返回请求",port);
15    return String.format("client服务-%s 请求ok", port);
16  }
消费者eureka-feign调⽤client的⽅法,通过传参数mills来控制client线程休眠的时间
1 /**
2    * 测试重试时间
3    * @return
4    */
5    @RequestMapping("/timeOut")
6    public String timeOut(@RequestParam int mills){
7        log.info("开始调⽤");
8        return feignService.timeOut( mills );
retry是什么意思9    }
eureka-feign的service:
1 /**
2    * 测试springcloud的超时机制
3    * @param mills
4    * @return
5    */
6    @RequestMapping(value = "/timeOut",method = RequestMethod.GET)
7    String timeOut(@RequestParam(value = "mills") int mills);
eureka-feign的熔断⽅法:
1 @Override
2    public String timeOut(int mills) {
3        System.out.println("熔断");
4        return "熔断了";
5    }
访问8080端⼝, 调⽤eureka-feign的/timeOut接⼝, 然后eureka-feign再调⽤client的服务。下⾯的配置是eureka-feign的测试1
测试 900ms
请求正常.
测试 2000ms
熔断
接着测试4000ms, 6000都熔断了
测试2
更换两个超时时间:
1
ribbon:2
OkToRetryOnAllOperations: false #对所有操作请求都进⾏重试,默认false 3
ReadTimeout: 1000  #负载均衡超时时间,默认值50004
ConnectTimeout: 3000 #ribbon 请求连接的超时时间,默认值20005
MaxAutoRetries: 0    #对当前实例的重试次数,默认06
MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认17
8
hystrix:9
command:10
default:  #default 全局有效,service id 指定应⽤有效11
execution:12
timeout:13
#如果enabled 设置为false ,则请求超时交给ribbon 控制,为true,则超时作为熔断根据14
enabled: true 15
isolation:16          thread:17            timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms
测试2000ms:
成功了
调⽤4000ms
熔断了
测试6000ms也是熔断
可见ReadTimeout和ConnectTimeout,当调⽤某个服务等待时间过长的时候, 对超时报错/熔断⽣效的是ReadTimeout,ConnectTimeout 则表⽰连接服务的时间,⼀般不⽤配置太久,1~2秒左右就可以了
测试3
现在来测试ReadTimeout和timeoutInMilliseconds谁起作⽤
测试2中的配置如下:
1
ReadTimeout: 3000  #负载均衡超时时间,默认值50002ConnectTimeout: 1000 #ribbon 请求连接的超时时间,默认值2000
1
ribbon:2
OkToRetryOnAllOperations: false #对所有操作请求都进⾏重试,默认false 3
ReadTimeout: 3000  #负载均衡超时时间,默认值50004
ConnectTimeout: 1000 #ribbon 请求连接的超时时间,默认值20005
MaxAutoRetries: 0    #对当前实例的重试次数,默认06  MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1
1
hystrix:2
command:3
default:  #default 全局有效,service id 指定应⽤有效4
execution:5
timeout:6
#如果enabled 设置为false ,则请求超时交给ribbon 控制,为true,则超时作为熔断根据7
enabled: true 8
isolation:9          thread:10            timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms
1
ReadTimeout: 3000  #负载均衡超时时间,默认值50002
ConnectTimeout: 1000 #ribbon 请求连接的超时时间,默认值20003 timeoutInMilliseconds: 5000 #断路器超时时间,默认1000ms
在4000ms熔断了,2000ms正常,说明是ReadTimeout⽣效, 现在换成:
1ReadTimeout: 5000  #负载均衡超时时间,默认值5000
2  ConnectTimeout: 1000 #ribbon请求连接的超时时间,默认值2000
3 timeoutInMilliseconds: 3000 #断路器超时时间,默认1000ms
也就是
1ribbon:
2  OkToRetryOnAllOperations: false #对所有操作请求都进⾏重试,默认false
3  ReadTimeout: 5000  #负载均衡超时时间,默认值5000
4  ConnectTimeout: 1000 #ribbon请求连接的超时时间,默认值2000
5  MaxAutoRetries: 0    #对当前实例的重试次数,默认0
6  MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1
7
8hystrix:
9  command:
10    default:  #default全局有效,service id指定应⽤有效
11      execution:
12        timeout:
13          #是否开启超时熔断
14          enabled: true
15        isolation:
16          thread:
17            timeoutInMilliseconds: 3000 #断路器超时时间,默认1000ms
18
abled: true
2000ms 正常
在这⾥插⼊图⽚描述
4000ms 熔断
在这⾥插⼊图⽚描述
说明熔断器timeoutInMilliseconds: 3000起作⽤了
测试4
这⾥再测⼀个配置:
这个enable如果为false, 则表⽰熔断器不根据⾃⼰配置的超时时间进⾏熔断,这样的话就会收到ribbon的ReadTimeout配置的影响了,超过这个时间,eureka-feign会抛出timeout的异常,这个时候熔断器就会因为这个异常⽽进⾏熔断
1hystrix:
2  command:
3    default:  #default全局有效,service id指定应⽤有效
4      execution:
5        timeout:
6          #是否开启超时熔断
7          enabled: false
测试4000ms 正常
在这⾥插⼊图⽚描述
测试6000ms 熔断. 此处是因为ribbon的ReadTimeout: 5000
在这⾥插⼊图⽚描述
3.总结
由上⾯的测试可以得出:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。