Spring Cloud Alibaba Sentinel 使用

news2024/11/25 2:44:15

初识Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址: home | Sentinel

需要了解的概念

簇点链路

在学习 Sentinel 的使用之前,我们有必要首先了解一下簇点链路。当请求进入微服务时,首先会访Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。链路中被监控的每个接口就是一个资源。默认情况下 Sentinel 会监控 Spring MVC 的每一个端点(Endpoint),因此 SpringMVC 的每一个端点(Endpoint)就是调用链路中的一个资源。

簇点链路中的资源可以认为就是一个Controller中的接口路径。

流控、熔断等都是针对簇点链路中的资源来设置的。

下载

下载sentinel-dashboard的jar包:https://github.com/alibaba/Sentinel/releases/tag/1.8.6

上传到服务器

部署sentinel-dashboard

前置:服务器需要安装好JDK

启动命令如下

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=192.168.1.5:8090 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel  -jar sentinel-dashboard-1.8.6.jar

启动参数解释

-Dserver.port=8090 // 指定启动端口,默认8080建议更换端口号

-Dcsp.sentinel.dashboard.server=localhost:8080 // Sentinel Dashboard 地址,地址格式:ip:port,客户端会自动向该地址发送心跳包,必须进行配置

-Dproject.name=sentinel-dashboard // 指定sentinel控制台服务的名字

-Dsentinel.dashboard.auth.username=sentinel // 指定sentinel登录名,可选,默认sentinel

-Dsentinel.dashboard.auth.password=sentinel // 指定sentinel登录密码,可选,默认sentinel

访问http://localhost:8090,如下图所示,默认的账户和密码都是sentinel

登录成功后,便可查看控制台内部信息,默认会监控sentinel-dashboard服务本身

Sentinel 的简单使用示例

QPS限流

场景

我们需要对 /getProductById这个路径进行QPS限流,要求它的 QPS 每秒不能超过 1,即每秒访问不能超过一次,设置步骤如下

准备前置条件

  1. 启动sentinel控制台,如果不是同一台机器注意打开防火墙端口号
  2. 准备一个SpringBoot项目中,服务名为:sky-product,开发一个API接口,url为:/getProductById
@GetMapping("/getProductById")
    public String getProductById(Integer id) {
        log.info("入参:{}",id);
        if(id==null){
            log.error("getProductById 入参为 null");
            id=1;
        }
        return productService.getProductById(id);
    }
  1. 引入sentinel依赖
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. 修改yml配置文件
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090 # 配置控制台ip和端口
  1. 现在启动这个服务
  2. 先访问/getProductById接口

  1. 访问后刷新控制台,sentinel默认为懒加载,看不到可以多刷新几次

限流规则配置

  1. 添加限流规则,点击流控按钮

  1. 类型选择QPS,单机阈值填1,点击新增按钮

  1. 新增之后,可以在流控规则中查看这条新增的规则

  1. 测试,快速访问这个接口,会发现出现限流提示,状态码为429

线程隔离限流

场景

sky-product服务中的 /getProductById接口被sky-system服务中getUserBuy接口调用,

在高并发场景下,如果getProductById接口出现响应缓慢的情况,可能会出现拖慢sky-system服务,将sky-system服务资源耗尽,即出现服务雪崩的情况。

解决方案如下

这时可以对getUserBuy接口进行线程池隔离限流,比如设置线程数为5,这样sky-system服务最多只会有5个线程去访问getProductById接口,不会出现资源耗尽的情况。

前置条件准备

  1. 首先按照QPS限流前置条件准备
  2. 创建sky-system服务
  3. 增加getUserBuy接口
@GetMapping("/getUserBuy")
    public String getUserBuy(String userId) {
        log.info("入参:{}",userId);
        return userService.getUserBuy(userId);
    }
  1. 增加feign client
@FeignClient(contextId = "remoteProductService", name = "sky-product")
public interface RemoteProductService {

    @GetMapping("/product/getProductById")
    String getProductById(@RequestParam("id") Integer id);
}
  1. getUserBuy接口service代码,远程调用sky-product中的getProductById接口
@Override
    public String getUserBuy(String userId) {
        //获取一个随机的整数 1-100
        int intnum = new Random().nextInt(100);
        log.info("开始执行方法");
        return remoteProductService.getProductById(intnum);
    }

限流规则配置

  1. 添加限流规则,点击流控按钮

  2. 类型选择并发线程数,单机阈值填5,点击新增按钮

  1. 在getProductById接口中增加Thread.sleep(500),方便进行测试
  2. 使用jemter测试,平均每秒100个请求

  1. 查看sentinel实时监控,可以看到平均QPS为10,结果符合预期

