Spring Cloud Alibaba Sentinel 使用

初识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接口
@Overridepublic String getUserBuy(String userId) {//获取一个随机的整数 1-100int 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> {@Overridepublic RemoteProductService create(Throwable cause) {log.info("异常:{}",cause.getMessage());return new RemoteProductService() {@Overridepublic 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-systemcloud:nacos:discovery:# 服务注册地址server-addr: 127.0.0.1:8848config:# 配置中心地址server-addr: ${spring.cloud.nacos.discovery.server-addr}# 配置中心的文件格式file-extension: ymlsentinel:datasource:flow-rules: #流控规则nacos:server-addr: localhost:8848dataId: ${spring.application.name}-flow-rulesdata-type: jsonrule-type: flowdegrade-rules: #熔断规则nacos:server-addr: localhost:8848dataId: ${spring.application.name}-degrade-rulesdata-type: jsonrule-type: degradeparam-flow-rules:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-param-flow-rulesdata-type: jsonrule-type: param-flowauthority-rules:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-authority-rulesdata-type: jsonrule-type: authoritysystem-rules:nacos:server-addr: localhost:8848dataId: ${spring.application.name}-system-rulesdata-type: jsonrule-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.mzph.cn/pingmian/3409.shtml

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

相关文章

赋能智慧校园!A3D数字孪生可视化,轻量又高效!

放假之后&#xff0c;学生们会逐步返学&#xff0c;大量人员出入校园&#xff0c;安全更是不容忽视&#xff0c;如何在短时间内对大批人员及设施进行智能监管&#xff1f;数字化转型是关键手段&#xff0c;我们可以融合线上线下数据&#xff0c;搭建3D立体的智慧校园&#xff0…

Unity 按下Play键后,Scene View里面一切正常,但是Game View中什么都没有 -- Camera Clear Flags的设置

问题如下所示。 最先遇到这个问题是我想用Unity开发一个VR 360-degree Image Viewer。在Scene View中可以看到球体&#xff0c;但是Game View什么都看不到。最后找到的原因是&#xff0c;我使用的shader是Skybox/Panorama&#xff0c; 需要把Main Camera的Clear Flags设置成Do…

hanoi塔

hanoi塔问题&#xff1a; 1.规则&#xff1a;一次移动一个盘子&#xff0c;小盘子压大盘子上面&#xff0c;有A、B、C三个柱子&#xff0c;A是起始放盘子的柱子&#xff0c;B是中间可以借助的柱子&#xff0c;C是最后放盘子的位置 2.简单思路&#xff1a; 如果有1个盘子&…

netsh int ipv4 show dynamicport tcp动态端口port设置

netsh int ipv4 show dynamicport tcp netsh int ipv4 set dynamicport tcp start4000 num10000

【Go语言快速上手(四)】面向对象的三大特性引入

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. 初识GO中的结构…

JAVA毕业设计136—基于Java+Springboot+Vue的房屋租赁管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的房屋租赁管理系统(源代码数据库)136 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、用户、工作人员、房东四种角色 1、用户/房东&#xff1a; …

【网络安全】网络安全协议和防火墙

目录 1、网络层的安全协议&#xff1a;IPsec 协议族 &#xff08;1&#xff09;IP 安全数据报格式 &#xff08;2&#xff09;互联网密钥交换 IKE (Internet Key Exchange) 协议 2、运输层的安全协议&#xff1a;TLS 协议 3、系统安全&#xff1a;防火墙与入侵检测 1、网络…

数据结构篇其二---单链表(C语言+超万字解析)

目录 前言&#xff1a; 一、顺序表的缺点和链表的引入。 二、链表概述 实现一个简单的链表 空链表的概念 三、链表的功能实现 链表的打印 链表节点的创建 链表的头插&#xff08;自上而下看完分析&#xff0c;相信你会有所收获&#xff09; 头插的前置分析 传值调用和…

OSPF的LSA与特殊区域

Area区域概念 *一个区域维护一张LSDB&#xff0c;路由器详细的链路信息只在这个区域内传播 不是每一台路由器都需要了解所有外部目的地的详细信息 *OSPF网络的层次化设计 通过区域ID标识 骨干&#xff08; Backbone &#xff09;区域&#xff0c;必须是area 0(骨干区域…

Dos慢速攻击

这里写自定义目录标题 Dos慢速攻击 Dos慢速攻击 测试结果为“Exit status&#xff1a; No open connections left"&#xff0c;代表无此漏洞。 如果测试结束后connected数量较多&#xff0c;closed数量很少或0&#xff0c;说明之前建立的慢速攻击测试连接没有关闭&#…

书生·浦语 大模型(学习笔记-7)LMDeploy 量化部署 LLM-VLM 实践

目录 一、模型的部署 二、模型部署面临的问题 三、如何解决&#xff08;两种方法&#xff09; 四、LMDeploy相关知识 创建conda环境(漫长的等待) 五、使用LMDeploy与模型对话 六、设置最大KV Cache缓存大小 七、W4A16量化 八、客户端连接API服务器 一、模型的部署 二、…

NLP step by step -- 了解Transformer

Transformer模型 Transformer相关历史 首先我们先看一下有关Transformer模型的发展历史&#xff0c;下面的图是基于Transformer架构的一些关键模型节点&#xff1a; 图片来源于Hugging Face 图片来源于Hugging Face Transformer 架构 于 2017 年 6 月推出。原本研究的重点是…

Java面试八股之Java中为什么没有全局变量

Java中为什么没有全局变量 Java中没有传统意义上的全局变量&#xff0c;这是因为Java语言设计遵循面向对象的原则&#xff0c;强调封装性和模块化&#xff0c;以及避免全局状态带来的副作用。 封装性&#xff1a; 全局变量违反了面向对象编程中的封装原则&#xff0c;即隐藏对…

Spring Boot集成RabbitMQ快速入门Demo

1.什么是RabbitMQ&#xff1f; RabbitMQ是一款使用Erlang语言开发的&#xff0c;基于AMQP协议的消息中间件&#xff0c;作为一款优秀的消息系统&#xff0c;RabbitMQ有高并发、可扩展等优势&#xff0c;并适用于大型系统中各个模块之间的通信。 RabbitMQ的特点为&#xff1a; 持…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 &#x1f31e;前言 &#x1f3de;️1. 单元测试的理论基础 &#x1f30a;1.1 单元测试是什么 &#x1f30a;1.2 单元测试的好处 &#x1f30a;1.3 单元测试的要求 &#x1f30a;1.4 测试框架-Junit4的介绍 &#x1f30a;1.5 单元测试为什么要mock &#x1f3de;️…

《前端面试题》- React - 如何区分函数组件和类组件

问题 如何区分函数组件和类组件&#xff1f; 答案 可以使用instanceof 或者Component.prototype.isReactComponent。 示例 函数组件 export default function FunctionComonent() {if(FunctionComonent.prototype.isReactComponent){console.log(FunctionComonent是类组件…

prompt提示词:AI英语词典优化版Pro,让AI教你学英语,通过AI实现一个网易有道英语词典

目录 一、前言二、效果对比三、优化《AI英语词典》提示词四、其他获奖作品链接 一、前言 不可思议&#xff01;我的AI有道英语字典助手竟然与百度千帆AI应用创意挑战赛K12教育主题赛榜首作品差之毫厘 &#xff0c;真的是高手都是惺惺相惜的&#xff0c;哈哈&#xff0c;自恋一…

docker 集群管理实战mesos+zookeeper+marathon(一)

一 实验环境 1.1 系统版本&#xff0c;本实验使用cnetos7.9版本镜像 1.2 准备5台虚拟机&#xff0c;其中3台master&#xff0c;两台slave&#xff0c;使用克隆的方式 1.3 使用远程连接工具登录 1.4 修改主机名 1.5 设置域名映射 每个虚拟机都配置一下&#xff0c;这里就演示一…

SN74LV1T125DBVR SN74LV1T125单电源单缓冲门,带三态输出CMOS逻辑电平转换器

SN74LV1T125DBVR 规格信息&#xff1a; 制造商:Texas Instruments 产品品种:转换 - 电压电平 RoHS:是 电源电压-最大:5.5 V 电源电压-最小:1.6 V 最小作业温度:- 40 C 最大作业温度: 125 C 安装风格:SMD/SMT 封装 / 箱体:SOT-23-5 封装:Cut Tape 封装:MouseReel 封装…

分类算法——ROC曲线与AUC指标(九)

知道TPR与FPR TPRTP/(TP FN) 所有真实类别为1的样本中&#xff0c;预测类别为1的比例 FPR FP/(FP TN) 所有真实类别为0的样本中&#xff0c;预测类别为1的比例 ROC曲线 ROC曲线的横轴就是FPRate&#xff0c;纵轴就是TPRate&#xff0c;当二者相等时&#xff0c;表示的意义…