Sentinel分布式系统的流量防卫兵

一、Sentinel概述

服务雪崩:在调用链路中某个服务因为执行超时,异常等现象导致自身服务服务不可用 级联导致上游服务不可用 并将这种不可用逐渐放大最后导致整个系统中微服务均不可用。

什么是Sentinel

翻译:随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为突破口,在流量控制、断路、负载保护等多个领域进行工作,保障服务可靠性。

通俗:用来在微服务系统中保护微服务的作用,如何解决服务雪崩,服务熔断,服务降级的问题。就是用来替换hystrix。

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

二、Sentinel安装

  • 下载sentinel-dashboard-1.7.2

  • 启动

     下载后是一个jar包,可以通过Java -jar方式运行,默认端口为8080
     java -Dserver.port=9090 -jar sentinel-dashboard-1.7.2.jar
    Sentinel分布式系统的流量防卫兵
    img
  • 访问web界面

    http://localhost:9090/#/login

    Sentinel分布式系统的流量防卫兵
    img
  • 登录

    用户名&密码:sentinel

    Sentinel分布式系统的流量防卫兵
    img

    进入sentinel控制台,发现没有菜单,那么我们需要设置对某个服务进行流量监控

三、Sentinel实时监控服务

  • 引入sentinel依赖

    对某个服务进行监控,那么就在这个服务中进入sentinel依赖

     <!--引入sentinel依赖-->
     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
     </dependency>
  • 配置

     # 开启sentinel  默认开启
    spring.cloud.sentinel.enabled=true
    # 连接dashboard
    spring.cloud.sentinel.transport.dashboard=localhost:9090
    # 与dashboard通信的端口 固定默认端口
    spring.cloud.sentinel.transport.port=8719
  • 启动服务

    访问dashboard界面查看服务监控,发现界面什么都没有,默认情况下sentinel为延迟加载,不会在启动之后立即创建服务监控,需要对服务调用时才会初始化

  • 调用服务

    http://localhost:8091/coding-order/order

  • 查看监控界面

    Sentinel分布式系统的流量防卫兵

四、Sentinel流量控制

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

  • 设置流量控制

    设置的为/order接口每秒中只能被请求10次

    Sentinel分布式系统的流量防卫兵
    img
    Sentinel分布式系统的流量防卫兵
    img
  • 开启JMeter测试

    设置的线程数为每秒中15个线程

    Sentinel分布式系统的流量防卫兵
    img
    Sentinel分布式系统的流量防卫兵
    img

五、Sentinel熔断降级

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

Sentinel分布式系统的流量防卫兵

降级策略

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

SentinelResource注解

@GetMapping("/sentinel/order")
//value="sentinel_order" 这个sentinel_order就是在sentinel里面配置的资源名称
@SentinelResource(value = "sentinel_order",blockHandler = "fallBack",fallback = "fall")
public String order(int id){
    log.info("sentinel order");
    if(id<0)
        throw new RuntimeException("非法参数!!!");
}
return "sentinel order:"+id;
        }
//降级异常处理
public String fallBack(int id,BlockException e){
    if(e instanceof FlowException){
    return "当前服务已被流控! "+e.getClass().getCanonicalName();
    }
    return "当前服务已被降级处理! "+e.getClass().getCanonicalName();
    }
//异常处理
public String fall(int id){
    return "当前服务已不可用!";
    }


原文始发于微信公众号(数字游民PG):Sentinel分布式系统的流量防卫兵

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/173960.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!