对OpenFeign调用进行限流

在一般情况下我们是针对远程调用进行限流,在Spring Cloud项目中主要是针对OpenFeign进行限流

配置簇点链路展示feign接口

在sky-system服务yml配置文件增加如下配置

feign:
  sentinel:
    enabled: true

访问getuserBy接口,刷新Sentinel控制台,可以看到展示了OpenFeign接口,我们可以给这个接口配置限流规则

给OpenFeign增加Fallback配置

这样可以在发生异常或流控时做一些处理,比如返回默认值或者有好的提示等。

  1. 增加一个类,实现FallbackFactory,并声明为一个bean
@Component
@Slf4j
public class RemoteProductFallback implements FallbackFactory<RemoteProductService> {

    @Override
    public RemoteProductService create(Throwable cause) {
        log.info("异常:{}",cause.getMessage());
        return new RemoteProductService() {
            @Override
            public String getProductById(Integer id) {
                return "出现限流了,我是默认返回值";
            }
        };
    }
    
}
  1. 修改FeignClient,增加fallbackFactory属性
@FeignClient(contextId = "remoteProductService", name = "sky-product",fallbackFactory = RemoteProductFallback.class)
public interface RemoteProductService {

    @GetMapping("/product/getProductById")
    String getProductById(@RequestParam("id") Integer id);
}
  1. 重启后进行测试
  2. 先访问getUserBuy接口,刷新控制台设置流控规则,这里阈值设置为1方便测试

  1. 快速请求接口,返回了fallback提示

熔断

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

我们给openfeign接口配置一下熔断策略

  1. 访问getUserBuy接口,刷新控制台,点击熔断按钮

  1. 修改getProductById方法,接口延时为100-200之间
