SpringCloudAlibaba第二章(Sentinel)

目录

1:Sentinel安装

2:Sentinel的作用(相当于hystrix)

3:简单项目8002案例

3.1:项目pom配置

3.2:properties配置

3.3:项目的controller(每一个controller方法都会在sentinel中看到)

3.4:main方法

3.5:结果查看

4:Sentinel规则总结

5:Sentinel流控规则

5.1:Sentinel流控规则实例

5.2:Sentinel流控规则总结

6:Sentinel服务降级

6.1:Sentinel降级规则

6.2:Sentinel降级总结

7:Sentinel热点参数限流

7.1:Sentinel热点参数限流规则

7.2:代码实例

7.3:Sentinel热点参数限流总结

8:Sentinel系统自适应限流

8.1:Sentinel系统自适应限流规则

8.2:Sentinel系统自适应限流总结

9:Sentinel熔断(SentinelResource)

9.1:Sentinel熔断概念

9.2:Sentinel熔断实现

10:Sentinel流控持久化

10.1:Sentinel流控持久化概念

10.2:Sentinel流控持久化配置


1:Sentinel安装

官网下载:Releases · alibaba/Sentinel · GitHub

运行:java -jar  sentinel-dashboard-1.7.0.jar 

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

页面查看:访问:localhost:8080,账号密码均为sentinel

2:Sentinel的作用(相当于hystrix)

sentinel作为springcloudalibaba的的一个组件,随着服务集群化管理,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

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

Sentinel 的主要特性:

Sentinel-features-overview

Sentinel 分为两个部分:

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

3:简单项目8002案例

3.1:项目pom配置

 <dependencies>

        <!-- nocas的服务注册jar -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--sentine依赖的jar-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        
        <!--nacos持久化依赖的jar-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

        <!--Spring web 依赖-->
        <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>


    </dependencies>

3.2:properties配置

#项目名字和端口
server.port=8002
spring.application.name=huyiju-nacosservice
#nocas服务注册地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*

#注册sentinel监控地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口

spring.cloud.sentinel.transport.port=8719

3.3:项目的controller(每一个controller方法都会在sentinel中看到)

@RestController
public class Controller {


