快速入门微服务保护框架Sentinel

news2024/11/25 11:00:56

文章目录

  • 一、Sentinel
    • 1.1 雪崩问题
      • 1.1.1 介绍
      • 1.1.2 解决方案
    • 1.2 初识Sentinel
    • 1.3 sentinel下载和整合
    • 1.4 流量控制
      • 1.4.1 簇点链路
      • 1.4.2 Sentinel簇点链路设置
      • 1.4.3 流控规则
      • 1.4.4 热点参数限流
      • 1.4.5 隔离和降级
      • 1.4.6 授权规则

一、Sentinel

1.1 雪崩问题

1.1.1 介绍

  雪崩问题(Avalanche effect)是指在分布式系统中,一个节点的崩溃导致其它节点也跟着崩溃的一种现象。当一个节点崩溃时,由于其它节点对它的依赖关系,其它节点也会受到影响,进而导致整个系统出现故障,形成一个连锁反应。

  雪崩问题通常是由于系统中某个节点的故障导致大量请求被转移到其它节点,而这些节点由于负载过重而崩溃,进而导致整个系统不可用。雪崩问题的出现,会导致系统的可用性急剧下降,给用户带来极大的损失。

1.1.2 解决方案

常用措施:

  1. 超时处理:

  超时处理是指在系统中设置一个超时时间,当某个请求在规定时间内没有得到响应时,系统会自动将该请求取消,避免其继续占用系统资源,从而避免雪崩问题的出现。超时时间的设置应该根据系统的实际情况和性能调优进行设置,不宜设置过短或过长,以免影响系统的正常运行。

  1. 舱壁模式:

  舱壁模式是指在系统中将不同的请求隔离在不同的“舱壁”中,以避免某个请求的失败影响到其它请求。

  例如,可以将不同的请求分配到不同的线程池中,避免某个请求的失败导致整个线程池崩溃。舱壁模式也可以应用于不同的服务之间,例如将不同的服务部署在不同的服务器上,避免某个服务的故障影响到其它服务的正常运行。

  1. 熔断降级

  熔断降级是指在系统中设置一个阈值,当某个服务的错误率或响应时间超过阈值时,系统会自动关闭该服务的访问,避免其继续向下游传递错误请求。熔断降级可以避免错误请求的扩散,保证整个系统的稳定性和可用性。当服务恢复正常后,系统会自动重新开启该服务的访问。

  1. 流量控制

  流量控制是指在系统中对请求进行限流,避免请求过多而导致系统负载过重。常见的流量控制方式包括:令牌桶算法、漏桶算法等。限流可以避免请求的扩散,保护系统的稳定性和可用性。

1.2 初识Sentinel

  Sentinel是一个由阿里巴巴开源的微服务框架,主要用于解决分布式系统中的流量控制、熔断降级、系统负载保护等问题。Sentinel提供了实时监控、规则配置、簇点链路控制等多种功能,可以帮助用户实现系统的自我保护,提升系统的可用性和稳定性。

Sentinel的主要特点包括:

  1. 实时监控:Sentinel提供了实时监控功能,用户可以通过控制台查看应用的实时流量、熔断状态、异常比例等数据,及时发现和处理系统中出现的问题。
  2. 熔断降级:Sentinel支持基于QPS、异常比例等多种维度进行熔断降级,当系统出现异常情况时,Sentinel可以自动关闭故障节点,避免故障节点对整个系统的影响。
  3. 流量控制:Sentinel支持对流量进行精细化控制,可以通过限流、流控等方式对不同类型的请求进行区分,防止系统因为过载而崩溃。
  4. 规则配置:Sentinel提供了可视化的规则配置界面,用户可以通过控制台灵活地配置规则,根据实际情况对系统进行调整。
  5. 簇点链路保护:Sentinel支持簇点链路保护,可以对整个调用链路进行监控和控制,从而保证整个系统的稳定性和可用性。

1.3 sentinel下载和整合

  1. 下载

官网地址:Sentinel官网

  1. 运行

  将下载的jar包放置在非中文目录以免出现bug,使用java -jar命令运行:

java -jar sentinel-dashboard-xx.xx.xx.jar

  Sentinel的默认端口为8080、用户名和密码都是 sentinel ,如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:

配置项说明
server.port服务端口
sentinel.dashboard.auth.username默认用户名
sentinel.dashboard.auth.password默认密码

例如,修改端口:

java -Dserver.port=8088 -jar sentinel-dashboard-xx.xx.xx.jar

  运行成功后浏览器访问 http://localhost:8080 即可看到sentinel的控制台

  1. 在选定微服务中引入sentinel依赖
