用网关zuul时,熔断hytrix里面的坑
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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
记一次Controller改造,及SpringMVC处理流程
概述 由于工作需要,需实现这样一个功能的controller框架: 1,Restful API 2,请求参数校验(请求中需要携带指定的参数,才能进入控制器方法。一次请求会携带一些基本信息,以及请求数据,此处校验的是请求数据的携带情况) 3,请求格式校验(请求格式需要符合规定,才能进入控制器方法。此处校验的是基本信息的携带情况) 4,数据绑定(通过@RequestBody注解能直接绑定请求数据到POJO中。此POJO有一些字段,用以存储请求的基本信息,以及一个Map,用以存储请求数据) 5,请求数据的解密和返回数据的加密 探索之旅 第一思路 开始我对spring mvc的请求流程不太熟悉,我构思,先经过HttpMessageConverter,再经过Intercepter。 由前者解析请求数据,转换为我们自定义的POJO,并且解密请求数据。后者做格式校验,参数校验。很完美。 但实际情况是,Intercepter在HttpMessageConverter之前执行。更具体地说,spring mvc的拦截器是在转换器外层的,也就是请求进来的时候,先进拦截器,再进转换器;返回的时候,先进转换器,...
- 下一篇
小游戏入门到精通OR放弃?
这里说的小游戏是QQ玩一玩,后面会写微信小游戏... 0、体验QQ轻游戏 需要使用Android手机 登录手Q开启厘米秀 侧滑点击人物形象或者选择任意一好友点击**「+」滑拔一下找到「厘米秀」** 搜索厘米秀 申请体验资格 开启厘米秀 侧滑 好友点「+」或者直接点击人物 游戏入口页 1、平台申请账号 注册很简单,使用已有Q号登录「厘米游戏」开放平台按照流程提交资料审核即可 。开发者接入官方说明文档 「厘米游戏」 开放平台注册提交资料的同时会注册一个相关联的**「QQ服务号」**。游戏中显示的用户信息是通过后台静默授权「QQ服务号」后再通过用户相关的接口获得,这点与微信公众号以及微信小游戏类似。 一句话概括:目前暂未对个人开放,现阶段为邀请码模式。但如果你有好的IP资源或者优秀开发团队是比较好申请的。 与 「微信小游戏」 做比较目前来看最大的优势就是 现阶段游戏中集成广告所得广告费用平台不分成 游戏评级高官方可以让游戏上中心化首页推荐位 上线游戏都需要 「游戏自审自查报告」、「计算机软件著作权登记证书」,如需内购需要提供 「广电总局版号批文」 以及 「文化部备案信息」 2、环境搭建 QQ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 2048小游戏-低调大师作品