sentinel的使用以及springcloud整合sentinel

news2024/9/20 0:51:03

一、为什么要用到sentinel

 首先我们要知道的是一个微服务项目如果一个服务挂载掉了,会出现什么情况,是不是回出现一个服务挂载而另一个服务还需要一直调用此服务就很容易导致和它有关联的服务不能被访问到,这也就是我们常常在生活中说到的雪崩效应(因为在雪崩发生时,雪层的一小部分开始滑动,随后带动更多的雪层滑动,最终形成大规模的雪崩),所以如果我们不想到措施可以把这一部分的雪层隔离出去或者进行其他的处理就会导致大规模的系统崩溃。

大家可以根据上面的图片理解一下,服务雪崩是一个什么样子的过程

而sentinel的出现就是为了解决这一问题可以帮我们熔断服务会着帮我们服务降级等等。

在sentinel出现之前一般我们使用到的技术是Hystrix,但是Hystrix是在2020年就停止更新了,而sentinel是springcloudalibaba中使用到的组件,而且现在很多国内的公司也在使用这个组件。我们也可以看一下这两个框架的对比。

特性SentinelHystrix
语言JavaJava
流量控制支持,包括 QPS 流量控制、并发线程数控制等支持,主要通过线程池和信号量实现流量控制
熔断机制支持,提供多种熔断策略(如慢调用比例、异常比例等)支持,通过断路器模式实现,主要基于请求失败比例触发熔断
系统保护支持,可以监控系统资源(如 CPU、内存)并进行保护不支持,主要关注单个服务的熔断和流量控制
热点参数限流支持,可以针对热点参数进行限流不支持,主要关注服务级别的流量控制
集群模式支持,可以在多个服务实例之间共享流量控制和熔断状态不支持,主要在单个服务实例内部实现流量控制和熔断
配置方式支持动态规则配置,可以通过控制台实时调整支持动态规则配置,但配置方式较为复杂
监控与告警提供丰富的监控和告警功能,可以实时监控系统状态并及时通知管理员提供基本的监控功能,但告警功能不如 Sentinel 完善
集成方式易于集成,支持 Spring Cloud、Dubbo 等多种框架易于集成,主要与 Netflix 的其他组件(如 Eureka、Zuul)集成
社区支持活跃的社区支持,持续更新和优化社区支持较为有限,但有 Netflix 背书

二、sentinel的应用场景 

1.服务控流

  • 目的:控制进入特定服务的流量,防止服务因流量过大而崩溃。
  • 实现方式:通过限制每秒处理的请求数(QPS)或并发请求数来实现。例如,可以通过设置阈值来限制一个服务在特定时间内可以处理的请求数量。
  • 应用场景:在流量高峰期间,或者在服务需要维护时,通过控制流量来保护服务不被过载。

 

2.服务熔断

  • 目的:当服务出现异常(如响应时间过长或错误率过高)时,自动切断对该服务的调用,防止异常扩散到整个系统。
  • 实现方式:通过断路器模式实现。当服务的错误率或响应时间超过预设阈值时,断路器会打开,阻止进一步的请求调用,直到服务恢复正常。
  • 应用场景:在服务依赖的服务出现故障时,通过熔断机制保护主服务不受影响。

 ​​​​​​

3.服务降级

  • 目的:在服务不可用或响应时间过长时,提供备选的响应或功能,确保系统的可用性。
  • 实现方式:通过预定义的降级策略来实现。例如,当一个服务的响应时间超过设定的阈值时,系统可以返回一个默认的响应或跳转到一个降级的服务。
  • 应用场景:在服务出现故障或响应时间较长时,通过降级策略提供基本的服务,避免完全的服务中断。

4.热点参数控流

  • 目的:针对系统中的热点参数(即请求量特别大的参数)进行流量控制,防止这些参数的请求量过大影响系统性能。
  • 实现方式:通过识别和限制对特定参数的请求量来实现。例如,可以为特定的 API 参数设置请求阈值,当请求量超过这个阈值时,系统会拒绝额外的请求或进行限流。
  • 应用场景:在某些参数的请求量异常高时,通过热点参数控流来保护系统不被这些请求所影响。