<!--引入sentinel依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 添加配置
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8080 #sentinel控制台地址
  1. 访问绑定微服务的任意接口,即可在控制台看见该服务

1.4 流量控制

1.4.1 簇点链路

  簇点链路(Cluster Linkage)是微服务架构中的一个重要概念,它是指将多个服务组织在一起形成的一个簇点(Cluster),并且这些服务之间是通过一些共同的连接点(Linkage)相互联系的。簇点链路的设计可以帮助微服务架构实现高可用性、容错性和可伸缩性。

  在簇点链路中,每个服务都是一个簇点,不同的簇点之间通过共享的连接点相互联系。连接点可以是一些共享的库、消息队列、数据库等资源,也可以是通过一些通信协议(如HTTP、RPC等)建立的网络连接。通过簇点链路的设计,可以将服务按照不同的功能模块进行组织和拆分,提高服务的灵活性和可维护性。

1.4.2 Sentinel簇点链路设置

  1. 在Sentinel控制台选中指定服务,单击簇点链路

在这里插入图片描述

  1. 在此页面操作一栏即可进行对应设置

在这里插入图片描述

  流控是Sentinel的核心功能之一,用于控制系统的并发度、QPS等,避免系统因为过载而崩溃或者响应变慢。Sentinel提供了多种流控规则,如基于QPS的流控、线程数流控、关联流控等,可以根据具体的场景选择合适的流控规则,从而实现精细化的流控策略。

  降级是指在系统出现异常情况或者超负荷的情况下,临时关闭某些功能模块,以保证系统的稳定性和可用性。Sentinel提供了基于异常比例和异常数的降级策略,可以根据异常情况对服务进行自动降级,避免异常向下游扩散。

  热点是指在分布式系统中,某些资源的访问频率非常高,容易导致系统瓶颈和性能问题。Sentinel提供了热点参数流控功能,可以根据某些参数的访问频率进行流控,避免因为热点资源导致系统崩溃。

  授权是指对服务的访问进行授权管理,确保只有合法的用户或服务可以访问某些资源。Sentinel提供了基于黑白名单的授权管理功能,可以对服务进行精细的授权管理,保证系统的安全性和可靠性。

  1. 以流控为例,单击即弹出下图界面,编辑完毕点击新增即可新增流控规则

在这里插入图片描述

1.4.3 流控规则

  1. 流控模式:
三种 流控模式

流控模式介绍
直接直接模式是指流量控制规则仅对当前资源生效,不会对其他资源产生影响。这种模式适用于独立的资源,可以实现精确的流量控制和限流。
关联关联模式是指流量控制规则对当前资源及其关联的资源生效,可以控制一组相关的资源的流量。关联模式适用于一组相关的资源,如同一个业务功能模块中的多个资源,可以将它们组织在一起进行流量控制。
链路链路模式是指流量控制规则对当前资源及其下游资源生效,可以控制整个调用链路的流量。链路模式适用于分布式系统中的微服务调用链路,可以实现对整个调用链路的流量控制和限流。
  1. 流控效果
三种 流控效果

流控模式介绍
快速失败快速失败(快速失败模式)是指当达到流控阈值时,请求会直接失败,不再等待资源处理。这种模式可以快速释放系统资源,但可能会影响用户体验。快速失败模式适用于对响应时间要求较高的场景。
warm upWarm Up(预热模式)是指当系统负载过高时,对流量进行预热,逐渐增加资源的处理能力,以避免因为短时间内大量请求而导致的系统瓶颈和性能问题。在Warm Up模式下,当资源被流控后,Sentinel会逐渐增加资源的处理能力,使得资源能够逐渐恢复正常的请求处理能力,避免请求直接失败。
排队等待排队等待(排队等待模式)是指当系统负载过高时,对请求进行排队等待,以避免资源直接被拒绝。在排队等待模式下,当资源被流控后,请求会进入队列等待处理,直到队列中的请求得到资源的处理能力后,才会得到处理。这种模式可以保证请求的处理能力,但可能会增加系统的响应时间。

