Hystrix
在spring cloud系统中,随着业务量的增加,默认选用Hystrix作为系统的熔断降级方案。由于,系统中使用security jwt方式做权限认证,服务之间feign使用RequestTemplate在header中传递token。开启Hystrix后,由于默认的隔离机制是线程池,在调用下游服务时,会重新创建线程,RequestContextHolder通过ThreadLocal无法获取token。如何让token传递到下游服务呢?
- 可以使用hystrix信号量的机制进行服务的容错,该种方式超时控制会失效,如果下游服务超时或者崩溃,过多的请求访问都会阻塞,造成服务雪崩。一般都不推荐该种方式。
- 扩展Hystrix在创建新的线程时,把当前线程上下文存储的数据设置到新的线程。可以参考开启hystrix:feign.hystrix.enabled=true时, RequestContextHolder.getRequestAttributes()为空。
以上两种方式都感觉不是很完美,于是,决定使用Sentinel进行替换。
Sentinel
Sentinel也能实现服务的熔断和降级。能够对并发线程数和超时时间进行控制,在功能上实现Hystrix一致的效果。
Sentinel对于资源的熔断和降级操作是通过定义拦截器,采用责任链的模式实现。Sentinel 的核心骨架,将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot c

本文探讨了从Hystrix迁移到Sentinel的过程,分析了Hystrix在线程池隔离和信号量隔离机制下token传递的问题,并介绍了Sentinel在资源保护、限流和降级方面的优势。
最低0.47元/天 解锁文章
3653

被折叠的 条评论
为什么被折叠?