@GetMapping("/getProductById")
    public String getProductById(Integer id) {
        Random random = new Random();
        int min = 100; // 范围最小值
        int max = 200; // 范围最大值
        int randomNumber = random.nextInt(max - min + 1) + min;
        try {
            Thread.sleep(randomNumber);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("入参:{}",id);
        if(id==null){
            log.error("getProductById 入参为 null");
            id=1;
        }
        return productService.getProductById(id);
    }
  1. 熔断配置如下,表示在1秒内请求数超过5,并且有70%请求时间超过110ms,则会熔断10s

  1. 配置流控规则,给openfeign接口限制了最大10个线程

  1. 使用jemeter进行测试,每秒钟10个请求

  1. 在没有配置熔断,只配置流控的情况下所有的请求都是正常的。我们看下配置了熔断的情况发现出现了熔断的情况。

生产环境使用

在前面测试时已经发现,服务重启后配置的规则就消失了,这在生产上是不可以的。

官方推荐生产模式使用Push模式,使用Nacos配置中心来管理sentinel规则在生产环境中使用 Sentinel · alibaba/Sentinel Wiki · GitHub

生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:

微服务中增加基于Nacos的写数据源(WritableDataSource),当 Sentinel Dashboard 配置发生变更,则利用 nacos 配置变更通知微服务更新本地缓存。

下面我们来结合Nacos使用Sentinel

POM文件引入下面的依赖

getUserBuy
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

yml配置文件修改

我们使用nacos配置文件来对服务进行流控、熔断等操作,所以就需要有以下几个必须的参数:

data-id:需要告诉sentinel读取配置中心中的哪个配置文件。

rule-type:告诉sentinel配置文件配置的控制规则,flow:流控、degrade:熔断、param-flow热点参数,想看有哪些规则参数可以查看com.alibaba.cloud.sentinel.datasource包下的枚举类:RuleType。

现在在yml配置文件增加下面的配置

spring:
  application:
    name: sky-system
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
      config:
        # 配置中心地址
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        # 配置中心的文件格式
        file-extension: yml
    sentinel:
      datasource:
        flow-rules: #流控规则
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-flow-rules
            data-type: json
            rule-type: flow
        degrade-rules: #熔断规则
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-degrade-rules
            data-type: json
            rule-type: degrade
        param-flow-rules:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-param-flow-rules
            data-type: json
            rule-type: param-flow
        authority-rules:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-authority-rules
            data-type: json
            rule-type: authority
        system-rules:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-system-rules
            data-type: json
            rule-type: system

Nacos上增加规则文件

因为上面配置文件中指定了Nacos配置文件的名称格式: dataId: ${spring.application.name}-xxx.json,所以

配置限流规则需要先创建 sky-system-flow-rules.json

配置熔断规则需要先创建sky-system-degrade-rules.json配置集,其他服务类似

存在一个问题:nacos中的配置文件对于sentinel来讲是单项数据读入,sentinel能监听到nacos中配置的变化,但是我们在sentinel中修改了配置,nacos是不会监听到并进行修改。所以不能通过sentinel控制台来配置,只能通过nacos来配置规则。

配置限流规则

在nacos上编辑sky-system-flow-rules配置,填入下面的内容

[{
    "resource":"/getUserBuy",
    "grade":0, 
    "count":10, 
    "strategy":0, 
    "controlBehavior":0,
    "clusterMode":false
}
]

效果和下图一样

说明

[

{

"resource": "/test", // 资源名

"limitApp": "default", // // 针对来源,若为 default 则不区分调用来源

"grade": 1, // 限流阈值类型(1:QPS; 0:并发线程数)

"count": 1, // 阈值

"clusterMode": false, // 是否是集群模式

"controlBehavior": 0, // 流控效果 (0:快速失败; 1:Warm Up(预热模式); 2:排队等待)

"strategy": 0, // 流控模式(0:直接; 1:关联; 2:链路)

"warmUpPeriodSec": 10, // 预热时间(秒,预热模式需要此参数)

"maxQueueingTimeMs": 500, // 超时时间(排队等待模式需要此参数)

"refResource": "rrr" // 关联资源、入口资源(关联、链路模式)

}

]

刷新sentinel控制台,可以看到配置已经生效

配置熔断规则

在nacos上编辑sky-system-degrade-rules配置,填入下面的内容

[
    {
        "resource": "GET:http://sky-product/product/getProductById",
        "grade": 0, 
        "count": 110, 
        "slowRatioThreshold": 0.7,
        "minRequestAmount":  10, 
        "timeWindow": 10, 
        "statIntervalMs": 1000 
    }
]	

效果和下图一致

说明

[

{

"resource": "/ceshi",

"grade": 0, // 熔断策略,支持慢调用比例(0),异常比例(1),异常数(2)策略

"count": 1000, // 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用,单位ms);异常比例/异常数模式下为对应的阈值

"slowRatioThreshold": 0.1,// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

"minRequestAmount": 10, //熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断

"timeWindow": 10, // 熔断时长,单位为 s

"statIntervalMs": 1000 // 统计时长(单位为 ms),如 60*1000 代表分钟级

}

]

刷新sentinel控制台,可以看到配置已经生效

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

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

相关文章

原生js实现一个简化版的h函数

原生js实现一个简化版的h函数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

ChatGPT智能对话和MidjourneyAI画画系统源码运营版+完整教程

今天给大家带来一款可以帮你赚米的AI智能系统。这款系统将AI智能会话及AI画画功能合二为一&#xff0c;对接了大名鼎鼎的ChatGPT接口及Midjourney两个王牌接口。另外后台还集成了国内外几十个AI大模型及AI绘画接口&#xff08;输入文字就可以快速生成高清图片&#xff09;&…

PHP 函数的命名空间是否会影响执行顺序?

在 php 中&#xff0c;函数命名空间一般不会影响执行顺序。执行顺序通常由文件顺序或函数调用顺序决定。即使函数位于不同的命名空间中&#xff0c;只要它们在同一文件中&#xff0c;它们就会按照定义顺序执行。 PHP 函数命名空间是否会影响执行顺序&#xff1f; 简介 在 PHP…

AI 边缘计算平台 - 嘉楠堪智 CanMV K230 开箱

CanMV-K230 开发板采用的是嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 SoC 芯片 K230。该芯片采用全新的多异构单元加速计算架构&#xff0c;最新高性能 RISC-V CPU 内置双核玄铁 C908 CPU, 主频高达 1.6GHz&#xff1b;是全球首款支持 RISC-V Vector 1.0 标准的商用 SoC&a…

某翻译平台翻译接口逆向之webpack学习

逆向网址 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLw 逆向链接 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLyMv 逆向接口 aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRl 逆向过程 请求方式 POST 逆向参数 sign c168e4cb76169e90f82d28118dbd24d2 接口请求结果解密 过程分析 根据XHR…

Transformer模型详解01-Word Embedding

文章目录 前言Transformer 整体结构Transformer 的输入单词 Embedding原理CBOW 模型one-hot构建 CBOW 训练数据集构建 CBOW 神经网络训练 CBOW 神经网络 Skip-gram 模型one-hot构建 Skip-gram训练数据集训练 Skip-gram神经网络 Word2Vec实例数据训练保存和加载 前言 Transform…

Jammy@Jetson Orin - Tensorflow Keras Get Started: 000 setup for tutorial

JammyJetson Orin - Tensorflow & Keras Get Started: 000 setup for tutorial 1. 源由2. 搭建环境2.1 安装IDE环境2.2 安装numpy2.3 安装keras2.4 安装JAX2.5 安装tensorflow2.6 安装PyTorch2.7 安装nbdiff 3. 测试DEMO3.1 numpy版本兼容问题3.2 karas API - model.compil…

全国省级金融发展水平数据集(2000-2022年)

01、数据简介 金融发展水平是一个国家或地区经济实力和国际竞争力的重要体现。它反映了金融体系的成熟程度和发展水平&#xff0c;是衡量一个国家或地区经济发展质量的重要指标。金融发展水平的提高&#xff0c;意味着金融体系能够更好地服务实体经济&#xff0c;推动经济增长…

数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题 1、除了向上调整建堆&#xff0c;我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走&#xff0c;可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数…

【C++杂货铺】多态

目录 &#x1f308;前言&#x1f308; &#x1f4c1;多态的概念 &#x1f4c1; 多态的定义及实现 &#x1f4c2; 多态的构成条件 &#x1f4c2; 虚函数 &#x1f4c2; 虚函数重写 &#x1f4c2; C11 override 和 final &#x1f4c2; 重载&#xff0c;覆盖&#xff08;重写…

VBA技术资料MF145:清空回收站

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

六、项目发布-- 3. Node.js+express 编写书城首页API

前面那些准备工作做完之后&#xff0c;现在我们就具体来用Node.js来写一个简单的API 基本API编写&#xff1a; 建个后端文件夹&#xff0c;放到vscode打开 我们之前的代码都是前端代码&#xff0c;现在我们来做一个后端的代码。新建一个新的文件夹叫node_new_book&#xff0…

二 SSM整合实操

SSM整合实操 一 依赖管理 数据库准备 mysql8.0.33 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUE…

数字旅游:通过科技赋能,创新旅游服务模式,提供智能化、个性化的旅游服务,满足游客多元化、个性化的旅游需求

目录 一、数字旅游的概念与内涵 二、科技赋能数字旅游的创新实践 1、大数据技术的应用 2、人工智能技术的应用 3、物联网技术的应用 4、云计算技术的应用 三、智能化、个性化旅游服务的实现路径 1、提升旅游服务的智能化水平 2、实现旅游服务的个性化定制 四、数字旅…

可视化+多人协同技术原理和案例分享

前言 hi&#xff0c;大家好&#xff0c;我是徐小夕&#xff0c;之前和大家分享了很多可视化低代码的技术实践&#xff0c;最近也做了一款非常有意思的文档搭建引擎——Nocode/Doc&#xff1a; 也做了一些分享&#xff1a; Nocode/Doc&#xff0c;可视化 零代码打造下一代文件编…

Flink学习(八)-Flink 集群搭建

1&#xff0c;准备三台机器 装好 jdk 等必要的组件。 注意&#xff0c;由于本身没有额外的 dns做转发。因此&#xff0c;需要在每台机器的 host 文件里&#xff0c;配置好相关 ip 具体方法 vim /etc/hosts 2&#xff0c;flink做配置 2.1 资源规划 节点服务器 node01 nod…

VScode Failed to parse remote port from server output

在使用VScode 在连接AutoDL 过程中一直连接不上&#xff0c;显示 Failed to parse remote port from server output 在网上查了很多资料&#xff0c;貌似的没啥用。和我有相同 error 的可以尝试修改setting.json 文件。 添加这条命令&#xff08;我的json文件里面没有&#…

Spring Cloud OpenFeign 开启 httpclient5

环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 knife4j &#xff1a; 4.4.0 开始工作 pom文件引入配置 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-start…

探索设计模式的魅力:AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;AI赋能分层模式&#xff0c;解构未来&#xff0c;智领风潮 ✨欢迎…

【优秀AI项目】每日跟踪 OpenVoice ,AI快站,OpenVoice

持续更新好玩的开源AI项目或AI商业应用体验 一起来玩转AI&#xff01;&#xff01; 1 huggingface 国内镜像站&#xff1a;AI 快站 HUggingface被墙了&#xff0c;emmmmm 所以我之前玩模型的一大感觉就是 下载什么模型之类的太难受了&#xff01;服了 看到一个镜像站——…