1.4.4 热点参数限流

  热点参数限流是一种流量控制方式,它通过对系统中的热点参数进行限流,来保护系统的稳定性和可用性。热点参数通常指的是在系统中频繁出现的参数,例如用户ID、商品ID等。由于这些参数的访问频率较高,如果没有进行限流,可能会导致系统瓶颈和性能问题。

  在Sentinel中,可以通过定义热点参数规则来对热点参数进行限流。热点参数规则可以根据热点参数的名称或者位置(在参数列表中的位置)进行匹配,然后对满足条件的请求进行限流处理。对于热点参数,可以配置限流阈值、限流模式(快速失败、Warm Up、排队等待)以及限流处理器等信息。

  热点参数限流的原理是通过统计热点参数的QPS(每秒钟处理的请求次数),当QPS超过限流阈值时,就触发限流处理。在限流处理期间,可以采用快速失败、Warm Up、排队等待等限流模式进行流量控制,保护系统的稳定性和可用性。

注:在配置热点参数限流的时候需要在代码中对对应请求添加@SentinelResource注解;

1.4.5 隔离和降级

  线程隔离和熔断降级是分布式系统中常用的两种保护机制,用于保护系统的稳定性和可用性。

  1. 线程隔离:

  线程隔离是指将不同类型的请求或不同的业务逻辑隔离开来,避免相互之间的影响,提高系统的可用性和稳定性。在Sentinel中,可以通过线程池隔离、信号量隔离等方式对请求进行隔离处理,避免不同类型的请求相互影响。例如,将耗时的操作放在一个独立的线程池中进行处理,可以避免请求相互影响,提高系统的稳定性和可用性。

  线程隔离的实现方式主要有两种,分别是线程池隔离和信号量隔离:

  ( 1 )线程池隔离是指将不同类型的请求放置在不同的线程池中进行处理,避免请求之间相互影响。在Sentinel中,线程池隔离可以通过使用不同的线程池来对请求进行隔离。例如,可以定义一个用于处理CPU密集型任务的线程池,另一个用于处理IO密集型任务的线程池,以此来避免不同类型的请求相互影响。

优点:

  • 线程池隔离可以避免不同类型的请求之间相互影响,提高系统的可用性和稳定性。
  • 线程池隔离可以通过不同的线程池来优化系统的资源使用,例如可以定义一个用于处理CPU密集型任务的线程池,另一个用于处理IO密集型任务的线程池。
  • 线程池隔离可以在不同的线程中进行资源隔离,以避免线程间的相互影响,提高系统的稳定性和可用性。

缺点:

  • 线程池隔离需要创建不同的线程池来处理不同类型的请求,这会增加系统的开销。
  • 线程池隔离可能会导致线程资源浪费,例如某些线程池可能会被闲置,而另一些线程池可能会被频繁使用。

  ( 2 )信号量隔离是指通过定义不同的信号量,来限制并发请求的数量,避免请求之间相互竞争,提高系统的可用性和稳定性。在Sentinel中,信号量隔离可以通过定义不同的信号量规则,来对请求进行隔离处理。例如,可以定义一个最大并发数为10的信号量规则,限制同时处理的请求数量,以此来避免请求之间相互竞争。

优点:

  • 信号量隔离可以限制并发请求的数量,避免请求之间相互竞争,提高系统的可用性和稳定性。
  • 信号量隔离可以灵活地控制系统的资源使用,例如可以设置不同的最大并发数来适应不同的业务场景。
  • 信号量隔离可以实现细粒度的请求隔离,可以根据具体的请求类型或者请求来源进行隔离。

缺点:

  • 信号量隔离可能会导致请求排队等待,增加请求的响应时间。
  • 信号量隔离可能会因为过度限制并发数,导致系统处理能力下降。
  1. 熔断降级:

  熔断降级是指在系统出现异常情况或者超出处理能力时,临时关闭一些不必要的服务或功能,保证系统的核心服务能够继续正常运行。在Sentinel中,可以通过定义降级规则,对系统中的服务进行降级处理,例如在系统出现异常情况时,可以临时关闭一些不必要的服务,保证核心服务的正常运行。降级处理可以有效地避免系统崩溃或者无法正常处理请求的情况,提高系统的可用性和稳定性。

在Sentinel中,断路器熔断策略主要分为三种:

  • 慢调用比例策略:当一段时间内请求的响应时间超过一定阈值时,触发熔断机制。这种策略适用于系统中存在慢调用的情况,可以避免慢调用对整个系统的影响。
  • 异常比例策略:当一段时间内异常请求的比例超过一定阈值时,触发熔断机制。这种策略适用于系统中存在异常请求的情况,可以避免异常请求对整个系统的影响。
  • 异常数策略:当一段时间内异常请求的数量超过一定阈值时,触发熔断机制。这种策略适用于系统中异常请求的数量比例较小的情况,可以有效避免异常请求对整个系统的影响。
  1. http客户端整合Sentinel(以feign为例):

  2. 在服务内添加配置

