Spring Cloud Alibaba Sentinel的入门介绍以及Sentinel流控规则

流量防卫兵Sentinel

  分布式系统中,微服务之间通过远程调用实现信息交互,调用是不可表面出现调用失败,例如:超时、异常等原因导致调用失败,Sentinel可以保证在一个微服务出现故障的情况下,不会导致其他相互调用的微服务失败,避免出现级联故障(服务崩溃),以此来提高分布式系统的弹性。
例如:
  电商中的用户下单操作,我们三个服务,一个是下订单服务,一个是减产品库存服务,一个是用户的个人中心服务,当用户下订单调用订单服务,然后下订单服务又调用减产品库存服务,如果减库存服务出现异常或者迟迟未响应,则会导致下订单的线程挂起等待,如果大量的用户请求下订单会导致请求堆积,引起由减库存服务不可用之后就导致下订单服务不可用最后导致用户查询订单服务不可用。所以在微服务架构中,很容易造成服务故障的蔓延,引发整个微服务系统瘫痪不可用。
服务可用
库存服务挂掉
服务挂掉导致下订单服务挂掉
最后导致用户服务也挂掉

常用的容错方案:

1、超时,设置较短的超时时间,调用不成功很短时间内释放线程,避免大量线程堵塞等待,导致服务快速失败;
2、限流,超过设置的阈值就拒绝,比如该服务的QPS是5000,那么就可以设置限流阈值为4800;
3、仓壁保护,就是将一艘船的船舱划分为多个船舱,某个船舱进行不会影响其他;
4、熔断器(断路器),Spring Cloud Hystrix

什么是Sentinel?

  微服务之间相互依赖,当服务A出现响应时间过长,影响到服务B的相应,从而产生连锁反应,甚至影响整个依赖链上的所有服务,这是分布式、微服务开发不可避免的问题,Sentinel以流量控制、熔断降级、系统负载保护等多个维度保护系统的稳定性。

A lightweight powerful flow control component enabling reliability and monitoring for microservices. 轻量级的流量控制、熔断降级Java 组件,是分布式系统的流量防卫兵;

GitHub地址:https://github.com/alibaba/Sentinel

Sentinel主要由两部分组成:

1、核心库(Java客户端):1、Sentinel的核心库不依赖任何第三方框架/库,能够运行于所有 Java环境,同时对 Dubbo / SpringBoot / Spring Cloud 等框架也有很好的支持;
2、控制台(Dashboard)基于SpringBoot开发,打包后直接运行,不需要额外的Tomcat等应用容器;

Sentinel Dashboard管控台:

  Sentinel Dashboard(Sentinel控制台):是基于SpringBoot开发,是一个独立的应用,打包后可以直接通过,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。

Sentinel Dashboard包下载地址:https://github.com/alibaba/Sentinel/releases
市容如下命令启动编译后的控制台:

#Linux服务器上
java -jar sentinel-dashboard-1.7.2.jar

#Windows电脑上
java -jar .\sentinel-dashboard-1.7.2.jar

启动成功端口默认8080之后访问如下所示:
Sentinel管控台
登录账号,默认用户名密码都是 sentinel
Sentinel Dashboard管控台

Spring Cloud Alibaba Sentinel进行容错限流以及流控规则

1、添加依赖

<!--spring-cloud-starter-alibaba-sentinel在Spring cloud alibaba里面已经集成可不导入-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!--spring-boot-starter-actuator springBoot监控端点-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置文件

#指定sentinel-dashboard控制台的连接地址
spring.cloud.sentinel.transport.dashboard=localhost:8080

3、可以通过访问http://{微服务注册的ip地址}:8719/api接口查看微服务暴露给Sentinel控制台调用的API列表;比如访问:http://localhost:8719/api
查看API列表
4、访问接口:http://localhost:8082/notFound-feign查看Sentinel实时监控
http://localhost:8082/notFound-feign
服务实时监控

Spring Cloud Alibaba Sentinel实现流控、降级、热点等自定义返回结果:

/**
 * 自定义限流降级错误信息
 * 也可以请求转发或者重定向其他页面
 */
