sentinel 流量卫兵

91 阅读12分钟

sentinel 流量卫兵

demo

gitee.com/w--kk/senti…

sentinel 哨兵

  1. Sentinel
    作用: alibaba 开源用来对现有微服务系统进行保护 ===> 替换Hystrix
    Hystrix 豪猪 用来保护微服务系统主要用来解决服务雪崩 ===> 服务熔断
    Sentinel 组件 用来解决服务雪崩 ===> 服务熔断机制 (服务降级)、服务流控 等...
    作用: Sentinel以 “流量” 为突破口,致力于流量控制、断路、负载保护等多个领域,保障服务可靠性。

  2. Sentinel 简介Sentinel 历史

  • 2012年,Sentinel诞生,主要功能为入口流量控制。
  • 2013-2017 年Sentinel 在阿里巴巴团内迅发展,成为基技术块,盖了所有的核心场景。Sentinel 也因此积累了大盘的流量归整场景以及生产实践。
  • 2018年,Sentinel开源,并持续演进。
  • 2019年,Sentinel 朝多语言扩展的方向不断,推出 C++ 原生版本,同时针对 Sevice Mesh 场景推出了 Enroy 集流量制支持,以解决 Service Mesh 架构下多语言限流的问题。
  • 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
  1. Sentinel 概念
    资源: java中一切皆资源,服务/demo
    资源: 是一个微服务访问路径 rest接口
    规则 Rule : 流量规则 熔断 负载规则 ...

资源是 Sentinel的关键概念。它可以是Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

  1. Sentinel使用
    Sentinel开源组件:
    Sentinel (项目中实现 流控制 断 降级) -----> Hystrix
    Sentinel dashBoard (哨兵仪表盘组件) -----> Hystrix DashBoard image.png dashBoard 解耦,想要规则生效就配置,不想要规则生效删了就行

  2. Sentinel 实现原理
    要保护哪个微服务不雪崩,就在哪个微服务中引用Sentinel组件 image.png

什么是sentinel

image.png

As microservices become popular, the stability of service calls is becoming increasingly important. Sentinel takes "flow" as the breakthrough point, and works on multiple fields including flow control, circuit breaking and load protection to protect service reliability. ---[摘自官网]

  1. 说明
  • spring-cloud-alibaba-group.github.io/github-page…
  • github.com/alibaba/Sen…
  • 翻译:随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为突破口,在流量控制、断路、负载保护等多个领域进行工作,保障服务可靠性。
  • 通俗: 用来在微服务系统中保护微服务对的作用 如何 服务雪崩 服务熔断 服务降级 就是用来替换hystrix
  1. 特性
  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 image.png

sentinel使用

sentinel提供了两个服务组件:

  • 一个是 sentinel 用来实现微服务系统中服务熔断、降级等功能。这点和hystrix 类似
  • 一个是 sentinel dashboard 用来监控微服务系统中流量调用等情况 流控 熔断 降级 配置。 这点和hystrix dashboard类似

sentinel dashboard的安装

注意: dashboard信息必须在指定服务进行资源调用之后才能进行初始化

  1. 下载 dashboard
    github自行下载
  1. 运行 sentinel-dashboard-1.7.2.jar
    直接启动springboot 应用jar包
    java -jar sentinel-dashboard-1.7.2.jar
    要求:必须安装jdk并配置环境变量 jdk8.0+
    注意: 默认端口是8080
    将sentinel-dashboard上传到linux image.png 指定端口启动:java -jar -Dserver.port=9191 sentinel-dashboard-1.8.7.jar image.png
  1. 访问dashborad管理界面 (记得关闭防火墙)
    http://192.168.175.128:9191
    登录:用户名&密码: sentinel image.png

sentinel 组件保护微服务

启动nacos(单机版)
./nacos/bin/startup.sh -m standalone
查看日志:tail -f nacos/logs/nacos.log

image.png

  1. 开发微服务  创建独立springboot应用
  2. 添加rest接口  作为sentinel资源
  3. 在微服务中引入sentinel组件
