【微服务】【Sentinel】基础介绍

发布于:2025-02-11 ⋅ 阅读:(57) ⋅ 点赞:(0)

一、Sentinel简介

Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html

1. 使用背景

在微服务系统中存在雪崩问题。为了解决雪崩问题出现了微服务保护组件-Sentinel。

什么是雪崩问题?

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

雪崩问题的形成演示:
雪崩问题演示

  1. 在某个微服务系统中,服务A依赖服务D。
  2. 在某一时刻服务D故障,导致服务A调用服务D的请求无法及时返回。
  3. 随着时间的积累,服务A的tomcat连接数被故障的请求占满,最终导致服务A也不可用。
  4. 以此类推,导致微服务系统中此链路的所有服务都不可用,形成雪崩。

2. 解决方案

为了解决雪崩问题,有四种方案:

  • 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。
  • 舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
  • 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
  • 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。

3. 服务保护技术对比

Sentinel和Hystrix都是微服务保护组件,实现了上面的方案。

下面是这两种技术的对比 :

在这里插入图片描述

4. 安装 Sentinel 控制台

【微服务】【Sentinel】安装Sentinel

5. 微服务整合Sentinel

  1. 引入依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. 修改配置文件
    sentinel:
      transport:
        dashboard: localhost:8080
  1. 访问微服务的任意接口,触发Sentinel监控

    我这里有个/test的接口
    在这里插入图片描述
    在浏览器调用后,再查看sentinel控制台,就可以看到
    在这里插入图片描述

二、流控规则

在添加流控规则前,需要明白簇点链路、资源在Sentinel指代的什么?

簇点链路就是项目内的调用链路,链路中被监控的每个接口就是一个资源。后续我们就是对这些资源添加流控规则。

默认情况下Sentinel会监控SpringMVC的每一个端点,也就是Controller中的接口都会被Sentinel当做资源。

除了Controller下的,也可以使用注解@SentinelResource("资源名")将方法标记为资源,让sentinel来监控。

例如 : 我的项目中有这样一个调用链路,有两个资源 /testservice方法
在这里插入图片描述
在sentinel控制台中,以树状视图展示为:
在这里插入图片描述

2. 流控规则

现在我要给/test接口添加流控规则,

可以点击进入侧边栏中的簇点链路,找到你要添加流控规则的接口,通过后面的流控按钮添加流控规则。
在这里插入图片描述
操作非常简单,包括后面要讲的熔断规则、热点规则、授权规则都是如此添加,我就不啰嗦了。

下面先看看流控规则都要配置哪些东西?

资源名: 要给哪个接口添加流控规则

针对来源: 值有三种,default、other

阈值类型:

单机阈值:

是否集群:

流控模式: 直接、关联、链路

流控效果: 快速失败、Warm Up、排队等待

流控有三种模式:直接、关联、链路。

2.1 直接模式

直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式。

例如:下面给’‘/test’'资源添加流控规则,每秒最多只能请求5次,超过的部分直接失败。
在这里插入图片描述

2.2 关联模式

关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。

例如:shenma-admin服务中有两个资源 /update /query,这里认为/update操作比/query操作更重要,要优先保证/update。因此给/query设置关联模式的流控,当/update请求数达到阈值后要限制/query的操作,将资源优先给/update请求。
在这里插入图片描述
在这里插入图片描述
:这两个请求必须在一个服务中。sentinel是无法跨服务进行流控的,其中针对来源的配置不是写成另一个服务名就会生效的,针对来源配置的说明

2.3 链路模式

链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流。

例如: 这里访问service的方法就有两条链路。
在这里插入图片描述

注意:需要在配置文件中增加web-context-unify: false,关闭将SpringMVC作为统一的根节点,
这样不同的链路才区分开。
在这里插入图片描述

查看控制台

在这里插入图片描述

这里两条链路中都有"service方法"资源,给其中的任意一个添加即可,因为它们是同一个。
树状视图为了显示出调用关系,展示成两个;也可以切换为列表试图就可以看到service方法只有一个
在这里插入图片描述
添加流控规则:
在这里插入图片描述

3. 流控效果

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:快速失败Warm Up排队等待

在这里插入图片描述

3.1 快速失败

达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

3.2 Warm Up

Warm Up也叫预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值

预热模式是服务冷启动的一种方案。请求阈值初始值threshold / coldFactor(最大阈值/冷启动因子),持续指定时长后,逐渐提高到threshold值。而coldFactor的默认值是3.

例如: 下面的流控配置,初始阈值是10/3 就是3,10秒预热时长后阈值达到最大10。
在这里插入图片描述

3.3 排队等待

当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
在这里插入图片描述
在这里插入图片描述

3. 热点参数限流

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

有这样一个接口

在这里插入图片描述
添加热点规则
在这里插入图片描述

注意事项

  • 资源名要避免重复,sentinel没有做限制,重复了程序也不会报错。

参考资料:

https://www.bilibili.com/video/BV1ou411a75C/?spm_id_from=333.337.search-card.all.click&vd_source=2ff628f5c812d7a3a5d93833fb99badf

三、熔断规则

四、热点规则

五、授权规则

参考资料:

https://www.bilibili.com/video/BV1ou411a75C/?spm_id_from=333.337.search-card.all.click&vd_source=2ff628f5c812d7a3a5d93833fb99badf


网站公告

今日签到

点亮在社区的每一天
去签到