【SpringCloud——Sentinel】

这篇具有很好参考价值的文章主要介绍了【SpringCloud——Sentinel】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是雪崩?

微服务调用链路中的某个服务发生故障,引起整个链路中的所有微服务都不可用,这就是雪崩。

【SpringCloud——Sentinel】

 二、解决雪崩问题的常见措施

1、超时处理

设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。

【SpringCloud——Sentinel】

 弊端:假设等待时间为1s,但是每秒钟传递过来的请求为2个,迟早有一天,线程数量也会填满整个tomcat服务器。

2、舱壁模式

限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

【SpringCloud——Sentinel】

3、熔断降级

由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。

【SpringCloud——Sentinel】

 假设上层服务调用了三次下层服务,其中两次都调用失败,那么此时的异常比例就为百分之66,此时就熔断对下层服务的访问,一切访问下层服务的请求都将被立即拦截。

4、流量控制

限制业务访问的QPS,避免服务因流量的突增而故障。主要针对高并发场景下进行流量控制,假设某服务处理请求的效率为每秒2个,当某一时刻大量的请求涌入时,就会控制请求的传递效率,保证服务的正常运行,否则该服务将被大量请求直接拖垮。

【SpringCloud——Sentinel】

 5、总结

 三、Sentinel与SpringCloud整合

1、引入依赖

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

2、配置连接

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 #sentinel控制台地址

四、限流规则

1、如何设置流量控制?

在学习如何设置流量控制前,我们先了解什么是簇点链路:

簇点链路就是项目内的调用链路,链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。

【SpringCloud——Sentinel】 简单点来说,就是Controller层当中的各个请求接口。

 下面我们来看看如何设置单个接口的流量控制:

【SpringCloud——Sentinel】

 【SpringCloud——Sentinel】

 2、流量控制模式

在添加限流规则时,点击高级选项,可以选择三种流控模式:

  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

【SpringCloud——Sentinel】

①、关联模式

使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

模拟案例:

代码:

    @GetMapping("/query")
    public String queryOrder(){
        return "查询订单成功";
    }

    @GetMapping("/update")
    public String updateOrder(){
        return "更新订单成功";
    }

sentinel控制台:

【SpringCloud——Sentinel】

对谁进行限流就 设置谁的流量控制!

【SpringCloud——Sentinel】

 这个配置的意思就是说,当update的QPS触发阈值时,此时就限制对query的访问,即拦截。这么做的目的就在于优先执行订单修改服务。

【SpringCloud——Sentinel】

 此处update和query就针对数据库的锁产生了竞争,即读的时候不可以修改,修改的时候也不可以读,因此,则设置优先执行写操作,而限制读操作的进行。

②、链路模式

       链路模式常常用于对资源的一种分配,比如有一个服务A同时被服务B和服务C调用,服务A处理请求的能力有限(每秒处理6条),并不能同时处理B和C同一时刻传递过来的请求(每秒各4条,共8条),此时我们就需要对B或C的部分请求进行拦截了,具体拦截谁的,就看谁的优先级低,假设B是订单支付,C是订单查询,支付的优先级是高于查询的,因此我们就会针对服务A的请求来源服务C进行限流。

模拟案例:

【SpringCloud——Sentinel】

代码:

    @SentinelResource("goods")
    public void queryGoods(){
        System.err.println("查询商品");
    }
    @GetMapping("/save")
    public String saveOrder(){
        //查询商品
        orderService.queryGoods();
        //新增订单
        System.out.println("新增订单");
        return "新增订单成功";
    }
    @GetMapping("/query")
    public String queryOrder(){
        //查询商品
        orderService.queryGoods();
        //查询订单
        System.out.println("查询订单");
        return "查询订单成功";
    }

Sentinel控制台:

【SpringCloud——Sentinel】

针对goods服务设置链路流控:

 【SpringCloud——Sentinel】

 设置完成后,创建订单服务和查询服务同时进行,各自每秒访问4次,就可以发现,查询服务每秒只有两条请求成功了,其余两条则会被sentinel拦截。

注意:创建订单服务和查询订单服务并没有竞争关系,链路模式是出于对代码可靠性的一种保护措施,防止服务压力过大导致的宕机。

3、流控效果

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

  • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
  • warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
  • 排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长

【SpringCloud——Sentinel】

①、warm up