三、sentinel安装以及基本使用

1.安装 

这个地方我给出 spingcloudalibaba对应组建的版本,有需要的也可以去官网再自己查看对应版本

版本发布说明 - Spring Cloud Alibaba官网 (aliyun.com)

所以我选择的版本是1.8.5

下载其实我们可以看到sentinel就是一个jar包我们可以直接用java -jar的方式启动,当然我们也可以通过-Dserver.port=8858指定端口号

java -jar sentinel-dashboard-1.8.5.jar

浏览器访问sentinel Sentinel Dashboard,初始用户名和密码均为sentinel

2.使用

 第一步:引入maven依赖到pom.xml文件中

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

 第二步:编写application.properties文件,在文件中指出sentinel服务器的端口地址

# Sentinel 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8858
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
spring.cloud.sentinel.eager=true
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# spring.cloud.sentinel.transport.client-ip=
# 应用服务 WEB 访问端口
server.port=8859

第三步:编写一个请求方法,并且使用@SentinelResource 注解用来标识资源是否被限流、降级。 

package com.ltx.sentineldemo.demos.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping(value = "/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello Sentinel";
    }
}

第四步:测试,这个地方我们不一定一启动就就会把我们的hello方法配置到 sentinel控制台中可能需要我们自己先去访问一下hello请求才可以帮我们动态的加入到 sentinel控制台中,结果如下图所示:

3.用程序的方式来编写hello方法的流量控制

 首先我们使用代码硬编码的方式来定义流量控制规则,并且使用@PostConstruct在服务启动前进行初始化。

    //定义了每秒最多接收3个请求
    @PostConstruct
    private static void initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule("hello");
        rule.setCount(3);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

编写一个简单的流量控制流控后的处理方法以及异常后的处理方法

package com.ltx.sentineldemo.demos.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    /**
     * 测试sentinel
     * blockHandler设置默认的流控后的处理方法
     * fallback设置默认的异常后的处理方法
     * @return
     */
    @GetMapping(value = "/hello")
    @SentinelResource(value = "hello",blockHandler = "helloBlockHandler",fallback = "helloFallback")
    public String hello() {
        return "Hello Sentinel";
    }

    public String helloBlockHandler(BlockException e) {
        return "流控";
    }

    public String helloFallback(Throwable t) {
        return "出现异常";
    }
}

我们可以去 sentinel控制台看一下是否配置了规则到sentinel中

然后我们去访问一下hello接口,流控方法处理成功

然后我直接在hello方法中写下异常的代码1/0结果如下所示:

 

4. 使用控制台配置

点击流控

 

1)流控参数

流控效果: 

 快速失败:这种策略适用于那些对响应时间有严格要求的业务场景。通过快速失败,系统可以迅速释放资源,避免在处理慢请求时占用过多资源,影响其他请求的处理。

Warmup(预热):预热机制特别适用于系统启动或流量突增时的场景。通过预热,系统可以逐步增加流量,避免因流量突变而对系统造成冲击。这有助于平滑流量波动,提高系统的稳定性。

排队等待:排队等待机制适用于那些需要处理大量并发请求的业务场景。通过排队,系统可以有序地处理请求,避免因并发请求过多而导致的服务崩溃。这种机制可以平衡请求的处理速度和系统资源的使用,提高系统的可用性。

流控模式:

直接流量控制:直接限制单位时间内的请求数量,例如每秒的请求数(QPS)。适用于需要限制整体流量的场景,如限制对数据库的访问频率。

关联流量控制:根据关联资源的访问情况来控制流量,例如限制对某个服务的访问。适用于需要根据服务调用链路来控制流量的场景,防止某个服务因调用过多而崩溃。