<dependencies>
   <!--web-->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   
   <!--nacos client-->
   <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos->discovery</artifactId>
   </dependency>
   
   <!--引入sentinel依赖-->
   <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
   </dependency>

</dependencies>

配置项目中配置文件链接到 sentinel dashboard

# 开启sentinel保护
spring.cloud.sentinel.enabled=true
# 指定sentinel dashboard web地址
spring.cloud.sentinel.transport.dashboard=192.168.175.128:9191
# 与dashboard通信的端口,默认是8719
spring.cloud.sentinel.transport.port=8719
  1. 直接启动微服务
  2. 查看dashboard
    注意:dashboard信息必须在指定服务进行资源调用之后才能进行
    访问dashboard界面查看服务监控
  • 发现界面什么都没有?
  • 默认情况下sentiel为延迟加载,不会在启动之后立即创建服务监控,需要对服务进行调用时才会初始化

关于系统吞吐量相关观念

image.png

  1. QPS
    Query-Per-Second: QPS  称之为系统每秒的请求数
    5/s, 如果QPS为5说明1s来5个请求
  2. RT Response Time: RT  每个请求响应时间  单位毫秒级

sentinel中对系统保护规则(五大规则)

  • 流控规则   流量控制 (flow control)

定义: 其原理是监控应用流量的 QPS并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性

  • 降级规则   熔断降级 (Degrade Service)

定义: 其原理是监控应用中资源调用请求, 达到指定值时自动触发熔断降级

  • 热点规则   热点参数 (ParamFlow)

热点: 何为热点? 热点即经常访问的数据
定义: 其原理很多时候我们希望统计某个热点数据中访问频次最高的 Top k 数据,并对其访问进行限制

  • 系统规则   系统规则 (SystemFlow)

定义: 其原理Sentinel 系统自适应限流从整体维度对应用入口流量进行控制

  • 授权规则黑白名单控制规则

