1、Sentinel简介

  Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来维护系统的稳定性

 

2、Sentinel基本概念

  • 资源

  资源是sentinel的关键概念,它可以是Java应用程序中的任何内容,例如由应用程序提供的服务,或由应用程序调用其他应用提供的服务,甚至可以是一段代码。

  • 规则

  围绕资源的实时状态设定的规则,可以包括流量控制规则,熔断降级规则,以及系统保护规则,所有规则都可以动态实时调整。

  • 流量控制

  流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。

  流量控制有内下几个角度:

    1。 资源的调用关系,例如资源的调用链路、资源和资源之间的关系
2。 运行指标,例如QPS、线程池、系统负载等
3。 控制的效果,例如直接限流、冷启动、排队

  • 熔断降级

  Sentinel 和 Hystrix 的原则一致,当调用链路中某个资源出现不稳定,例如timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其他资源。

在限制的手段上,Sentinel和Hystrix采取了完全不一样的方法:

  • Hystrix通过线程池的方式,来对依赖(对应Sentinel中的资源)进行隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。

  • Sentinel有两种方式
    1。通过并发线程数进行限制
    Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其他资源的影响。这样不但没有线程切换的损耗,也不需要预先分配线程池大小。当某个资源出现不稳定的情况下,例如相应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接受请求。
    2。通过响应时间对资源进行降级
    除了对并发线程数进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对资源的访问都会被直接拒绝,直接过了指定的时间之后才重新恢复。

  • 系统负载保护

  Sentinel同时对系统的维度提供保护,防止雪崩。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其他机器上去。如果这个时候其它机器也处于一个边缘状态,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

 

3、集成Springboot/SpringCloud

  • 启动Sentinel

    1. 官网下载控制台jar包(https://github.com/alibaba/Sentinel/releases/tag/v1.8.0)

     

    1. 启动jar包

    java -jar sentinel-dashboard-1.8.0.jar
    

     

    1. 指定参数启动

    java -Dserver.port=9000 -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
    
    #或者
    
    java -jar sentinel-dashboard-1.8.0.jar --server.port=9000
    

     

    1. 浏览器访问

    http://localhost:9000
    

      默认账号密码都是 sentinel

    login.jpg

    dashboard.jpg

 

  • SpringCloud微服务接入

  1. 添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

 

  1. yml配置

spring:
  cloud:
    sentinel:
      transport:
        # Sentinel 控制台地址
        dashboard: localhost:9000
        # 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
      #  client-ip:
      # 取消Sentinel控制台懒加载
      # 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
      # 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
      eager: true
      filter:
        # 配置启用拦截器
        enabled: true
        # 配置拦截器路径
        url-patterns: /**

 

  1. 启动服务

  服务启动成功之后,刷新sentinel控制台,即可在控制台中看到对应服务

服务接入.jpg

  1. 配置限流规则

测试接口:/system/user/page

  未限流之前可以一直点击请求

user_page_1.gif

新建规则

  现在限制每秒QPS为1(每秒钟只能请求一次)

设置规则.gif

再次请求

  可以看到请求频率每秒超过一次时会直接显示失败(此时请求并未到达服务接口)

 

  • Gateway接入

  1. 添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

 

  1. 修改yml配置文件(同上)

spring:
  cloud:
    sentinel:
      transport:
        # Sentinel 控制台地址
        dashboard: localhost:9000
        # 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
      #  client-ip:
      # 取消Sentinel控制台懒加载
      # 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
      # 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
      eager: true
      filter:
        # 配置启用拦截器
        enabled: true
        # 配置拦截器路径
        url-patterns: /**

 

  1. 启动网关

  启动成功后刷新Sentinel控制台可以看到网关接入成功

gateway接入.png

  1. 根据网关配置的routeId配置限流规则

  网关接入与普通微服务接入的区别在于:可以根据网关服务里配置的routeId来配置限流规则

例如:zboot-system这个服务在网关中配置的routeId就是zboot-system,所以这里可以这样配置:

路由id配置规则.jpg

  这样是对zboot-system整个服务的资源进行限流保护。

 

  • 集成Nacos完成持久化配置

一旦我们重启应用,sentinel规则消失,所以需要将配置规则进行持久化

  1. 添加依赖

 <!-- Sentinel Datasource Nacos -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

 

  1. 修改yml配置文件

spring:
  cloud:
    sentinel:
      transport:
        # Sentinel 控制台地址
        dashboard: localhost:9000
        # 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
      #  client-ip:
      # 取消Sentinel控制台懒加载
      # 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
      # 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
      eager: true
      filter:
        # 配置启用拦截器
        enabled: true
        # 配置拦截器路径
        url-patterns: /**
        
      # nacos配置持久化
      datasource:
        ds1: #这个名字是自定义的随便写
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr} # nacos地址
            dataId: system-sentinel.json #nacos中的dataId
            groupId: SENTINEL_CONFIG #nacos中的groupId
            data-type: json #文件类型
            rule-type: flow

 

  1. nacos中添加配置文件

  根据yml中配置的 dataId与groupId 创建对应的配置文件

nacos配置.jpg

  配置内容:

[
    {
      "resource": "/system/user/page",
      "count": 1,
      "grade": 1,
      "limitApp": "default",
      "strategy": 0,
      "controlBehavior": 0
    }
]

  配置规则详解:

  • resource:资源名称
  • limitApp:来源应用
  • grade:阀值类型,0:线程数,1:QPS
  • count:单机阀值
  • strategy:流控模式,0:直接,1:关联,2:链路
  • controlBehavior:流控效果,0:快速失败,1:warmUp,2:排队等待
  • clusterMode:是否集群 true/false

 

  1. 重启服务

  nacos配置成功后,重启system服务,可以直接在sentinel控制台看到与nacos中配置对应的流控规则

  1. 动态更新

  只要在nacos中修改配置,对应的流控规则就会同步更新
动态更新.gif