warm up也叫预热模式,是应对服务冷启动的一种方案。

请求阈值初始值是 threshold (最大阈值)/ coldFactor,持续指定时长后,逐渐提高到threshold值。而coldFactor的默认值是3.

例如,我设置QPS的threshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.

【SpringCloud——Sentinel】

 【SpringCloud——Sentinel】

 假设我们每秒的访问量为10,在起初的1s内,会有3条请求响应成功,其余的都会被sentinel拦截了,在接下来的4s内,阈值会逐步增大,逐渐增大到10,在未增大到10时,部分请求仍然会被拦截。

②、排队等待

【SpringCloud——Sentinel】

模拟案例:

给/order/{orderId}这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s

【SpringCloud——Sentinel】

 计算:

我们假设每秒有15个请求到达该服务,此处的单机阈值为10,即可以假设每个请求的处理时间为100ms,则每秒钟就会有5个请求放到队列当中,当到第十秒时,队列当中的请求就会放满,此时,再来的请求就有可能会被直接拦截。

③、总结 

【SpringCloud——Sentinel】

 4、热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

【SpringCloud——Sentinel】

 热点参数限流即限制对热点参数的访问,限制其控制在一个特定值范围内,防止大量相同请求访问同一资源。

五、隔离和降级

1、FeignClient整合Sentinel

SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。

①、修改OrderService的application.yml文件,开启Feign的Sentinel功能

feign:
  httpclient:
    enabled: true #支持httpClient的开关
    max-connections: 200 #最大连接数
    max-connections-per-route: 50 #单个请求路径的最大连接数
  sentinel:
    enabled: true #开启feign对sentinel的支持

②、在feing-api项目中定义类,实现FallbackFactory

@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {

    @Override
    public UserClient create(Throwable throwable) {
        return new UserClient() {
            @Override
            public User findById(Long id) {
                log.error("查询用户异常",throwable);
                return new User();
            }
        };
    }
}

③、在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean

    @Bean
    public UserClientFallbackFactory userClientFallbackFactory(){
        return new UserClientFallbackFactory();
    }

④、在feing-api项目中的UserClient接口中使用UserClientFallbackFactory

@FeignClient(value = "userservice",
        configuration = DefaultFeignConfiguration.class,
        fallbackFactory = UserClientFallbackFactory.class)//只针对userservice服务有效 全局有效在启动类的注解当中配置即可
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

2、线程隔离(舱壁模式)

线程隔离有两种方式:

  • 线程池隔离
  • 信号量隔离(Sentinel默认方式)

【SpringCloud——Sentinel】

 【SpringCloud——Sentinel】

 

 在添加限流规则时,可以选择两种阈值类型:

【SpringCloud——Sentinel】 

3、熔断降级

        熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

【SpringCloud——Sentinel】 断路器熔断策略有三种:慢调用、异常比例、异常数。

        if (id == 1){
            Thread.sleep(60);
        }else if (id == 2){
            throw new RuntimeException("故意出错,触发熔断");
        }

①、慢调用

        业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

【SpringCloud——Sentinel】

 解读:RT超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

②、异常比例或异常数

异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。

【SpringCloud——Sentinel】

 【SpringCloud——Sentinel】

 解读:统计最近1000ms内的请求,如果请求量超过10次,并且异常比例不低于0.5,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行一次请求做测试。

六、授权规则和规则持久化

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

 案例:限定只允许从网关来的请求访问order-service,那么流控应用中就填写网关的名称。

①、网关过滤器添加请求头

        - AddRequestHeader=Origin,gateway

②、Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。

实现这个接口,判断请求来源。

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        //获取请求头
        String origin = httpServletRequest.getHeader("Origin");
        //判断请求头
        if (StringUtils.isEmpty(origin)){
            origin =  "black";// 黑名单
        }
        return origin;
    }
}

③、Sentinel控制台配置授权

【SpringCloud——Sentinel】

 ④、测试

http://localhost:10010/order/101?authorization=admin
http://localhost:8010/order/101

【SpringCloud——Sentinel】

 【SpringCloud——Sentinel】

1、如何自定义异常结果

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口。

