Alibaba Sentinel超详细整理

Alibaba Sentinel 是面向云原生微服务的流量控制,熔断降级组件,监控保护你的微服务

github

为什么要学Alibaba Sentinel?

先来看看Sentinel的前身 Hystrix ,可以翻阅我的文章整理,总结下来有几点

  1. 需要我们程序员手工搭建监控平台
  2. 没有一套web界面可以给我们进行更加细粒度配置流控,速率控制,服务熔断,服务降级...

而Sentinel的优势

1.单独一个组件,可以独立出来
2.直接界面化的细粒度统一配置

有没有发现跟Nacos很像,我们不需要在手动建立一个部署模块,直接入驻就可以了,开发简便很多

Sentinel是什么

分布式系统的流量防卫兵

  • 丰富的应用场景: Sentinel承接了阿里巴巴近十年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围),消息削峰填谷,集群流量控制,实时熔断下游不可用应用等
  • 完美的实时监控:
    Sentinel同事提供实时的监控功能,您可以在控制台看到接入应用的单台机器秒级数据,甚至500台一下规模的集群的汇总运行情况
  • 广泛的开源生态:
    Sentinel提供开箱即用的与其他框架/库的整合模块,例如与SpringCloud,Dubbo,gRPC的整合,您只需要引入响应的依赖并进行简单的配置即可快速接入Sentinel.
  • 完美的SPI扩展点:
    Sentinel提供简单易用的,完美的SPI扩展接口,可以通过实现扩展接口来快速定制逻辑,例如定制规则管理,适配动态数据源等.

Sentinel 分为两个部分

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

服务限流配置

实时查看QPS


簇点链路:查看Http请求

流控规则 :控制qps,线程等等

查过峰值,会抛出异常(可自行配置服务降级回调方法)

阈值关联 : 当关联资源/testB的qps阈值超过1时,就限流/testA的Rest访问地址

使用postman并发请求接口 testB

发现A接口被限流关闭了 配置生效

预热 : 每个系统平时处于低水位的情况下,突然来高并发的流量,肯定是承受不住的,要经过预热后才会使系统达到稳定可以接受的状态.如不懂得可以看下我的高并发文章详解JVM调优

如图所示,阈值是10 但希望五秒内慢慢启动起来,也就是根据源码里的公示,即请求QPS从(threashold/3)开始,经多少预热时长才逐渐升至设定的QPS阈值


来自于:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController,冷加载因子默认是3

他的作用体现在,如果一个秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值

队列等待(常用)

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

如图所示,每秒请求1次,超过的话就排队等待,等待时间0.5秒

这种方式主要用于处理间隔性突发流量,例如消息队列,在某一秒有大量的请求道来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是一秒直接拒绝多余的请求

服务降级配置

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时,例如调用超时或异常比例升高,对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认抛出DegradeException)

  • RT

每秒平均响应时间,超过阈值,且时间窗口内通过的请求>=5,两个条件同时满足触发降级,RT最大4900

  • 异常比例(/s)

QPS>=5 且异常比例超过与知识,触发降级,时间窗口结束后,关闭降级

  • 异常数(/m)

异常数超过阈值是,触发降级,时间窗口结束后,关闭降级

热点配置

热点即经常访问的数据,很多时候我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制,热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效.

  • 资源名即对应@sentenelResource对应的value
  • 参数索引对应方法参数位置,从第几个参数开始检查
  • 阈值,窗口就不用解释了

@sentenelResource (前身HystrixCommond )

每个SentenelResource都应该有个对应的兜底方法,来处理出错后的返回,不配blockhandler的话会报page Error

高级玩法
普通我们配置热点参数时候,匹配规则就会返回block,但我们想有特定的参数后,例行放开阈值

当参数等于5时,可以单独配置阈值(必须是基本类型)

注意

@sentinelResource处理的是控制台配置的违规情况,有blockHandler方法进行兜底,但java运行时异常不归他管,这是两个东西(下面有fallback方法处理)

