网站免备案空间,上海建筑 公司网站,网站开发的流程,商务网站开发目录 一、概览
二、安装Sentinel
三、微服务整合sentinel
四、限流
1、流控模式
①直接
②关联
③链路
2、流控效果
①快速失败
②Warm Up
③排队等待
五、熔断降级
1、慢调用比例
2、异常比例
3、异常数 一、概览 SpringCloudGateway是一个基于SpringBoot2.x的…目录 一、概览
二、安装Sentinel
三、微服务整合sentinel
四、限流
1、流控模式
①直接
②关联
③链路
2、流控效果
①快速失败
②Warm Up
③排队等待
五、熔断降级
1、慢调用比例
2、异常比例
3、异常数 一、概览 SpringCloudGateway是一个基于SpringBoot2.x的API网关它可以帮助实现路由、过滤、容错等功能同时也是微服务架构中不可或缺的一部分。在这篇博客中将会了解到如何使用Sentinel实现SpringCloudGateway的限流、熔断降级。 Sentinel是一个轻量级的流量控制框架它可以帮助我们实现熔断降级、限流等功能同时也可以与SpringCloudGateway无缝集成。通过使用Sentinel可以有效地保护微服务架构免受故障和异常的影响。
二、安装Sentinel 官方提供了UI控制台下载地址https://github.com/alibaba/Sentinel/releases 将下载好的jar包放到任意非中文路径目录使用java命令启动可以修改Sentinel的默认端口、账户、密码server.port默认8080sentinel.dashboard.auth.username默认sentinelsentinel.dashboard.auth.password默认sentinel。 比如我这里放到D盘的Jar文件夹启动时换成2500端口命令如下
java -Dserver.port25000 -jar D:\Jar\sentinel-dashboard-1.8.2.jar启动之后访问http://localhost:25000/账户密码都是sentinel第一次启动后界面是空白的因为还没有进行相关微服务项目的整合。 三、微服务整合sentinel SpringCloudGateWay项目参考SpringCloudGateway--自动路由映射与手动路由映射_雨欲语的博客-CSDN博客源码下载地址
GitHub - dengyifanlittle/littledyf-test: my-test 添加依赖 !-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactIdversion2020.0.RC1/version/dependency 添加配置文件
spring:cloud:sentinel:transport:# 服务监控端口dashboard: localhost:25000# 默认 8719如果8719被占用了会自动从 8719 开始依次 1 扫描直至找到未被占用的端口port: 8719
四、限流 启动项目访问http://localhost:9999/service/nacos/test这时再刷新sentinel界面里面便有数据了 流控规则页面新增 资源名指需要进行流控的资源名称。例如如果我们需要对某个 API 接口进行流控那么这个 API 接口的地址就是这个规则的资源名。 针对来源指需要进行流控的请求来源可以是单个 IP 地址、应用程序、用户等。例如我们可以为某个 IP 地址创建一个流控规则或者为某个应用程序创建一个流控规则填写微服务名默认 default不区分来源。 阈值类型/单位阈值指流控的阈值类型和具体的阈值。阈值类型可以是并发线程数、QPS每秒请求数等具体的阈值则取决于阈值类型。例如如果阈值类型为并发线程数那么阈值可以是 100表示最多只能有 100 个并发线程在访问这个资源 是否集群指这个流控规则是否应用于整个集群如果是则表示该规则将应用于整个集群范围内的所有实例。如果不是则表示规则只应用于当前实例。 流控模式指当超过阈值时Sentinel 会采取的流控策略。有三种模式分别为直接流控模式、关联流控模式、链路流控模式。 ①直接流控模式当资源超过阈值时直接拒绝请求。这是一种比较常见的流控模式适用于对请求处理能力要求比较高的场景如秒杀系统。 ②关联流控模式当资源超过阈值时拒绝请求的同时还会对关联的资源进行流控。这种流控模式适用于有些资源的请求频率较低但是对资源的请求能力有较大的影响的场景如数据库或者缓存。 ③链路流控模式当资源超过阈值时不仅会对当前请求进行流控还会对整个请求链路上的资源进行流控。这种流控模式适用于分布式系统中的场景例如微服务架构下的请求链路。 流控效果指当流控规则触发时Sentinel 采取的具体流控效果。 ①快速失败在快速失败的流控效果下当请求被拒绝后Sentinel会立即返回错误信息告诉请求方请求被拒绝。这种流控效果适用于对响应时间要求比较高的场景例如秒杀系统或高并发的API接口。 ②Warm Up在Warm Up的流控效果下当系统初次启动或资源被重新分配时Sentinel会允许一部分请求通过以减缓流控策略的限制等待系统稳定后再进行全面的流控。这种流控效果适用于需要短时间内承受高流量的场景例如系统升级或重启。 ③排队等待在排队等待的流控效果下当请求被拒绝后Sentinel会将请求放入等待队列中等待资源可用后再进行处理。这种流控效果适用于对响应时间要求不是很高的场景例如消息队列或后台任务。 1、流控模式
①直接 新增流控规则流控模式选择直接模式阈值类型QPS单机阈值1 使用jemeter进行测试线程数量、现成启动时间、运行次数分别设置为1、1、4 可以看到有一个成功三个失败且失败信息是sentinel默认 删除原有规则新增流控规则流控模式选直接阈值类型选择并发线程数单机阈值设置为2微服务中只启动一个service即可并修改其中代码 import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Author dengyifan* create 2023/11/1 17:02* description*/RestController
RequestMapping(/nacos)
public class NacosTestController {GetMapping(/test)public String test() throws InterruptedException {Thread.sleep(2000);return 8088;}
} 并发线程数表示1秒内访问该API接口的线程数当排队的线程数达到设定的阈值的时候就会进行限流操作这种通常是出现在访问接口响应很慢的时候因此代码里面主动休眠2秒模拟。jmeter模拟测试时线程数设置为10其余为1 可以看到返回结果中成功两次其余8次失败并返回sentinel默认错误信息 如果将sentinel的流控规则删除则全部成功 ②关联 新增流控规则流控模式选择关联阈值类型选择QPS单机阈值设置为2关联资源填写另外的访问接口 在我们的微服务中新增两个接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Author dengyifan* create 2023/11/1 17:02* description*/RestController
RequestMapping(/nacos)
public class NacosTestController {GetMapping(/test-one)public String testOne() {return 8088-one;}GetMapping(/test-two)public String testTwo() {return 8088-two;}
} 在jmeter中线程组设置为1、1、10 设置两个http请求分别设置为test-one和test-two 启动测试可以发现模拟test-one的接口两个成功8个失败模拟test-two的接口10个全部成功因为设置了关联模式并且test-one关联了test-two接口当test-two接口的访问超过2的时候就会让test-one的处于失败状态。这种 ③链路 对于链路模式比如A路径会访问到资源CB路径也会访问到资源C此时配置链路模式入口资源设置为A当访问A达到一定限制就会触发限流B没有配置则不会触发。 配置文件增加
sentinel.web-context-unifyfalse 在gateway项目中新建Controller和Service
import com.littledyf.service.SentinelTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Author dengyifan* create 2023/11/9 10:41* description*/
RestController
RequestMapping(/test)
public class SentinelTestController {Autowiredprivate SentinelTestService sentinelTestService;GetMapping(/test-sentinel)public String testSentinel() {return sentinelTestService.testSentinel();}
}import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;/*** Author dengyifan* create 2023/11/9 10:42* description*/
Service
public class SentinelTestService {SentinelResource(sentinel)public String testSentinel() {return test sentinel;}
} 其中SentinelResource(sentinel)是手动设置资源名sentinel只会扫描controller层的资源service通过注解设置。 新增链路流控 jmeter添加测试 启动测试查看结果可发现4次里面3次失败 2、流控效果
①快速失败 之前流控模式都是使用快速失败即直接失败抛出异常。
②Warm Up warm up是指预热比如一些秒杀环节之前系统流量不高当秒杀开启突然升高这个时候开启预热模式让通过的流量缓慢增加能够达到设定阈值为止这样能够很好的保护系统。 其中会有一个默认1的coldFactor该值为3请求QPS从threshold/3开始经过设置的预热时间后达到设定的阈值比如我们现在进行以下设置 即刚开始有5/3个后面经过3秒后达到设定的阈值5。 jmeter设置 启动后可以看到前几秒都有失败的经过3秒后就稳定达到5个成功 ③排队等待 排队等待即让请求均匀通过其实跟漏桶算法是对应的选择排队等待必须要将类型设置为QPS否则是无效的 jmeter设置 效果 五、熔断降级 新增熔断规则界面 资源名指需要进行流控的资源名称。例如如果我们需要对某个 API 接口进行流控那么这个 API 接口的地址就是这个规则的资源名。 熔断策略表示触发熔断的条件 ①慢调用比例 ②异常比例 ③异常数 最大RT当资源的响应时间超过设定的阈值则统计计数 比例阈值表示触发熔断的比例阈值当某个熔断策略的比例超过该阈值触发熔断 熔断时长表示触发熔断后保持熔断状态的时间一般是为了避免熔断状态过早结束导致系统负载过高 最小请求数表述触发熔断的最小请求数当某个资源的请求数不足该值时不触发熔断 统计时长表示熔断策略统计的时间范围例如最近10秒内的统计数据 1、慢调用比例 为了模拟慢调用在接口中进行1000毫秒的休眠达到响应慢的作用 import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Author dengyifan* create 2023/11/1 17:02* description*/RestController
RequestMapping(/nacos)
public class NacosTestController {GetMapping(/test)public String test() throws InterruptedException {Thread.sleep(1000);return 8088;}
} 熔断设置 jmeter设置 结果 刚运行完之后在5秒内继续运行可以看到结果都是失败状态都被熔断处理了。
2、异常比例 代码修改成会出现异常的情况
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Author dengyifan* create 2023/11/1 17:02* description*/RestController
RequestMapping(/nacos)
public class NacosTestController {GetMapping(/test)public String test() throws Exception {String s null;if (s.equals(1)){return 1;}return 8088;}
} 新增熔断规则熔断策略选择异常比例 jmeter设置不变其中前5个都会抛出空指针异常后面5个是直接熔断 3、异常数 熔断策略选择异常数跟异常比例类似只是异常比例变为异常数了而已 sentinel还可以配置热点规则以及系统自适应限流。热点规则就类似于微博热搜一样有时候突然一个热点访问量大这时候可以进行限流设置很多时候热点都会进行相应的缓存比如加上一级缓存、二级缓存等这些实际就是为了保护系统而进行的设置。