    /**
     * 测试sentinel的流控规则
     * @return
     */
    @GetMapping(value = "/a")
    public String test() {
        try {
            Thread.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "a方法:" + port;
    }


    /**
     * 测试sentinel的流控规则
     * @return
     */
    @GetMapping(value = "/b")
    public String b() {
        return "b方法:" + port;
    }

    /**
     * 测试sentinel的关联规则
     * xiadan 关联zhifu 
     * 当支付卡顿的时候 下单也要进行流量控制
     * @return
     */   
    @GetMapping(value = "/zhifu")
    public String zhifu() {
        return "a方法:" + port;
    }
    @GetMapping(value = "/xiadan")
    public String xiadan() {
        return "b方法:" + port;
    }
    
    /**
     * 测试sentinel的系统规则
     * @return
     */
    @GetMapping(value = "/rt")
    public String rt() {
        try {

            TimeUnit.SECONDS.sleep(1);
            Date day=new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("线程睡眠1秒:"+df.format(day));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //int a=10/0;
        return "b方法:" + port;
    }

    /**
     * 测试sentinel的热点key
     * blockHandler = "del_hotkey" 添加热点key的异常方法
     * @param a
     * @param b
     * @return
     */
    @GetMapping(value = "/hotkey")
    @SentinelResource(value = "hotkey",blockHandler = "del_hotkey")
    public String hotkey(@RequestParam(value = "a",required = false) String a,
                         @RequestParam(value = "b",required = false)String b) {
        System.out.println(a +"===="+b);
        return "hotkey主方法";
    }

    public String del_hotkey(String a, String b, BlockException ex) {
        return "拦截hotkey方法";
    }

}

3.4:main方法

@SpringBootApplication
@EnableDiscoveryClient//nocas服务发现注解
public class Mian8002 {
    public static void main(String[] args) {
        SpringApplication.run(Mian8002.class,args);

    }
}

3.5:结果查看

多次访问:http://localhost:8002/a

4:Sentinel规则总结

我们在Sentinel的控制台中可以看到这些配置规则如下,针对每一方法都有流控、降级、热点等配置信息,我们接下来按照这些配置来逐个学习。

5:Sentinel流控规则

5.1:Sentinel流控规则实例

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

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

阈值类型/单机阈值:

         1:QPS(每秒请求数量):当调用该api的QPS达到阈值的时候,进行限流(比如10qps,当每秒10个请求以上,直接出现异常)

         2:线程数:当调用该api的线程数达到阈值的时候,进行限流(比如10个线程,当超多10个线程处理能力的时候,直接出现异常

流控模式:

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

      2:关联:当关联的资源达到限流阈值时,就限流自己(a方法关联b方法,b方法出现流控的时候,a方法不能访问)

      3:链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到峰值,就进行限流)【api级别的针对来源】

流控效果:

     1:快速失败:直接失败,抛异常

     2:Warm Up:根据coldFactor(冷加载因子,默认3)的值,从阈值/coldFactor,经过预热时长,才达到设置的QPS阈值,假如10个          qps,刚开始允许的qps是10/3=3个,经过设置的预热时间5秒,之后允许的qps上升到10

     3:排队等待:匀速排队,让请求以匀速通过,阈值类型必须设置为QPS,否则无效(适用于消息对列)
 

5.2:Sentinel流控规则总结

我们可以看到流控规则,是对方法(或者方法链路)限流进行各种各样的流量限制。针对流量

6:Sentinel服务降级

6.1:Sentinel降级规则

    除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
 

1:平均响应时间 (RT):当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
2:异常比例 :当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
3:异常数: 当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

查询结果显示

6.2:Sentinel降级总结

服务降级针对的是整理链路上的服务如果某一个出现了响应时间、异常情况下的服务降级,不可用,在等待时间之后恢复调用

7:Sentinel热点参数限流

7.1:Sentinel热点参数限流规则

1:参数索引:参数下标对参数进行限流,包含指定此参数的时候,进行限流

2:参数例外项:如果参数的值是设置的test的时候,不进行限流 

7.2:代码实例

 /**
     *
     * 测试sentinel的热点key
     * blockHandler = "del_hotkey" 添加热点key的异常方法
     * 对参数a进行限流,并且a的值是test的不限流
     * @param a
     * @param b
     * @return
     */
    @GetMapping(value = "/hotkey")
    @SentinelResource(value = "hotkeyHandler",blockHandler = "del_hotkey")
    public String hotkey(@RequestParam(value = "a",required = false) String a,
                         @RequestParam(value = "b",required = false)String b) {
        System.out.println(a +"===="+b);
        return "hotkey主方法";
    }

    public String del_hotkey(String a, String b, BlockException ex) {
        return "拦截hotkey方法";
    }

7.3:Sentinel热点参数限流总结

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制

用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

8:Sentinel系统自适应限流

8.1:Sentinel系统自适应限流规则

1:Rt:系统的平均响应时间(针对的是整个项目,不是单一的controller) 

2:线程数:线程数限流(针对的是整个项目,不是单一的controller) 

其他的都是同理

8.2:Sentinel系统自适应限流总结

系统自适应限流针对的是系统层级,包含所的controller

9:Sentinel熔断(SentinelResource)

9.1:Sentinel熔断概念

1:超出Sentinel的限流设置:在前边知道的Sentinel的流控,假如设置的qps为1,每秒钟只能一个访问,超出就会返回错误。

2:代码中出错:会返回代码的出错信息

这两种情况很不友好,所有我们需要在方法上配置熔断信息

9.2:Sentinel熔断实现

1:controller代码

 
    @GetMapping(value = "/user/get/{id}")
    @SentinelResource(value = "get",
            //负责Sentinel的降级异常,指定类和方法
            blockHandlerClass = Myhander.class,
            blockHandler = "del_3",
            //负责Sentinel的熔断异常,指定类和方法
            fallbackClass = MyFallback.class,
            fallback = "usergetFallBack1",
            exceptionsToIgnore = {NullPointerException.class}
    )
    public String Userget(@PathVariable(value = "id") int id) {
        System.out.println("传入id的值是:"+id);
        int a=10/0;
        if(id==2){
            throw  new IllegalArgumentException(":id is not 2");
        }else if (id==0){
            throw  new NullPointerException(":null expection");
        }
        return "测试主方法正常返回"+id;
    }

2:Sentinel熔断和流控异常类的fallback

public class MyFallback {

    public static String usergetFallBack1(int id, Throwable throwable) {

        return "MyFallback异常输出:"+id+throwable.getMessage();
    }
}



public class Myhander {

    public static String del_3( int id,BlockException ex) {

        return "del_3接口限流:"+id;
    }
}

10:Sentinel流控持久化

10.1:Sentinel流控持久化概念

在项目中只要我们的Sentinel仪表盘重启,我们的配置信息都会丢失,所以需要持久化,持久化需要配置nocas,将配置信息持久化到nocas的配置文件中,来避免重启配置丢死

10.2:Sentinel流控持久化配置

1:新增pom

  <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

2:propertise

#持久化配置 nocas地址
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
#服务名字
spring.cloud.sentinel.datasource.ds1.nacos.data-id=huyiju-nacosservice8002
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

3:nocas配置

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

4:重启服务,访问地址http://localhost:8002/hotkey/aa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值