链路流量控制:限制某个特定链路的流量,防止链路中的资源过载。适用于需要保护特定调用链路的场景,如保护关键服务不被过载。

2)熔断参数

 

3)热点配置

然后在新增后就可以进行高级配置了,我们可以选择参数的类型和参数对应的值去限制

 

四、sentinel整合openfegin

 第一步:引入maven依赖到pom.xml文件

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

第二步:编写fallback实现类实现fegin连接器接口

package com.ltx.nacosconsumer.demos.clients;

public class ConsumerClientFallBack implements ConsumerClient{
    @Override
    public String test() {
        return "服务降级了";
    }
}

第三步:开启注解

package com.ltx.nacosconsumer.demos.clients;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name ="provider",fallback = ConsumerClientFallBack.class)
public interface ConsumerClient {
    @GetMapping(value = "/t")
    String test();
}

第四步:在配置文件中打开Feign支持sentienl

feign.sentinel.enabled=true

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

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

相关文章

关于 NASA 航空公司 cmapss 数据集剩余寿命(Rul)预测数据预处理的疑问。

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

微服务--熟练掌握网关(包括权限认证)

目录 一、网关的路由 二、网关登录的校验 2.1.鉴权思路分析 2.2.网关过滤器 2.3 自定义过滤器 2.3.1 自定义GatewayFilter 2.3.2 自定义GlobalFilter 2.4 登陆校验 具体的实现步骤&#xff1a; 一、在微服务中&#xff0c;我们在微服务的网关模块&#xff0c;就要进行…

K210视觉识别模块学习笔记8:Mx_yolo3本地模型训练环境搭建_部署模型到亚博canmv(失败)

今日开始学习K210视觉识别模块: 本地模型训练环境搭建 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 本地训练 Mx_yolo3 这里就简单地提示一下下载安装哪些软件&#xff0c;然后主要是使用Mx_yolo3 进行本地训练模型的...... 本文不…

子网划分+汇总

子网划分的意义&#xff1a;为了使得ip地址充分得到使用&#xff0c;减少浪费 我们知道IP地址分为ABCDE五类&#xff08;这里不讨论DE类&#xff09; IP地址总共有32个字节&#xff0c;分成四个八个字节的二进制数 例如128.64.1.1 10000000.01000000.00000001.00000001 0…

1、AI测试辅助-提示词优化

AI测试辅助-提示词优化 一、基本规则二、提示词优化技巧&#xff1a;2.1 Prompt 逆向工程2.2 提示词框架2.2.1 CO-STAR 框架 2.3 提示词生成器 三、总结 一、基本规则 写提示词有个通用的基本规则&#xff0c;遵循这个规则基本上能解决大部分的问答&#xff1a; 角色任务要求 …

视频逐帧播放查看神器-android闪黑闪白等分析辅助工具

背景 刚好有学员朋友在群里问道有没有什么播放软件可以实现对视频的逐帧即一帧一帧播放。在做android系统开发时候经常会偶尔遇到有时候是闪黑&#xff0c;闪白等一瞬间现象的问题。这类问题要分析的话就不得不需要对设备录屏&#xff0c;然后对录屏进行逐帧播放查看现象&…

Python层内层外多图布局图基分析

&#x1f3af;要点 &#x1f3af;多层图和多路复用图结构模型 | &#x1f3af;图结构变换、读写图、聚类系数、可视化、同构、图基分析 | &#x1f3af;稀疏网络边数和节点数线性扩展 | &#x1f3af;耦合边的生成和惰性评估 | &#x1f3af;层内布局计算、多层网络绘图、层间…

初识C++: string类【标准库里的string】【string类的模拟实现】

关于string类&#xff0c;可以先看一下这个文档string文档。 一.标准库里的string 1.1auto关键字 &#xff08;1&#xff09; 在早期C/C中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;后来这个 不重要了。C11中&#xff…

Linux基础三

