暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

springcloud微服务-Nacos 结合 Sentinel 实现流量控制.md

懒人实录 2021-02-18
705

Sentinel 分布式系统的流量防卫兵

Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:
  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

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

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

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

Sentinel 的主要特性:


Sentinel 分为两个部分:

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

Sentinel 与 Hystrix 的对比


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

依赖

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


配置application.properties

spring.cloud.sentinel.transport.dashboard=localhost:8080
复制
#服务启动之后 直接去注册到dashboard
复制
spring.cloud.sentinel.eager=true
复制
spring.application.name=stn
复制
server.port=80
复制


整合web应用
controller

@RestController
复制
public class TestController {
复制
   @Autowired
复制
   PersonService personSrv;
复制
   @GetMapping("/get")
复制
   public String get() {
复制
复制
      return personSrv.getBody();
复制
   }
复制
}
复制


service

@Service
复制
public class PersonService {
复制
   @SentinelResource(value = "test1",blockHandler = "back")
复制
   public String getBody() {
复制
      // 真正的业务逻辑
复制
      // 被保护的资源
复制
      return "啦啦啦啦啦";
复制
   }
复制
复制
   public String back(BlockException e) {
复制
      return "降级了....";
复制
   }
复制
}
复制


注意:注解方式埋点不支持 private 方法。
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。@SentinelResource 注解包含以下属性:

  • value:资源名称,必需项(不能为空)

  • entryType:entry 类型,可选项(默认为 EntryType.OUT)

  • blockHandler / blockHandlerClass: blockHandler对应处理 BlockException 的函数名称,可选项。* blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。* fallback 函数签名和位置要求:
    返回值类型必须与原函数返回值类型一致;
    方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 * fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
    返回值类型必须与原函数返回值类型一致;
    方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
    注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。

定义规则

Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。

官方文档

https://github.com/alibaba/Sentinel/wiki/如何使用#规则的种类

Sentinel 控制台

您可以从 release 页面 下载最新版本的控制台 jar 包。
https://github.com/alibaba/Sentinel/releases
启动控制台
启动命令如下:

java -jar sentinel-dashboard-1.8.1.jar
复制
访问

http://localhost:8080/#/login  账号:sentinel 密码:sentinel

配置流量规则

QPS(每秒钟的请求数量):当请求该资源的数量达到了阈值的时候,进行限流
线程数:当调用该资源的线程数达到阈值时,进行限流

流控模式:
  • 直接:资源调⽤达到限流条件时,直接限流

  • 关联:关联的资源调⽤达到阈值时候限流⾃⼰

  • 链路:只记录指定链路上的流量

流控效果
  • 快速失败 
    直接失败,抛异常,剩余请求不再往下执行

  • 预热 Warm Up 

  • 系统初始化的默认阈值为10 / 3,即为3,也就是刚开始的时候阈值只有3,当经过5s后,阈值才慢慢提高到10; 
    应用场景:秒杀系统,在开启瞬间会有很多流量上来,很可能会导致服务器崩溃,预热方式就是为了保护系统,可以慢慢的把流量放进来,慢慢的把阈值增长到设定值;

  • 排队等待 
    匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效;

  • 每秒1次请求,QPS大于1后,再有请求就排队,等待超时时间为500毫秒;
    应用场景:在某一时刻有大量的请求到来,而接下来的时间则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

sentinel 集成  Nacos

依赖


<dependency>
复制
    <groupId>com.alibaba.csp</groupId>
复制
    <artifactId>sentinel-datasource-nacos</artifactId>
复制
</dependency>
复制


配置application.properties


 

#整合 nacos 下发配置
复制
spring.cloud.sentinel.datasource.ds.nacos.server-addr=127.0.0.1:8848
复制
spring.cloud.sentinel.datasource.ds.nacos.dataId=stn
复制
spring.cloud.sentinel.datasource.ds.nacos.groupId=DEFAULT_GROUP
复制
复制
spring.cloud.sentinel.datasource.ds.nacos.ruleType=flow
复制


Nacos添加规则

[

    {

        "resource": "test1",

        "limitApp": "default",

        "grade": 1,

        "count": 2,

        "strategy": 0,

        "controlBehavior": 0,

        "clusterMode": false

    }

]


     Field                          说明       默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS 模式(1)或并发线程数模式(0)QPS 模式
limitApp流控针对的调用来源default
,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流直接拒绝
clusterMode是否集群限流

更新nacos ,Sentinel 控制台阈值数会自动更新,及时生


文章转载自懒人实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论