zoukankan      html  css  js  c++  java
  • sentinel

    随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。 Sentinel是强大的流控制组件,以“流”为切入点,涵盖多个领域,包括流控制,并发限制,熔断和自适应系统保护,以确保微服务的可靠性。

    2012年,Sentinel诞生于阿里巴巴,其主要目标是流量控制。2013-2017年,Sentinel迅速发展,并成为阿里巴巴所有微服务的基本组成部分。 它已在6000多个应用程序中使用,涵盖了几乎所有核心电子商务场景。2018年,Sentinel演变为一个开源项目。2020年,Sentinel Golang发布。

    Sentinel的生态圈

    Sentinel 主要特性

    Sentinel 的使用可以分为两个部分:

    核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。控制台(Dashboard):控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。在这里我们看下控制台的使用

    控制台安装

    下载地址:https://github.com/alibaba/Sentinel/releases,sentinel-dashboard-1.7.2.jar

    本地需要先安装好Java8环境,8080端口没被占用。

    cmd安装目录,运行命令java -jar sentinel-dashboard-1.7.2.jar

    访问http://localhost:8080/

    默认账号密码都为sentinel,登陆进去,控制台安装完毕。

    功能使用

    还是以之前讲解Nacos的项目,讲解sentinel的使用,新建一个模块cloudalibaba-sentinel-8401。

    引入依赖

    <!-- 引入自己定义的通用包--> <dependency> <artifactId>springcloud-commom</artifactId> <groupId>com.learn.springcloud</groupId><version>1.0-SNAPSHOT</version> </dependency> <!--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>

    添加配置文件application.yml

    server:port: 8401spring: application: name: cloudalibaba-sentinel-service cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 sentinel: transport: dashboard: localhost:8080 #配置Sentinel dashboard地址 port: 8719management: endpoints: web:exposure: include: '*'

    controller

    @RestControllerpublic class FlowLimitController {@GetMapping("/test") public String testA() { return "------hello sentinel-----------"; }}

    启动类添加@EnableDiscoveryClient注解,先启动nacos,启动项目。

    启动成功,服务已注册到nacos。

    访问请求,http://localhost:8401/test。

    刷新sentinel控制台,点击簇点链路。

    点击流控,或下面的流控规则。那具体这些是干嘛用的?下面将一一介绍。

    流控规则

    资源名:唯一名称,默认请求路径

    针对卡片:Sentinel可以针对调用者进行限流,填写微服务名,默认为default(不区分来源)

    阈值类型/单机阈值:

    1.QPS:每秒请求数,当前调用该api的QPS到达阈值的时候进行限流

    2.线程数:当调用该api的线程数到达阈值的时候,进行限流

    是否集群:是否为集群

    流控模式:

    1.直接:当api大达到限流条件时,直接限流

    2.关联:当关联的资源到达阈值,就限流自己

    3.链路:只记录指定路上的流量,指定资源从入口资源进来的流量,如果达到阈值,就进行限流,api级别的限流

    举例,先看流控模式为直接

    选择QPS,直接,快速失败,单机阈值为1。

    频繁刷新请求,1秒访问1次请求,正常,超过设置的阈值,将报默认的错误。

    再次的1秒访问1次请求,访问正常。

    流控模式为关联

    添加一个请求

    @GetMapping("/testGualian")public String testGualian(){return "------testGualian-----------";}

    选择QPS,单机阈值为1,选择关联,关联资源为/testGualian,这里用Jmeter模拟高并发,请求/testGualian。

    在大批量线程高并发访问/testGualian,导致/test失效了

    链路就不再演示了。多个请求调用同一微服务。

    流控模式为Warm up(预热)

    当流量突然增大的时候,我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓步的增多,经过预期的时间以后,到达系统处理请求个数的最大值。Warm Up(冷启动,预热)模式就是为了实现这个目的的。

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

    先在单机阈值10/3,3的时候,预热5秒后,慢慢将阈值升至10。刚开始刷/test,会出现默认错误,预热时间到了后,阈值增加,没超过阈值刷新,请求正常。

    通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:

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

    流控模式为排队等待

    匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。阈值必须设置为QPS。

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

    总结

    到这已经学习Sentinel的基本的使用,在很多的特性和Hystrix有很多类似的功能。以下是Sentinel和Hystrix的对比。

    后续将介绍Sentinel其他内容。

  • 相关阅读:
    《java网络编程》
    画类图的使用工具----转载
    桌面应用要素
    java桌面应用
    java网络程序
    网络程序
    java中的数据类型
    数据类型要素
    java中的设计模式
    输入一个年龄,判断年龄范围
  • 原文地址:https://www.cnblogs.com/dzcWeb/p/14313750.html
Copyright © 2011-2022 走看看