文档章节

用网关zuul时,熔断hytrix里面的坑

爱吃大肉包
 爱吃大肉包
发布于 09/25 20:08
字数 923
阅读 352
收藏 8

1,zuul 默认的隔离级别是信号量,默认最大隔离信号量是100

信号量隔离和线程池隔离的区别如下:

https://my.oschina.net/u/867417/blog/2120713 

默认设置:

 

 

2,zuul里隔离是按服务隔离的,也就是1个服务1个信号量,非接口级别的

所以得注意zuul服务本身的线程池大小,后端服务的线程池大小,以及隔离信号量或线程池的线程池大小,防止1个线程被占用光

 

3,在zuul里,重新封装了hytrix的一些配置名称,导致hytrix的一些原生配置会失效

具体设置hytrix参数的setter如下:

需要通过zuulProperties重新设置的属性如下:

  • 隔离级别指定:zuul.ribbonIsolationStrategy: SEMAPHORE
  • 信号隔离的默认隔离大小:semaphore.maxSemaphores = 20
  • 指定服务的信号隔离级别大小:zuul.eureka.serviceId.semaphore.maxSemaphores = 20

而原生的hytrix.command.default.execution.isolation.strategy和maxConcurrentRequests的配置将失效,会被这3个覆盖

 

4,如果用的是信号量隔离级别,那么hytrix的超时将会失效

当使用线程池隔离时,因为多了一层线程池,而且是用的RXJava实现,故可以直接支持hytrix的超时调用

如果使用的是信号量隔离,那么hytrix的超时将会失效,但是ribbon或者socket本身的超时机制依然是有效果的,而且超时后会释放掉信号

 

5,但如果是信号量隔离,依然得注意hytrix设置的超时时间,因为它涉及到信号量的释放

先看看hytrix信号量的实现:

信号量的设置在AbstractCommand里:

 

用了个ConcurrentHashMap<String, TryableSemaphore> 去保存个计数器的设置,key对应的是commandKey, TryableSemaphore(TryableSemaphoreActual)对应计数器实现,用java的AtomicInter实现,tryAcquire()时,进行原子加incrementAndGet,如果大于设置的maxConcurrentRequests,则进行阻塞

 

返回fallBack;

执行完后,释放也很简单。原子减去,decrementAndGet。这样看来,信号量就是一个计数器。

那么为什么说和超时有关呢,因为超时时,即使访问线程还在阻塞,也会把当前信号量释放。(怎么做的,因为hytrix超时(此时访问线程并未超时)的后续处理部分是由RxJava控制,不是依靠访问线程的超时)

这句会造成,如果你配置了超时1s,如:

hystrix.command.default.execution.timeout.enabled=true

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000

那么你的信号量生效将是1s内,也就是说,过了1s,不管你socket是否超时,hytrix都会释放掉信号量

 

6,在zuul里,线程池隔离情况下,是异步访问的,而不是异步

这一点在上篇有说到,

调用的是hytrix command的excute方法,hytrix的官网原文说明如下:

  • execute() — blocks, then returns the single response received from the dependency (or throws an exception in case of an error)

execute是一个阻塞方法,也就是说,如果不合理的设置线程池的大小,和超时时间,还是有可能把zuul的线程消耗完。从而失去对服务的保护作用

 

总结:

zuul的复杂度很大程度因为集成了hytrix, ribbon,导致设置超时,线程,隔离都有一定的复杂度,本身文档确没那么清楚。

很多地方还是需要debug分析源码才能避免踩坑。

 

 

公众号:

何锦彬 2018.09.25

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
爱吃大肉包
粉丝 60
博文 34
码字总数 30702
作品 0
广州
程序员
Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异

hytrix支持线程池隔离和信号量隔离 信号量隔离适应非网络请求,因为是同步的请求,无法支持超时,只能依靠协议本身 线程池隔离,即,每个实例都增加个线程池进行隔离 先给个总结对比: 隔离方...

爱吃大肉包
09/21
0
0
hehui/ SpringCloudTutorial

SpringCloud 教程 一、简介 二、各微服务占用端口列表 章 微服务模块名称 端口 功能描述 001 springms-simple-provider-user 8000 简单用户微服务 002 springms-simple-consumer-movie 8005 ...

hehui
05/02
0
0
spring-cloud 服务网关中的 Timeout 设置

(点击上方公众号,可快速关注) 来源:大名Dean鼎, www.deanwangpro.com/2018/04/13/zuul-hytrix-ribbon-timeout/ 大家在初次使用spring-cloud的gateway的时候,肯定会被里面各种的Timeout...

ImportNew
04/25
0
0
Spring Cloud Zuul(路由网关)

Zuul作为微服务系统的网关组件,是从设备和网站到Netflix流应用程序后端的所有请求的前门。作为边缘服务应用程序,Zuul旨在实现动态路由,监控,弹性和安全性。 官方原话: github地址:http...

ben4
08/28
0
0
第九章:路由网关(Zuul)的使用  

第九章:路由网关(Zuul)的使用 前言 介绍完分布式配置中心,结合前面的文章。我们已经有了一个微服务的框架了,可以对外提供api接口服务了。但现在试想一下,在微服务框架中,每个对外服务都...

DemonsI
10/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20181018 上课截图

![](https://oscimg.oschina.net/oscnet/49f66c08ab8c59a21a3b98889d961672f30.jpg) ![](https://oscimg.oschina.net/oscnet/a61bc2d618b403650dbd4bf68a671fabecb.jpg)......

小丑鱼00
今天
1
0
WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
16
2
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部