很名时候,定义我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制 (黑白名单控制)的功能。
来源访问控制根据资源的请求来源 (origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过; 若配置黑名单则请求来源位于黑名单时不通过, 其余的请求通过。

sentinel 流量控制

image.png

0. 说明

  • 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
  • 同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
  • 一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
    resource:资源名,即限流规则的作用对象
    count: 限流阈值
    grade: 限流阈值类型(QPS 或并发线程数)
    limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
    strategy: 调用关系限流策略 ( 直接 关联 链路 ) controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

1. sentinel 流控规则

流控,流量控制,FlowController

定义: 其原理是监控应用流量的 QPS并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性

  • QPS(处理请求数):每秒的请求数  当每秒请求数超过指定阈值之后对当前请求进行限流
  • 并发线程数:当服务器中创建线程数超过指定阈值之后对当前请求进行限流
    image.png
    线程处理很快,手动刷新不好看到流控效果 image.png

QPS限流

Query-Per-Second: QPS 称之为系统每秒的请求数
RT: response time 每个请求响应时间 单位毫秒级

  1. 配置QPS流量控制 image.png image.png
  • 流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS
  • 更多细节参见官网:github.com/alibaba/Sen…
  1. 测试
  • 每秒只能最大接收1个请求,超过1个报错 image.png image.png 如下图:一个节点每秒最多处理2个请求,超过的就直接拒绝 image.png 频繁刷新,1秒钟超过2个请求报错
    image.png

压力测试(Jmeter)

线程处理很快,手动刷新无法看到流控效果,测试线程需要用到压力测试工具

启动jmeter工具
image.png

选择语言 image.png

image.png

添加线程
image.png

image.png

配置http,希望这2个线程同一时刻都向/demo发请求 image.png

查看结果
image.png

启动 image.png

高级选项

  1. 流控模式 image.png
  • 直接 :当配置资源在运行过程超过当前规则配置的阈值之后对该资源请求做的处理是什么

  • 关联模式 :当配置资源在运行过程中超过当前规则配置的阈值之后对他所关联资源进行请求做什么样的处理
    如果同一时刻每秒对于/aa的请求超过2个之后,此时对于demo的请求访问是失败的,反向关联 image.png

  • 链路模式(问题):当配置资源在运行过程超过当前规则配置的阈值之后对他链路中资源请求做什么的处理
    如果同一时刻每秒对于/demo的请求数超过2个之后,此时对于demo所对应的/product的整条链路的调用将是失败的
    image.png image.png

  1. 流控效果  只适用于QPS限流 image.png 为什么流控效果只适用于QPS?
    因为基于线程的限流无论来多少个请求服务器都要处理 image.png
  • 快速失败: 直接拒绝请求,并抛出相应异常
  • Warm Up: (冷启动 预热

如果在cpu非常闲的过程中如果突然涌来大规模并发,可能会瞬间把系统拉进繁忙的状态。系统由一个空闲状态立即到繁忙状态,可能会让操作系统自顾不暇。在一定时间段内,处理的请求数慢慢增加。
如果QPS的阈值是10/s,即每秒处理10个请求,超过10个,剩下的要排队等。预热时间是20s image.png 1秒发送15个请求 image.png 第6s处理5个请求,第7s处理6个请求... image.png

  • 排队等待: (始终匀速通过)
    如果剩下的请求没有在5000毫秒(5s)内处理完,则报错。 image.png

2. 降级规则 ,熔断降级 (Degrade Service)

定义: 其原理是监控应用中资源调用请求, 达到指定值时自动触发熔断降级

image.png

熔断降级

熔断: 用来避免微服务架构中雪崩现象
原理: 当监控到调用链路中某一个服务, 出现异常 (20个以上异常) 自动触发熔断, 在触发之后对于该服务调用不可用
熔断: 达到某个阈值条件之后自动触发熔断

Sentinel提供熔断策略

image.png

  1. RT  根据请求响应时间去熔断 image.png
  2. 异常比例  根据请求调用过程中出现异常百分比进行熔断
    1s内进入5个请求,只要有请求10%的请求数出现异常就熔断,熔断时间为30s image.png image.png
  3. 异常数  根据请求调用过程中异常数进行熔断
    出现1个异常请求立马熔断 image.png

3. 热点规则,热点参数 (ParamFlow)

热点

定义:经常访问的数据称之为热点
热点限流 也称之为热点参数限流,日后访问资源中携带了指定参数进行限流
对demo资源的访问,1s内超过了请求数1,并且携带了0号参数,就会进行流控。如果没有携带0号参数就没问题。 image.png

如何使用

注意:使用热点参数限流时,不能使用资源路径,必须使用资源别名

sentinel提供资源别名注解 @SentinelResource(value="别名")

image.png image.png 新增热点规则
image.png 报错
image.png

异常处理

image.png

  • blockHandler 使用sentinel进行不同规则控制时的默认处理方案 image.png 测试
    image.png 当前请求过于火爆,您已被热点参数限流!!!
    image.png 添加流控规则
    image.png 当前请求过于火爆,您已被流控!!! image.png 添加降级规则
    image.png 当前请求过于火爆,您已被降级!!! image.png

  • fallback: 自定义业务出错时默认处理方案 image.png
    只是业务异常,还没有触发流控,降级
    image.png

  • defaultFallback 指定一个业务错误时默认方案 image.png

如果传的参数带了id,如果id不是12,则每秒内同时来10个请求才触发限流。 如果id是12,每秒内超过一个请求就限流。

image.png

4. 系统规则,系统规则 (SystemFlow)

定义: 其原理Sentinel 系统自适应限流从整体维度对应用入口流量进行控制

5. 授权规则  黑白名单控制规则

很名时候,定义我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制 (黑白名单控制)的功能。
来源访问控制根据资源的请求来源 (origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过; 若配置黑名单则请求来源位于黑名单时不通过, 其余的请求通过。

引用 编程不良人