1-CloudAlibaba-Sentinel(限流)学习笔记2020.10.21

36 篇文章 2 订阅
13 篇文章 0 订阅

1-CloudAlibaba-Sentinel(限流)学习笔记2020.10.21

前言: (Cloud的官网GitHub官网Sentinel官网)

阿里巴巴的Sentinel对比奈飞的Hystrix 有什么不同, 有什么优势? (下面是官网复制的, 更为详细看官网)

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
  • Sentinel 分为两个部分:
    • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
    • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

简单来说, 多了完备的实时监控与web界面管理控制流量的控制台, 下载简单配置启动就可以实现, Hystrix 需要自行搭建配置监控。

1.0 docker方式下载安装/启动控制台

1.1 下载好jar包并创建sentinel-Dockerfile文件上传上去

# 使用 JDK 8 环境为基础镜像,如果镜像不是本地的将会从 DockerHub 进行下载
FROM java:8
# 复制文件到容器,并且重命名。
ADD sentinel-dashboard-1.8.0.jar  sentinel-dashboard.jar
# 声明需要暴露的端口
EXPOSE 8090
# ENTRYPOINT 指令都是用来指定容器启动时运行的命令。
ENTRYPOINT ["java", "-Dserver.port=8090","-Dcsp.sentinel.dashboard.server=localhost:8090", "-Dproject.name=sentinel-dashboard", "-jar", "/sentinel-dashboard.jar"]