系统规则

系统规则自然对应所有入口的rest请求做处理,整体管控,设置有风险,需谨慎

全局自定义限流处理逻辑

在我们上面配置SentinelResource后,有没有发现每个类里面每个方法都要配置一个blockhandle,又麻烦又代码膨胀,那我们有没有一个自定义的全局处理方案呢?

  1. 创建CustomerBlockHandler类用于自定义限流处理逻辑
  2. 定义公共返回值
  3. 创建一个或多个对应blockhandler方法
/**
 * @program: 杭州品茗信息技术有限公司
 * @description
 * @author: 徐子木
 * @create: 2020-12-03 20:18
 **/
@Slf4j
public class CustomerBlockHandler {


    public static CommonResult<String> BlocHandler1(BlockException blockException) {
        return new CommonResult(500,"自定义block1");
    }


    public static CommonResult<String> BlocHandler2(BlockException blockException) {
        return new CommonResult(500,"自定义block2");
    }

}

配置在我们需要保障的方法内

    @GetMapping("/testB")
    @SentinelResource(value = "testB",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "BlocHandler1")
    public CommonResult<String> testB() {
        return new CommonResult(200,"testB");
    }

其实还有一种保障方法,可以用代码级别来控制,类似try catch,但我不推荐,写起来又长又麻烦,感兴趣的可以去官网查找写法

服务熔断Fallback

前面说的SentinelResouce,只会管理我们的服务限流级别的规则采取措施,若java代码级别的RuntimeException是不归他管的,该怎么报错还怎么报错,这里就要提一个fallback参数

新建全局异常处理类

/**
 * @program: 杭州品茗信息技术有限公司
 * @description
 * @author: 徐子木
 * @create: 2020-12-03 20:48
 **/
@Slf4j
public class CustomerFallBackHandler {


    public static CommonResult resultException(Throwable throwable) {
        return new CommonResult(500,"运行异常回调处理");
    }


}

配置要保障的方法

    @GetMapping("/testA")
    @SentinelResource(value = "testA", fallbackClass = {CustomerFallBackHandler.class}, fallback = "resultException")
    public CommonResult testA() {
        int a = 1 / 0;
        return new CommonResult(200, "testA");
    }

可以看到,原理其实跟block差不多,但细节是如果两个都配置的话,并且两种异常都触发的情况下,谁先触发就返回谁的回调,正常情况下限流会大于运行异常的

Sentinel与openFeign整合

这里整合就不过多的叙述了,详细可查官网文档

大致就是在我们feign的@FeignClient注解里也有fallback的参数,然后配置我们与业务类一直的异常返回类即可,如果调用服务关闭或者异常,会自动触发我们的服务熔断降级处理

注意yml 要开启sentinel对Feign的支持

规则持久化

问题: 在我们配置好规则后,每次重启微服务,我们先配置好的规则就都消失了

方案: 将限流配置规则持久化进Nacos保存,只要刷新某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对于微服务的流控规则持续有效

解决

  1. 添加maven坐标,将规则持久化进nacos
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
  1. 修改yml,将nacos配置文件对应
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
        port: 8719 #默认就是8719 如果被占用默认+1
      datasource:
        ds1:
          nacos:
            server-addr: 192.168.10.37:18848
            dataId: ${spring.application.name}
            groupId: DEV
            namespace: 8622d428-0496-4a09-b178-da3cfc736055
            data-type: json
            rule-type: flow
  1. 配置nacos文件
[
    {
        "resource":"testB",
        "limitAPP":"default",
        "grade":1,
        "count":1,
        "strategy":0,
        "controlBehavior":0,
        "clusterMode":false
    }

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

依次对应后重启我们的微服务,就会看到我们的持久化配置,只要Nacos存在,就会一直生效

学习方向

如今出来的技术越来越多,我们的方向要从剖析源码逐渐演变成 约定>配置>编码 ,所以阿里遵循这个理论给我们带来了很多好的产品

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容