微服务保护
0.思考面试题
微服务组件 alibaba-sentinel 介绍?
sentinel 为一个微服务保护技术,支持多种保护策略,丰富的应用场景以及实时的监控
sentinel中限流功能介绍? 支持的限流规则?
当请求进入微服务后,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,即簇点链路,在其中就可以进行限流设置
限流规则:
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
- 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
sentinel中线程隔离介绍?
当微服务发生故障的时候,限流无法进行处理,就需要使用**线程隔离**或者**熔断器**的方式将故障控制,避免形成雪崩
**线程隔离**就是:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,而避免把调用者的所有资源耗尽
sentinel中断路器功能介绍?
断路器(熔断器)也是一种控制雪崩的方式,其中使用了熔断降级的方法进行处理故障服务
**熔断降级**:思路是由**断路器**统计服务调用的异常比例、慢请求比例,如果超出阈值则会**熔断**该服务
Feign + Sentinel实现服务降级配置?
- 设置慢调用
- 给feign接口设置熔断规则
熔断规则:慢调用、异常比例、异常数
1.雪崩问题
微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。
但是一个服务业务一些原因,比如并发量过高,网络阻塞等原因造成服务不可用,其他依赖其的服务最终也会变得不可用,造成雪崩效应
1.1 解决方式
解决雪崩问题的常见方式有四种
- 仓壁模式(线程隔离)
可以限定每个业务能使用的线程数,避免耗尽整个服务端的资源,因此也叫线程隔离 - 超时处理
超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待 - 断路器(熔断器)
断路器模式:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求 - 限流
限制业务访问的QPS,避免服务因流量的突增而故障
处理方式区别:
限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。
超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种补救措施。
1.2 服务保护技术(Sentinel/Hystrix)
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于慢调用比例或异常比例 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持慢启动、匀速排队模式 | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
2.Sentinel使用
2.1 安装运行
- 在GitHub下载
将jar包放到任意非中文目录,执行命令
java -jar sentinel-dashboard-1.8.1.jar //端口运行 java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar //docker运行命令 docker run —name sentinel -d -p 8858:8858 bladex/sentinel-dashboard:1.8.0
服务引入依赖
- 修改配置文件
2.2 流量控制
簇点链路:当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。
流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
- 流控:流量控制
- 降级:降级熔断
- 热点:热点参数限流,是限流的一种
- 授权:请求的权限控制
2.2.1 控流模式(控流规则)
流控模式有哪些?
在添加限流规则时,点击高级选项,可以选择三种流控模式:
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
- 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
- 使用场景:如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争(一个优先级高,一个优先级低)
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
- 使用场景:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流
流控效果有哪些?
- 快速失败:QPS超过阈值时,拒绝新的请求
- warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
- 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝
2.3 隔离和降级
线程隔离:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。
线程隔离有两种方式实现:
- 线程池隔离
- 给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
- 信号量隔离(Sentinel默认采用)
- 不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。
熔断降级:是在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务的提供者了。
断路器控制熔断和放行是通过状态机来完成的
状态机包括三个状态:
- closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
- open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
- half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
- 请求成功:则切换到closed状态
- 请求失败:则切换到open状态
- 断路器熔断策略有三种:慢调用、异常比例、异常数
3.Jmeter使用
安装:
- Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量(JDK8)
- 可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgi
- 解压后运行bin目录下的jmeter.bat即可运行
基本使用:
- 在测试计划上点鼠标右键,选择添加 > 线程(用户) > 线程组:
- 在新增的线程组中,填写线程信息
- 给线程组点鼠标右键,添加http取样器
- 编写取样器内容
- 添加监听报告,添加监听结果树
- 查看结果