Sentinel 是面向分布式服务架构的高可用流量防护组件,次要以流量为切入点,从限流、流量整形、熔断降级、零碎负载爱护、热点防护等多个维度来帮忙开发者保障微服务的稳定性。
Sentinel 具备以下个性:

  • 丰盛的利用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的外围场景,例如秒杀(即突发流量管制在零碎容量能够接受的范畴)、音讯削峰填谷、集群流量管制、实时熔断上游不可用利用等。
  • 齐备的实时监控:Sentinel 同时提供实时的监控性能。您能够在控制台中看到接入利用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行状况。
  • 宽泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只须要引入相应的依赖并进行简略的配置即可疾速地接入 Sentinel。
  • 欠缺的 SPI 扩大点:Sentinel 提供简略易用、欠缺的 SPI 扩大接口。您能够通过实现扩大接口来疾速地定制逻辑。例如定制规定治理、适配动静数据源等。
    1、在gitegg-platform-cloud中引入依赖

          <!-- Sentinel 高可用流量防护组件 -->      <dependency>          <groupId>com.alibaba.cloud</groupId>          <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>      </dependency>

    2、在gitegg-platform-cloud的application.yml文件中退出裸露/actuator/sentinel端点的配置

    management:endpoints:  web:    exposure:      include: '*'

    3、GitEgg-Platform从新install,GitEgg-Cloud更新导入的依赖,启动gitegg-service-system服务,在浏览器中关上http://127.0.0.1:8001/actuato...地址,能够看到返回的Json信息,阐明我的项目曾经整合好了Sentinel。

    {  "blockPage": null,  "appName": "gitegg-service-system",  "consoleServer": [],  "coldFactor": "3",  "rules": {      "systemRules": [],      "authorityRule": [],      "paramFlowRule": [],      "flowRules": [],      "degradeRules": []  },  "metricsFileCharset": "UTF-8",  "filter": {      "order": -2147483648,      "urlPatterns": [          "/**"      ],      "enabled": true  },  "totalMetricsFileCount": 6,  "datasource": {},  "clientIp": "172.16.10.3",  "clientPort": "8719",  "logUsePid": false,  "metricsFileSize": 52428800,  "logDir": "",  "heartbeatIntervalMs": 10000}

    4、在配置文件中增加Sentinel服务地址,默认状况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。也能够配置sentinel.eager=true ,勾销Sentinel控制台懒加载。

    spring:  cloud:      sentinel:      filter:          enabled: true      transport:          port: 8719          #指定sentinel控制台的地址          dashboard: 127.0.0.1:8086      eager: true

    5、SystemController.java中增加限流的测试方法

      @ApiOperation(value = "限流测试")  @GetMapping(value = "sentinel/protected")  public Result<String> sentinelProtected() {      return Result.data("拜访的是限流测试接口");  }

    6、启动服务,通过浏览器拜访刚刚新增的测试接口地址,http://127.0.0.1:8011/system/...,刷新几次,而后关上Sentinel控制台地址,能够看到以后服务的拜访状况

    7、以上是没有对接口进行限流的状况,当初咱们设置规定,对接口进行限流,关上Sentinel控制台,点击左侧限流规定菜单,而后点击右上角“新增流控规定”按钮,在弹出的输入框中,资源名输出须要限流的接口,咱们这里设置为:/system/sentinel/protected,阈值类型:QPS, 单机阈值:20,确定增加。

    8、为了测试并发申请,咱们这里借助压力测试工具Jmeter,具体应用办法https://jmeter.apache.org/,下载好Jmeter之后,点击新建->测试计划->线程组->HTTP申请-查看后果树。咱们限流设置的单机阈值为20,咱们这里线程组先设置为20,查看申请是否会被限流,而后再将线程组设置为100查看是否被限流。





    从以上测试后果能够看到当设置为100时,呈现拜访失败,返回Blocked by Sentinel (flow limiting),阐明限流已失效。
    9、Sentinel同时也反对热点参数限流和零碎自适应限流,这里只须要在Sentinel控制台配置即可,所以这里不介绍具体操作及代码:
    热点参数限流:何为热点?热点即常常拜访的数据。很多时候咱们心愿统计某个热点数据中拜访频次最高的 Top K 数据,并对其拜访进行限度。比方:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限度
  • 用户 ID 为参数,针对一段时间内频繁拜访的用户 ID 进行限度
    热点参数限流会统计传入参数中的热点参数,并依据配置的限流阈值与模式,对蕴含热点参数的资源调用进行限流。热点参数限流能够看做是一种非凡的流量管制,仅对蕴含热点参数的资源调用失效。
    Sentinel 利用 LRU 策略统计最近最常拜访的热点参数,联合令牌桶算法来进行参数级别的流控。热点参数限流反对集群模式,具体使用指南:https://github.com/alibaba/Se...

零碎自适应限流:Sentinel 零碎自适应限流从整体维度对利用入口流量进行管制,联合利用的 Load、CPU 使用率、总体均匀 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让零碎的入口流量和零碎的负载达到一个均衡,让零碎尽可能跑在最大吞吐量的同时保证系统整体的稳定性。,具体使用指南:https://github.com/alibaba/Se...

本文源码在https://gitee.com/wmz1930/GitEgg 的chapter-14分支。