拼搏何惧路途难&#xff0c; 汗水淋漓志未残。 砥砺前行心不改&#xff0c; 终能登顶笑开颜。 目录 一&#xff0c;vi编辑器 1&#xff0c;命令模式 2&#xff0c;末行模式 3&#xff0c;编辑模式 二&#xff0c;Linux进程启动的几种方式 2.1前台启动进程 2.2后台启动进程 三&a…

Git 创建分支进行写作开发

第一次链接仓库提交 and 有SSH公匙 第一步&#xff1a; git clone 远程仓库链接clone 远程已有仓库到本地 第二部&#xff1a; cd 文件夹 第三步&#xff1a; git checkout -b <your_branch_name> 创建分支 第四步&#xff1a; git add . 将目前目录下的所有文件…

加密micropython写的程序为.mpy的方法

2024年7月26日 用虚拟机安装一个Linux&#xff0c;本例为CentOS7的Linux系统。 1.保证Linux能够连接网络。 2.进入root用户&#xff0c;使用下面的命令行安装gcc编译器&#xff1a; yum install gcc 3.安装完成后&#xff0c;查看gcc是否安装成功&#xff0c;用下面的命令…

Java从入门到精通(十三)~ 枚举和注解

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 一、枚举 1.1 枚举的概念 ​编辑 1.2 枚举的特点 1.3 枚举的实际运用 1. 状态机&#xff0c;描述属性的…

App Inventor 2 低功耗蓝牙 BlueToothLE 拓展中文文档(完整翻译加强版)

低功耗蓝牙&#xff0c;也称为蓝牙LE 或简称 BLE&#xff0c;是一种类似于经典蓝牙的新通信协议&#xff0c;不同之处在于它旨在消耗更少的功耗和成本&#xff0c;同时保持同等的功能。 因此&#xff0c;低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。BluetoothLE 扩…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为&#xff1a; R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略&#xff0c;R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义&#xff0c;而不需要额外对字符串做转义…

文件系统基础 (二)——文件的物理结构

目录 一. 前言二. 连续(顺序)分配三. 链接分配隐式链接显式链接 三. 索引分配单级索引分配多级索引分配混合索引分配混合索引分配相关计算 五. 总结 一. 前言 文件的物理结构就是研究文件的实现&#xff0c;即文件数据在物理存储设备上是如何分布和组织的。 文件的分配方式&a…

【计算机网络原理】网络层IP协议的总结和数据链路层以太网协议的总结.

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package

conda issuehttp://t.csdnimg.cn/ndZZK 目录 常规安装 检索包资源 获取指定包的安装源&安装指令 安装指定包 常规安装 conda 常规安装xxx包 conda install xxx conda install有可能会受限于channel导致报错PackagesNotFoundError: The following packages are not av…

RedisTemplate、StringRedisTemplate、序列化器配置

Lettuce和Jedis RedisTemplate是SpringDataRedis中对JedisApi的高度封装&#xff0c;提供了Redis各种操作、 异常处理及序列化&#xff0c;支持发布订阅。 首先我们要知道SpringData是Spring中数据操作的模块&#xff0c;包括对各种数据库的集成&#xff0c;比如我们之前学过…

SpringBoot轻松实现多数据源切换

一.需求背景 项目需要实现在多个数据源之间读写数据&#xff0c;例如在 A 数据源和 B 数据源读取数据&#xff0c;然后在 C 数据源写入数据 或者 部分业务数据从 A 数据源中读取、部分从B数据源中读取诸如此类需求。本文将简单模拟在SpringBoot项目中实现不同数据源之间读取数…

数据结构:二分图以及判定二分图

文章目录 一、二分图的基本知识1、特性2、图示3、检查一个图是否为二分图3.1、着色的算法原理和思路3.2、算法示例&#xff1a;使用 BFS 检查二分图3.3、算法示例&#xff1a;使用 DFS 检查二分图 4、应用 二、例题1.LeetCode&#xff1a;785. 判断二分图2.Acwing&#xff1a;8…