Sentinel原理以及配置总结

Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

Sentinel-features-overview

Sentinel和Hystrix对比的差异

Sentinel原理以及配置总结_第1张图片

Sentinel 功能主要体现在三个方面

 流量控制

    对于系统来说,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。

控制角度如下:

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

熔断降级

        当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。手段如下

  • 通过并发线程数进行限制 :当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
  • 通过响应时间对资源进行降级:当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

系统负载保护  

          Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果 这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。 针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

解决办法体现在2方面

服务降级

当流量达到一定的极限(后台可以配置阈值),请求的数量超出了设置的阈值,开启自我的保护,直接调用我们的服务降级的方法给一个友好的提示。

或者当服务错误率达到一定的比例,开启自我保护,直接调用服务降级的方法,给一个友好的提示。

Sentinel提供了多种配置方案(流量控制、线程数隔离、慢调用降级、速率控制、集群限流、异常熔断、调用关系限流、来源访问控制、、)

服务隔离

对于特定的服务(秒杀、特价、抢购、抢票、、、、高并发的服务),我们服务的隔离机制分为信号量和线程池隔离模式

服务的线程池隔离机制:每个服务接口都有自己独立的线程池,互不影响,缺点就是占用cpu资源非常大。

服务的信号量隔离机制:最多只有一定的阈值线程数处理我们的请求,超过该阈值会拒绝请求。

为什么选用Sentinel来做服务保护?

1.丰富的应用场景:前哨兵承接了阿里巴巴近10年的双十一大促流的核心场景,例如秒杀(即突然流量控制在系统容量可以承受的范围),消息削峰填谷,传递流量控制,实时熔断下游不可用应用等。

2.完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接收应用的单台机器秒级数据,甚至500台以下规模的整合的汇总运行情况。

广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的集成模块,例如与Spring Cloud,Dubbo,gRPC的整合。您只需要另外的依赖并进行简单的配置即可快速地接入Sentinel。

3.完善的SPI扩展点:Sentinel提供简单易用,完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理,适应动态数据源等。

 

如何使用Sentinel来做服务保护?

Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供可选的异常处理和 fallback 配置项 。该注解包含以下属性

  • value:资源名称,必需项(不能为空)
  • entryType:entry 类型,可选项EntryType.OUT/EntryType.IN(默认为 EntryType.OUT),对应入口控制/出口控制
  • blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称。(不能为空)
  • fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理
    • 返回值类型必须与原函数返回值类型一致
    • fllback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。函数签名和fallback一致

控制台形式管理限流接口

Sentinel  dashboard 控制台选择创建流量规则,设置资源名称(服务接口地址)、设置QPS 为1 表示每s最多能够访问1次接口。

下载地址:https://github.com/alibaba/Sentinel/releases

运行执行命令

java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar

8718属于界面端口号; 8719 属于api通讯的端口号

在infosys-order服务中配置getOrder资源名(infosys-order服务中对应的限流方法名),配置每秒访问2次,超过了给出限流提示

Sentinel原理以及配置总结_第2张图片

对应业务配置

Sentinel原理以及配置总结_第3张图片

配置说明:当线程池达到每秒1个请求,走到限流逻辑

pom文件

		
			com.alibaba.cloud
			spring-cloud-alibaba-sentinel
			2.2.0.RELEASE
		
		
			org.springframework.boot
			spring-boot-starter-actuator
		

业务代码:

    /**
     * value = getOrder,需要和sentinel-dashboard配置保持一致
    * getOrderQpsException:服务降级走的流程
    * <功能详细描述>
    * @return[参数说明]
    * @return String[返回类型说明]
    * @exception throws [违例类型][违例说明]
    * @see [类、类#方法、类#成员]
     */
    @SentinelResource(value = "getOrder", blockHandler = "getOrderQpsException")
    @RequestMapping("/getOrder")
    public String getOrder()
    {
        return "getOrder接口,接口正常被调用!";
    }

    /**
     * 被限流后返回的提示
     *
     * @param e
     * @return
     */
    public String getOrderQpsException(BlockException e) {
        e.printStackTrace();
        return "该接口已经被限流啦!";
    }

application.yml配置

spring:
  application:
    ###服务的名称
    name: infosys-order
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 192.168.234.135:8848
    sentinel:
      eager: true
      transport:
        dashboard: 127.0.0.1:8718
server:
  port: 8091

测试效果,当请求达到每秒2次,走限流接口.

Sentinel原理以及配置总结_第4张图片

Sentinel如何保证规则的持久化

默认的情况下Sentinel的规则是存放在内存中,如果Sentinel客户端重启后,Sentinel数据规则可能会丢失。

解决方案:Sentinel持久化机制支持四种持久化的机制。

  1. 本地文件
  2. 携程阿波罗
  3. Nacos
  4. Zookeeper

[
    {
        "resource": "/ getOrderSentinel",

        "limitApp": "default",

        "grade": 1,

        "count": 5,

        "strategy": 0,

        "controlBehavior": 0,

        "clusterMode": false
    }
]

resource:资源名,即限流规则的作用对象

limitApp:流控针对的调用来源,若为 default 则不区分调用来源

grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制

count:限流阈值

strategy:调用关系限流策略

controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)

clusterMode:是否为集群模式

Nacos配置信息

Sentinel原理以及配置总结_第5张图片

yml信息

spring:
  application:
    ###服务的名称
    name: infosys-order
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 192.168.234.135:8848
    sentinel:
      eager: true
      transport:
        dashboard: 127.0.0.1:8718
      datasource:
        ds1:
          nacos:
            ### nacos连接地址
            server-addr: 192.168.234.135:8848
            ### 读取配置文件的 data-id
            dataId: infosys-order
            ## nacos连接的分组
            group-id: DEFAULT_GROUP
            ruleType: flow
            
server:
  port: 8091

业务调用

 @SentinelResource(value = "getOrderSentinel", blockHandler =
            "getOrderSentinelBlockHandler")
    @RequestMapping("/getOrderSentinel")
    public String getOrderSent() {
        return "getOrderSentinel";
    }

    public String getOrderSentinelBlockHandler(BlockException e) {
        return "当前访问人数过多,请稍后重试!";
    }
    

配置nacos以后,会自动加载内存,显示到Sentinel-dashboard 

 

参考:

中文文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

GitHub:https://github.com/all4you/sentinel-tutorial

GitHub:https://github.com/eacdy/Sentinel-Dashboard-Nacos

你可能感兴趣的:(Sentinel原理以及配置总结)