并给上, 执行、写入权限。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aew7BLqO-1603352276700)(https://s1.ax1x.com/2020/10/20/Bp17RS.jpg)]

1.2 构建jar镜像

-f 指定Dockerfile文件路径

docker build -t sentinel-dashboard:1.8 -f /usr/local/zhihao_project/zhihao_dockerfile/sentinel-Dockerfile /usr/local/zhihao_project/zhihao_dockerfile/

1.3 运行构建完成的镜像

docker run -d --name sentinel-dashboard -p 8090:8090 -p 8719:8719  5bf385912e4d

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uAksbVul-1603352276702)(https://s1.ax1x.com/2020/10/20/BpUYnO.jpg)]

其中8090是sentinel web控制界面端口,8719是sentinel应用端和控制台通信端口,参考配置控制台信息

启动完成访问: http://公网IP:8090/ 看到登录页面说明启动正常。 默认用户名和密码都是 sentinel

2.0 新建应用服务中使用sentinel

2.1 引入依赖

		<!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件+actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2.2 application.yml修改

server:
  port: 8080

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 119.xx.xxx.xxx:8848 # Nacos服务注册中心地址
    sentinel:
      transport:
      	port: 8719
        dashboard:  119.xx.xxx.xxx:8090 # 配置Sentinel dashboard地址
   
# 暴露监控
management:
  endpoints:
    web:
      exposure:
        include: '*'

2.3 启动类/引导类

@EnableDiscoveryClient
@SpringBootApplication
public class SentinelService
{
    public static void main(String[] args) {
        SpringApplication.run(SentinelService.class, args);
    }
}

2.4 启动应用进行测试

启动应用后, 去查看控制台, 发现没有对应用进行监控, 原因是需要触发客户端初始化。( 也就是懒加载)

确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。

在经过首次调用API接口后, 控制台上服务是出现了, 但是又发现, 实时监控菜单一篇空白。

后来经过查看容器日记发现, 控制台需要发送请求回调到的被监控上去的应用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQBEy0ZU-1603352276704)(https://s1.ax1x.com/2020/10/21/BCFzo4.jpg)]

出现这个情况是原因: 控制台我是部署在云服务器上的docker上, 然后应用是在我本地启动的。

要解决这个问题, 只能将应用部署上去云服务器上面的docker。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rGZrjUF-1603352276706)(https://s1.ax1x.com/2020/10/21/BCGzJ1.jpg)]

但是这样对于学习来说,经常修改然后经常部署过于麻烦, 下面就换成本地了。

换回本地将application.ymlsentinel 地址换成localhost:8090

2.5 簇点链路菜单中显示刚刚调用的资源(单机实时)

簇点链路(单机调用链路)页面实时的去拉取指定客户端资源的运行情况。它一共提供两种展示模式:一种用树状结构展示资源的调用链路,另外一种则不区分调用链路展示资源的实时情况。

注意: 簇点链路监控是内存态的信息,它仅展示启动后调用过的资源。

2.6 控制台的流控规则菜单 (官网说明)

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

FlowSlot 会根据预设的规则,结合前面 NodeSelectorSlotClusterBuilderSlotStatisticSlot 统计出来的实时信息进行流量控制。

限流的直接表现是在执行 Entry nodeA = SphU.entry(resourceName) 的时候抛出 FlowException 异常。FlowExceptionBlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑。

同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource:资源名,即限流规则的作用对象 (请求路径)
  • count: 限流阈值
  • grade: 限流阈值类型(QPS 或并发线程数)
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来源 (填写微服务应用名)
  • strategy: 调用关系限流策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

简单来说就是控制请求流量的(限流), 更为详细看官网。

2.6.1 QPS-直接模式-快速失败效果, 规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJxd1klR-1603352276708)(https://s1.ax1x.com/2020/10/21/BC5qXV.jpg)]

上面图, 对/test1 接口进行了流量控制, 只允许每秒一个请求, 超过就进行控制, 流控模式是直接、 效果是快速失败。

并且在簇点链路菜单进行增加后, 流控规则也会多出一条记录, 可以操作修改与删除, 并立即生效。

相对应Hystrix 更新配置后需要进行重启来说更为强大, 其中限流有官方默认提示, 也可以配置像Hystrix 一样的fallback方法。

QPS : 该请求每秒请求次数达到阈值进行限流线程数: 当调用该api的线程数达到阈值时进行限流 (也就是内部处理该次请求的线程数, 假设设置为1, 那么该接口假设需要处理5秒, 那么在这5秒内其他请求进来是会进行限流, 因为设置了该接口处理线程数最大1, 由于一个线程数执行需要5秒, 还没执行完毕进行释放, 下面的请求进来就超过了线程数)

2.6.2 QPS-关联模式-快速失败效果, 规则

具有关系的资源流量控制:关联流量控制

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_dbwrite_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategyRuleConstant.STRATEGY_RELATE 同时设置 refResourcewrite_db。这样当写库操作过于频繁时,读数据的请求会被限流。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZFFnCEl-1603352276710)(https://s1.ax1x.com/2020/10/21/BCvYp8.jpg)]

2.6.3 QPS-链路模式-快速失败效果, 规则

官网说的很模糊: (官网)

这里使用到了@SentinelResource()注解。

定义一个服务接口:

@Service
public class TestService {

    @SentinelResource("test")
    public String testHotKey()
    {
        return "------返回链路test";
    }
}

其中同应用中的api接口, 进行注入调用了TestService

@RestController
public class FlowLimitController
{

    @Autowired
    private TestService testService;

    @GetMapping("/test1")
    public String test1()
    {
        testService.testHotKey();
        return "------test1";
    }

    @GetMapping("/test2")
    public String test2()
    {
        testService.testHotKey();
        return "------test2";
    }

下面图是进行首次调用/test1/test2后, 会发现多出来个TestService下的test资源名。

这个就是链路调用, 下面就是在test上进行配置链路规则。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-THuMsGDY-1603352276711)(https://s1.ax1x.com/2020/10/22/Biw5Ks.jpg)]

坑了蛮久的, 链路无法生效, 官方的issues上有说明:

从1.6.3开始,Web CommonFilter将统一Web入口上下文,因此入口流控制不会生效。Sentinel 1.7.0(〜SCA 2.1.1.RELEASE)为CommonFilter:引入了一个初始化参数WEB_CONTEXT_UNIFY来控制上下文。您可以false在添加FilterRegistration时将其设置为。

spring-cloud-alibaba v2.1.1.RELEASE后,可以通过配置关闭 spring.cloud.sentinel.web-context-unify=false

刚刚好我用的就是cloud版本就是2.2.1, 无法设置…, 最终将cloud版本更新为2.2.3.RELEASE后通过上面设置生效了链路。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y12gjQXE-1603352276712)(https://s1.ax1x.com/2020/10/22/Bi0ARe.jpg)]

2.6.4 流控效果-直接失败

直接拒绝RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。具体的例子参见 FlowQpsDemo

达到限制后, sentinel直接返回 Blocked by Sentinel (flow limiting), 上面用过了。

2.6.4 流控效果-Warm Up(预热)

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。详细文档可以参考 流量控制 - Warm Up 文档

从详情文档中看到预热效果:

默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值

假设: 设置了QPS的阈值是20 (也就是每秒最大20次请求)、 流控模式: 直接、 流控效果-Warm Up设置为10秒

效果: 就是 20/3=6 , 慢慢从刚开始每秒只能接收6次请求开始上升可以接收更多, 一直上升到10秒后可以每秒接收20次。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52vIavH7-1603352276713)(https://s1.ax1x.com/2020/10/22/BibJl4.jpg)]

应用场景一般用于: 秒杀活动、 整点抢购活动, 避免一上来就直接把系统打垮。

2.6.5 流控效果-排队等待

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。详细文档可以参考 流量控制 - 匀速器模式,具体的例子可以参见 PaceFlowDemo

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

注意:匀速排队模式暂时不支持 QPS > 1000 的场景。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m534C4Gz-1603352276715)(https://s1.ax1x.com/2020/10/22/BFprVg.jpg)]

1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值