【SpringCloud——Sentinel】

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        String msg = "未知异常";
        int status = 429;

        if (e instanceof FlowException) {
            msg = "请求被限流了";
        } else if (e instanceof ParamFlowException) {
            msg = "请求被热点参数限流";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了";
        } else if (e instanceof AuthorityException) {
            msg = "没有权限访问";
            status = 401;
        }

        response.setContentType("application/json;charset=utf-8");
        response.setStatus(status);
        response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");
    }
}

2、规则持久化

Sentinel管理配置的三种模式:

  • 原始模式:配置信息保存在内存,服务重启则失效。
  • pull模式:保存在本地文件或者数据库,定时去读取,时效性比较差。
  • push模式:保存在nacos,监听变更实时更新。

 push模式管理配置

①、引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

②、修改order-service服务,使其监听Nacos配置中心

spring:
  application:
    name: orderservice
  profiles:
    active: dev
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 #sentinel控制台地址
      web-context-unify: false #关闭context整合
      datasource:
        flow:
          nacos:
            serverAddr: localhost:80
            dataId: orderservice-flow-rules
            groupId: SENTINEL_GROUP
            ruleType: FLOW #还可以是:degrade、authority、param-flow

③、修改Sentinel-dashboard源码,修改前端页面

详细步骤参考网上文档。文章来源地址https://www.toymoban.com/news/detail-473605.html

到了这里,关于【SpringCloud——Sentinel】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 服务链路追踪 —— SpringCloud Sleuth

    随着业务的发展,系统规模变得越来越大,微服务拆分越来越细,各微服务间的调用关系也越来越复杂。客户端请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,几平每一个请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖

    2024年02月08日
    浏览(27)
  • 【业务功能篇87】微服务-springcloud-本地缓存-redis-分布式缓存-缓存穿透-雪崩-击穿

      缓存的作用是减低对数据源的访问频率。从而提高我们系统的性能。 缓存的流程图 2.1 本地缓存   其实就是把缓存数据存储在内存中(Map String,Object ).在单体架构中肯定没有问题。 单体架构下的缓存处理 2.2 分布式缓存   在分布式环境下,我们原来的本地缓存就不是

    2024年02月10日
    浏览(45)
  • SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

    目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 1.1.1、Tips 限流, 就是指对服务器请求量做限制,避免因为突发的

    2024年01月25日
    浏览(36)
  • Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月12日
    浏览(29)
  • 微服务 springcloud 11 sleuth 链路跟踪,sleuth + zipkin 链路分析

    随着系统规模越来越大,微服务之间调用关系变得错综复杂,一条调用链路中可能调用多个微服务,任何一个微服务不可用都可能造整个调用过程失败 spring cloud sleuth 可以跟踪调用链路,分析链路中每个节点的执行情况 01.微服务中添加 spring cloud sleuth 依赖 修改以下微服务的

    2024年02月11日
    浏览(34)
  • SpringCloud Alibaba微服务-- Sentinel的使用(保姆级)

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1、sentinel的特征 丰富的应用场景 : Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突

    2024年02月16日
    浏览(29)
  • SpringCloud之Gateway整合Sentinel服务降级和限流

    1.下载Sentinel.jar可以图形界面配置限流和降级规则 地址:可能需要翻墙 下载jar文件 2.引入maven依赖 3.写个自动注入Resource的过滤器类(可以不写注解直接使用) 4.写配置文件 application.properties 5.cmd命令行启动jar文件访问localhost:18080页面,自己设置QPS java -jar -server.port=18080 sentinel-dash

    2024年02月07日
    浏览(32)
  • 【微服务】springcloud集成skywalking实现全链路追踪

    目录 一、前言 二、环境准备 2.1 软件环境 2.2 微服务模块 2.3 环境搭建

    2024年02月03日
    浏览(26)
  • 【SpringCloud】微服务保护(Sentinel)和分布式事务(Seata)

    建议学完该系列前篇 【SpringCloud】商城项目拆分微服务各个组件学习 然后再来看本文 然后学习 【RabbitMQ】交换机、队列、可靠性保证和延迟消息 在微服务远程调用的过程中,还存在几个问题需要解决。 首先是业务健壮性问题: 例如在之前的查询购物车列表业务中,购物车

    2024年01月25日
    浏览(47)
  • 【springcloud 微服务】Spring Cloud Alibaba Sentinel使用详解

    目录 一、前言 二、分布式系统遇到的问题 2.1 服务可用性问题 2.1.1  单点故障

    2024年01月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包