@toc
解释:微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。(一个服务器的Tomcat资源耗尽,导致依赖的服务全部故障)
解决雪崩问题有四种办法如下:
Sentinel的对比,Hystrix已经不维护了。具体对比如下:
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于慢调用比例或异常比例 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持慢启动、匀速排队模式 | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
java -jar sentinel-dashboard-1.8.1.jar
,然后访问:localhost:8080 即可看到控制台页面,默认的账户和密码都是sentinel。startup.cmd -m standalone
启动nacos。接着打开实用篇的代码,将yaml文件的信息做出相应的修改,这是本人的,MySQL有5和8两个版本,由于前面是匹配虚拟机里的数据库,换回MySQL5,端口3305。还有将前面的nacos地址换回localhost,还需要修改order-service的端口号,不然与sentinel的控制台端口冲突。添加限流规则时,点击高级选项,可以选择三种流控模式:
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了。不管是线程隔离还是熔断降级,都是对客户端(调用方)的保护。
SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。
Feign整合Sentinel的步骤如下:
线程隔离有两种方式实现:
优点 | 缺点 | 场景 | |
---|---|---|---|
信号量隔离-Sentinel默认 | 轻量级,无额外开销 | 不支持主动超时 不支持异步调用 | 高频调用高扇出 |
线程池隔离 | 支持主动超时支持异步调用 | 线程的额外开销比较大 | 低扇出 |
熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
断路器熔断策略有三种:慢调用、异常比例、异常数。
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
获取请求来源的接口--RequestOriginParser
。
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler
接口。
异常 | 说明 |
---|---|
FlowException | 限流异常 |
ParamFlowException | 热点参数限流的异常 |
DegradeException | 降级异常 |
AuthorityException | 授权规则异常 |
SystemBlockException | 系统规则异常 |
Sentinel的控制台规则管理有三种模式:
推送模式 | 存储位置 | 优点 | 缺点 |
---|---|---|---|
原始模式 | 保存在内存 | 简单,无任何依赖 | 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境 |
Pull 模式 | 保存在本地文件或数据库,定时去读取 | 简单,无任何依赖;规则持久化 | 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。 |
Push 模式 | 保存在nacos,监听变更实时更新 | 规则持久化;一致性; | 引入第三方依赖 |
记录每一个学习瞬间
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。