feign:
  sentinel:
    enabled: true #开启fegin对sentinel的支持
  1. 在feign新建一个类实现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();
            }
        };
    }
}
  1. 在feign配置类添加实现FallbackFactory接口的bean
@Bean
public UserClientFallbackFactory userClientFallbackFactory(){
    return new UserClientFallbackFactory();
}
  1. 在feign客户端添加fallbackFactory属性
@FeignClient(value = "userservice",fallbackFactory = UserClientFallbackFactory.class)

1.4.6 授权规则

  在Sentinel中,授权规则可以用来限制用户或服务调用者的访问权限,以保障系统的安全性。授权规则通常基于调用来源、调用参数或者调用内容等维度进行限制。

  授权规则的具体实现可以采用黑名单或白名单的方式,即允许或禁止某些调用者或参数访问特定的资源。

  • 黑名单是一种禁止访问的授权规则,即列出不允许访问某个资源的调用者或者参数。对于黑名单中列出的调用者或参数,系统将禁止其访问被保护的资源。

  • 白名单则是一种允许访问的授权规则,即列出允许访问某个资源的调用者或者参数。对于不在白名单中的调用者或参数,系统将禁止其访问被保护的资源。

  1. 获取请求头逻辑
@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        //1.获取请求头
        String origin = request.getHeader("origin");
        //2.非空判断
        if(StringUtils.isEmpty(origin)){
            //如果为空设置默认值
            origin = "xxx";
        }
        return origin;
    }
}
  1. 通过配置文件添加请求体
spring:
  cloud:
    gateway:
      default-filters:
        - AddRequestHeader=origin,XXXX # XXXX为自定义值
  1. 通过实现BlockExceptionHandler设置自定义授权规则
@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 + "}");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掌握了这些,才算真正了解C语言数组

也许你认为&#xff0c;C语言中的数组非常好理解&#xff0c;就是把一组相同类型的元素存储在同一块空间里。但是你可能并没有真正理解数组的本质&#xff0c;不信的话请回答一下下面的几个小问题&#xff0c;如果你能非常清晰的回答这些问题&#xff0c;那么你对C语言中的数组…

TF-IDF (BigData, Data Mining)

TF-IDF&#xff08;term frequency–inverse document frequency&#xff09;是一种用于信息检索与数据挖掘的常用加权技术。 TF是词频(Term Frequency)&#xff0c; IDF是逆文本频率指数(Inverse Document Frequency)。 简介 TF-IDF是一种统计方法&#xff0c;用以评估一字词…

【国际象棋】棋盘游戏-微信小程序开发流程详解

与中国象棋类似的&#xff0c;还有国际象棋&#xff0c;知道有人爱玩&#xff0c;于是凭着好奇心&#xff0c;网上研究了一下&#xff0c;跟中国象棋有相似之处&#xff0c;玩法是有些许不一样&#xff0c;不知道象棋最早出于谁之手呢&#xff0c;抽空做一做&#xff0c;最终完…

倾斜摄影超大场景的三维模型的顶层合并,提升模型在WEB三维展示效果

倾斜摄影超大场景的三维模型的顶层合并&#xff0c;提升模型在WEB三维展示效果 倾斜摄影超大场景的三维模型的顶层合并后&#xff0c;可以采取以下措施来提升模型在WEB三维展示效果&#xff1a; 1、优化模型数据&#xff1a;对于倾斜摄影超大场景的三维模型&#xff0c;需要进…

网络安全:namp扫描工具

-sP可以扫描一个网段ip以及状态和基本信息&#xff0c;10.1.1.2-3就是扫描2和3这两个ip的主机 -p可以扫描指定ip对应主机的端口号&#xff0c;可以是一个范围 nmap简单扫描&#xff1a;nmap 地址 检查地址是否在线以及open的端口号 在端口开放&#xff0c;不一定可以与对方正常…

数据库之事务隔离级别详解

事务隔离级别详解 一、事务的四大特性&#xff08;ACID&#xff09;1. 原子性(atomicity)&#xff1a;2. 一致性(consistency)&#xff1a;3. 隔离性(isolation)&#xff1a;4. 持久性(durability)&#xff1a; 二、事务的四种隔离级别1. 读未提交(Read uncommitted)&#xff1…

WSL怎么使用本机进行代理联网

