微服务保护

0.思考面试题

微服务组件 alibaba-sentinel 介绍?

  1. sentinel 为一个微服务保护技术,支持多种保护策略,丰富的应用场景以及实时的监控

sentinel中限流功能介绍? 支持的限流规则?

  1. 当请求进入微服务后,首先会访问DispatcherServlet,然后进入ControllerServiceMapper,即簇点链路,在其中就可以进行限流设置
  2. 限流规则:
  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

sentinel中线程隔离介绍?

  1. 当微服务发生故障的时候,限流无法进行处理,就需要使用**线程隔离**或者**熔断器**的方式将故障控制,避免形成雪崩
  2. **线程隔离**就是:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,而避免把调用者的所有资源耗尽

sentinel中断路器功能介绍?

  1. 断路器(熔断器)也是一种控制雪崩的方式,其中使用了熔断降级的方法进行处理故障服务
  2. **熔断降级**:思路是由**断路器**统计服务调用的异常比例、慢请求比例,如果超出阈值则会**熔断**该服务

Feign + Sentinel实现服务降级配置?

  1. 设置慢调用
  2. 给feign接口设置熔断规则
    熔断规则:慢调用、异常比例、异常数

1.雪崩问题

微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。

但是一个服务业务一些原因,比如并发量过高,网络阻塞等原因造成服务不可用,其他依赖其的服务最终也会变得不可用,造成雪崩效应

微服务保护 - 图1

1.1 解决方式

解决雪崩问题的常见方式有四种

  1. 仓壁模式(线程隔离)
    可以限定每个业务能使用的线程数,避免耗尽整个服务端的资源,因此也叫线程隔离
  2. 超时处理
    超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
  3. 断路器(熔断器)
    断路器模式:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
  4. 限流
    限制业务访问的QPS,避免服务因流量的突增而故障

处理方式区别:

限流是对服务的保护,避免因瞬间高并发流量而导致服务故障,进而避免雪崩。是一种预防措施。

超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在一定范围,避免雪崩。是一种补救措施。

1.2 服务保护技术(Sentinel/Hystrix)

Sentinel Hystrix
隔离策略 信号量隔离 线程池隔离/信号量隔离
熔断降级策略 基于慢调用比例或异常比例 基于失败比率
实时指标实现 滑动窗口 滑动窗口(基于 RxJava)
规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 有限的支持
流量整形 支持慢启动、匀速排队模式 不支持
系统自适应保护 支持 不支持
控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善
常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC 等 Servlet、Spring Cloud Netflix

2.Sentinel使用

2.1 安装运行

  1. GitHub下载
  2. 将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

  3. 服务引入依赖

  4. 修改配置文件

2.2 流量控制

簇点链路:当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源

流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:

  • 流控:流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制

2.2.1 控流模式(控流规则)

流控模式有哪些?

在添加限流规则时,点击高级选项,可以选择三种流控模式

  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
    • 使用场景:如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争(一个优先级高,一个优先级低)
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
    • 使用场景:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流

流控效果有哪些?

  • 快速失败:QPS超过阈值时,拒绝新的请求
  • warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
  • 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝

2.3 隔离和降级

线程隔离:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽。

线程隔离有两种方式实现:

  • 线程池隔离
    • 给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
  • 信号量隔离(Sentinel默认采用)
    • 不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。

微服务保护 - 图2

熔断降级:是在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务的提供者了。

断路器控制熔断和放行是通过状态机来完成的

状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
    • 请求成功:则切换到closed状态
    • 请求失败:则切换到open状态
  • 断路器熔断策略有三种:慢调用、异常比例、异常数

微服务保护 - 图3

3.Jmeter使用

安装:

  1. Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量(JDK8)
  2. 可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgi
  3. 解压后运行bin目录下的jmeter.bat即可运行

基本使用:

  1. 在测试计划上点鼠标右键,选择添加 > 线程(用户) > 线程组:
  2. 在新增的线程组中,填写线程信息
  3. 给线程组点鼠标右键,添加http取样器
  4. 编写取样器内容
  5. 添加监听报告,添加监听结果树
  6. 查看结果