@Slf4j
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        log.info("UrlBlockHandler.....................................");
        RestObject restObject = null;

        // 不同的异常返回不同的提示语
        if (e instanceof FlowException) {
            restObject = RestObject.builder().statusCode(100).statusMessage("接口限流了").build();

        } else if (e instanceof DegradeException) {
            restObject = RestObject.builder().statusCode(101).statusMessage("服务降级了").build();

        } else if (e instanceof ParamFlowException) {
            restObject = RestObject.builder().statusCode(102).statusMessage("热点参数限流了").build();

        } else if (e instanceof SystemBlockException) {
            restObject = RestObject.builder().statusCode(103).statusMessage("触发系统保护规则").build();

        } else if (e instanceof AuthorityException) {
            restObject = RestObject.builder().statusCode(104).statusMessage("授权规则不通过").build();
        }

        //返回json数据
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        //springmvc 的一个json转换类 (jackson)
        new ObjectMapper().writeValue(response.getWriter(), restObject);

        //跳转
        //request.getRequestDispatcher("/index.jsp").forward(request, response);

        //重定向
        //response.sendRedirect("http://www.baidu.com");
    }

此上这种Sentinel自定义流控等返回信息就有点类似Spring Cloud当中的Hystrix(熔断器)

Sentinel流控规则:

流控规则
针对上图作出如下解释:
  资源名:一般是我们的请求路径即要监控的路径
  针对来源:调用来源,默认是default表示所有应用
  阈值来源:分为QPS和线程数
  单机阈值:单个节点的QPS数量和线程数
  是否集群:被请求的服务是否集群配置
  流控模式:
    直接:就是直接对该资源进行控制
    关联:关联某一个资源/test2,被关联的资源阈值达到设定的单机阈值,则限制当前资源的访问
流控模式下的关联
    链路:记录指定链路上的流量
流控模式下的链路
注意:流控效果只是针对阈值类型为:QPS
  流控效果:
    快速失败:达到阈值直接限制
    Warm Up:根据coldFactor(默认为3)的值,从阈值/coldFactor经过预热的时长,才达到设置的QPS值,比如设置QPS的值设置为300,那么300/3=100,用100作为最初的阈值,然后再预热所设置的时间内到达300再开始限流
Warm Up预热时长
    排队等待:在QPS达到阈值之后,后续的请求就等待直到超时,可以适用于突发流量的请求
排队等待达到阈值后续请求超时适用于突发流量请求

注意:我们以下就针对QPS和线程数测试流控规则

  针对该/notFound-feign接口的QPS阈值为5的快速失败测试:

QPS阈值为5快速失败模式
限流了

  针对该/test2接口的QPS阈值为5的关联资源/notFound-feign快速失败测试:

QPS阈值为5关联资源快速失败模式
  用一个测试类去访问/notFound-feign让阈值达到5在访问/test2就会限流:

public class Test {
    public static void main(String[] args)  {
        ExecutorService executorService = Executors.newFixedThreadPool(16);
        RestTemplate restTemplate = new RestTemplate();
        while (true) {
            try {
                executorService.submit(() -> {
                    String ss = restTemplate.getForObject("http://localhost:8082/notFound-feign", String.class);
                    System.out.println(ss);
                });
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

/test2关联资源/notFound-feign达到阈值限流

  针对该/notFound-feign接口的QPS阈值为5的链路入口资源快速失败测试(在该入口资源下的该路径请求达到阈值就会触发限流):

入口资源
流控规则链路模式入口资源图
限流了

  针对该/notFound-feign接口的线程数阈值为20快速失败测试:

线程数阈值为20的快速失败测试
使用Apache Jmeter进行测压测试:
穿件一个线程组
新增http请求默认值
添加要压测的http请求
响应数据限流了

  以上就是Spring Cloud Alibaba Sentinel入门级别了解介绍以及Sentinel流控规则的介绍和使用,后续还有更精彩的降级规则、热点规则、系统规则、授权规则,让我们一起来领略Spring Cloud Alibaba Sentinel针对分布式系统稳定性等功能实现的魅力所在!!! 欢迎大家一起讨论交流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值