服务容错Sentinel入门笔记

服务容错Sentinel入门笔记

    • 相关连接
    • 简单概述
    • 准备工作
      • 依赖导入
      • application.yml配置修改
      • 启动Sentinel
      • 登录Senetinel
    • 流量控制
      • Demo:
    • 其他流控选项
      • 流控模式
        • 1. 直接
        • 2. 关联
        • 3. 链路
      • 流控效果
        • 1. 快速失败
        • 2. warm up(预热)
        • 3. 排队等待

相关连接

github wiki
Sentinel官网

简单概述

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

服务容错Sentinel入门笔记_第1张图片

准备工作

依赖导入

<dependency>
  <groupId>com.alibaba.cloudgroupId>
  <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
  
  <exclusions>
    <exclusion>
      <artifactId>jackson-dataformat-xmlartifactId>
      <groupId>com.fasterxml.jackson.dataformatgroupId>
    exclusion>
  exclusions>
dependency>


<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-actuatorartifactId>
dependency>

actuator: spring提供的组件,提供了一系列生产级特性,比如健康状况的输出、性能指标收集… 暴露应用内部的各种数据状态

application.yml配置修改

spring:
  cloud:
  	nacos: 
      server-addr=localhost: 8848
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8840   # dashboard地址
        client-ip: localhost        # 本机地址,可以不填
# actuator暴露所有的端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动Sentinel

java -Dserver.port=8840 -Dcsp.sentinel.dashboard.server=localhost:8840 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

登录Senetinel

http://localhost:8840/
账号密码:sentinel/sentinel

流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:
服务容错Sentinel入门笔记_第2张图片
流量控制有以下几个角度:
• 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
• 运行指标,例如 QPS、线程池、系统负载等;
• 控制的效果,例如直接限流、冷启动、排队等。

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

sentinel注意点:
• spring-cloud-starter-alibaba-sentinel 将所有开放的端点自动视作sentinel所要保护的资源。
• 懒加载的,请求之后才能出现数据
• 规则默认是在应用(而非sentinel控制台)的内存中的,如果应用重启,则规则失效,后续通过扩展持久化

Demo:

  1. 确保应用接入了控制台
  2. 发起一次请求,在控制台的簇点链路界面看到这个资源
    服务容错Sentinel入门笔记_第3张图片
  3. 点击流控,新增流控规则,如下图,阈值类型设为QPS 单机阈值设为5,保存。
    服务容错Sentinel入门笔记_第4张图片
  4. post 新建collection,新建request,新建test,使用runner运行测试
    服务容错Sentinel入门笔记_第5张图片
    服务容错Sentinel入门笔记_第6张图片
  5. 结果如下,发送了10次,结果成功5次,失败5次
    服务容错Sentinel入门笔记_第7张图片
    后端结果:被请求了5次
    服务容错Sentinel入门笔记_第8张图片

其他流控选项

流控模式

1. 直接

针对当前资源进行处理。例如上示Demo:/get

2. 关联

A资源 关联 B 资源 ,请求发给B,如果达到阈值,那么则对A限流; A=>查询操作 B=>更新操作
配置图:
服务容错Sentinel入门笔记_第9张图片
结果如下:
当B阈值5达到后,A进行限流
服务容错Sentinel入门笔记_第10张图片

3. 链路

以调用链路为单位做限流处理,例如:A->B->C 这个链路的总体流量只按入口A的请求量来计算

流控效果

1. 快速失败

直接抛出异常,界面收到提示:Blocked by Sentinel (flow limiting) com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
浏览器结果图

2. warm up(预热)

如果qps 10,预热时长10s 冷加载因子是3 从qps=10/3 开始控制流量,逐步达到10
冷启动(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式。该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。
比如设置的阈值为100,预热时间10s,冷加载因子是3,那最初的阈值时100/3,逐步加大阈值,10s后达到100。阈值大小决定了流量大小,也就是逐步释放请求流量进入系统,让系统“冷启动”。参考官方wiki 限流—冷启动
源码: com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
服务容错Sentinel入门笔记_第11张图片
如果qps 10,预热时长10s 冷加载因子是3 从qps=10/3 开始控制流量,逐步达到10 postman设置delay 100ms 保证qps 10 这样看到通过请求越来越多的
配置图:
服务容错Sentinel入门笔记_第12张图片

3. 排队等待

• 匀速器(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式。需要设置将阈值模式设置为QPS才能生效。这种方式严格控制了请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。参考官方:流量监控 匀速排队
该方式的作用如下图所示:
服务容错Sentinel入门笔记_第13张图片
配置图:
postman结果图发送时间都在500ms左右
服务容错Sentinel入门笔记_第14张图片
后端响应也在500ms左右
服务容错Sentinel入门笔记_第15张图片
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。削峰填谷。
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

超时时间: 超时等待超过指定时间,则被限流

你可能感兴趣的:(java,分布式)