文章目录 WSL怎么使用本机代理进行联网问题来源设置v2rayN设置wsl总结参考 WSL怎么使用本机代理进行联网 问题来源 使用WSL克隆github的代码网速很慢&#xff0c;无响应&#xff0c;导致项目无法下载&#xff0c;真的愁人。就想到为WSL设置xx上网&#xff0c;是否就会好很多。…

Photoshop如何使用文字之实例演示?

文章目录 0.引言1.给图像素材添加透明水印2.创建路径文字3.创建每日一签海报4.给图像添加复杂水印5.制作个人简历模板 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行学…

React | React组件化开发

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ React .js专栏&#xff1a;React .js React组件化开发 &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React Node…

不良条件视觉感知专栏(一)任务前言

前言 随着深度学习的流行&#xff0c;CNN的强大特征学习能力给计算机视觉领域带来了巨大的提升。2D/3D目标检测、语义分割是常见的视觉感知任务&#xff0c;本专栏我们将围绕着它们展开阐述。 本教程禁止转载。同时&#xff0c;本教程来自知识星球【CV技术指南】更多技术教程&…

Photoshop如何使用图像调色之实例演示?

文章目录 0.引言1.将一张偏冷调的图像调整成暖调2.将图像调整成不同季节色彩倾向3.变换花朵的颜色4.创建人像轮廓风景5.修饰蓝天白云6.调换花草颜色 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其配…

【经典论文解读】YOLACT 实例分割(YOLOv5、YOLOv8实例分割的基础)

前言 YOLACT是经典的单阶段、实时、实例分割方法&#xff0c;在YOLOv5和YOLOv8中的实例分割&#xff0c;也是基于 YOLACT实现的&#xff0c;有必要理解一下它的模型结构和设计思路。 论文&#xff1a;YOLACT: Real-time Instance Segmentation 开源地址&#xff1a;https://gi…

01-Shiro550漏洞流程

1. 漏洞原理 Apache Shiro框架提供了记住密码的功能&#xff08;RememberMe&#xff09;&#xff0c;用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值&#xff0c;先base64解码然后AES解密再反序列化&#xff0c;就导致了反序列化RCE漏洞。 那么…

hadoop伪分布式搭建教程

官方参数文档 Apache Hadoop 3.3.5 – HDFS Users Guide Hadoop是一个分布式存储和计算框架&#xff0c;由以下几个组件组成&#xff1a; 1. Hadoop Distributed File System (HDFS)&#xff1a;Hadoop分布式文件系统&#xff0c;用于存储大量数据&#xff0c;并提供高可靠性和…

Spring源码:动态代理的增强顺序(AOP与事务的先后)

前文&#xff1a; 《Spring AOP源码&#xff1a;开启注解读取》 《Spring AOP源码2&#xff1a;查找增强器》 《Spring AOP源码3&#xff1a;实现代理》 《Spring事务源码&#xff1a;创建代理类》 《Spring事务源码&#xff1a;事务创建》 《Spring事务源码&#xff1a;…

(05)基础强化:字符串拘留池,格式化,StringBuilder,垃圾回收,弱引用

一、复习 1.什么是接口&#xff1f;说说你对接口的理解。 &#xff08;提示&#xff1a;概念、语法、应用场景&#xff0c;与抽象类的区别。说出最特别的&#xff09; 接口是一种规范、标准&#xff0c;一种抽象的概念&#xff0c;所以本身无法实现&#…

Redis基础——Java客户端Jedis

2.1.Jedis客户端 Jedis的官网地址&#xff1a; https://github.com/redis/jedis 2.1.1.快速入门 我们先来个快速入门&#xff1a; 1&#xff09;引入依赖&#xff1a; <!--jedis--> <dependency><groupId>redis.clients</groupId><artifactId&…

山东专升本计算机第九章-信息安全

信息安全 计算机病毒 考点 4病毒的定义与特点 定义 • 一组人为设计的程序满足一定条件即被激活 特点 • 可执行性 • 破坏性 • 占用系统资源 • 破坏或删除程序或数据文件 • 传染性 • 潜伏性 • 隐蔽性 • 针对性 • 宏病毒只感染docx • 衍生性 • 抗反病毒软…

102-Linux_I/O复用方法之poll

文章目录 1.poll系统调用的作用2.poll的原型3.poll支持的事件类型4.poll实现TCP服务器(1)服务器端代码:(2)客户端代码:(3)运行结果截图: 1.poll系统调用的作用 poll 系统调用和 select 类似&#xff0c;也是在指定时间内轮询一定数量的文件描述符&#xff0c;以测试其中是否有…