镇江市建设工程安全监督站网站,wordpress主题市场,招聘网站开发计划书,代理做网站合适吗文章目录 一. 常见的限流算法1. 静态窗口限流2. 动态窗口限流3. 漏桶限流4. 令牌桶限流5. 令牌大闸 二. Sentinal简介三. 代码演示0. 限流场景1. 引入依赖2. 定义资源3. 定义规则4. 启动测试 四. 使用Sentinel控台监控流量1. Sentinel控台1.8.6版本下载地址2. 文档说明#xf… 文章目录 一. 常见的限流算法1. 静态窗口限流2. 动态窗口限流3. 漏桶限流4. 令牌桶限流5. 令牌大闸 二. Sentinal简介三. 代码演示0. 限流场景1. 引入依赖2. 定义资源3. 定义规则4. 启动测试 四. 使用Sentinel控台监控流量1. Sentinel控台1.8.6版本下载地址2. 文档说明3. 启动控制台4. 客户端代码配置连接控制台 五. 使用Sentinel控制台配置接口限流六. SentinelNacos实现限流规则持久化1. 添加依赖2. 增加配置3. Nacos增加流控规则4. 控制台查看 七. 熔断简介 一. 常见的限流算法 方法的具体介绍由AI生成 1. 静态窗口限流
工作原理 将时间划分为固定大小的窗口例如每秒一个窗口。在每个窗口内限制请求的总数。当窗口内的请求数量达到设定的阈值时后续的请求将被拒绝直到下一个窗口开始。优点 实现简单容易理解和部署。能够严格控制单位时间内的请求数量避免系统过载。 缺点 粒度较粗容易出现“突发流量”问题。例如如果一个窗口的请求刚好用完而下一个窗口的请求又集中在窗口开始的瞬间会导致流量的瞬间激增对系统造成冲击。不够灵活无法根据实际流量动态调整窗口大小或阈值。
2. 动态窗口限流
工作原理 在静态窗口的基础上引入动态调整机制。根据系统的实时负载情况如CPU使用率、内存占用等动态调整窗口的大小或阈值。例如当系统负载较高时减小窗口阈值当系统负载较低时适当增加窗口阈值。优点 比静态窗口限流更灵活能够根据系统负载动态调整更好地适应不同的流量情况。能够在一定程度上缓解突发流量对系统的影响。 缺点 实现相对复杂需要实时监控系统的负载情况并进行动态调整。动态调整的策略需要精心设计否则可能会导致系统抖动或调整不及时。
3. 漏桶限流
工作原理 漏桶算法的核心是一个“漏桶”它以固定速率流出水处理请求而流入水请求到达的速率是不可控的。如果流入的水过多导致桶溢出多余的水请求将被丢弃。漏桶算法通过限制流出水的速率来控制请求的处理速率。优点 能够平滑突发流量将突发的请求分散到后续的时间中处理。实现相对简单容易理解。 缺点 由于漏桶的流出速率是固定的因此对突发流量的处理能力有限。如果突发流量过大可能会导致大量请求被丢弃。对于短时间内的高并发请求响应速度可能会较慢因为漏桶需要按照固定速率逐步处理。
4. 令牌桶限流
工作原理 令牌桶算法的核心是一个“令牌桶”系统以固定速率向桶中添加令牌。当请求到达时会尝试从桶中获取令牌。如果桶中有令牌则获取成功请求被处理如果桶中没有令牌则请求被拒绝。令牌桶算法允许在短时间内处理突发流量只要桶中有足够的令牌。优点 能够很好地处理突发流量允许在短时间内处理更多的请求只要令牌足够。灵活性较高可以通过调整令牌的生成速率和桶的容量来适应不同的场景。 缺点 如果突发流量过大可能会导致令牌桶中的令牌快速耗尽后续的请求将被拒绝。实现相对复杂需要管理令牌的生成和消耗。
5. 令牌大闸
工作原理令牌大闸限流是一种相对较新的限流算法其核心思想是通过“大闸”来控制流量。大闸会根据系统的负载情况和流量特征动态地决定是否允许请求通过。它通常结合了多种策略如令牌桶、动态窗口等以实现更灵活的限流效果。例如当系统负载较低时大闸可以适当放宽限制当系统负载较高时大闸会严格限制流量。优点 集成了多种限流策略的优点能够更灵活地应对复杂的流量场景。能够根据系统的实时状态动态调整限流策略避免系统过载。 缺点 实现复杂度较高需要综合考虑多种因素和策略。配置和调优较为复杂需要根据具体场景进行精细调整。
二. Sentinal简介
官网https://sentinelguard.io/zh-cn/index.html
Sentinel 是阿里巴巴开源的分布式系统流量控制和熔断降级组件通过流量控制、熔断降级、系统负载保护等功能帮助微服务在高并发场景下保持稳定运行。它基于责任链模式设计通过多个插槽Slot协同工作实现流量监控、规则判断、资源降级等操作。Sentinel 提供可视化的控制台方便用户实时监控系统状态并动态配置规则同时支持与 Spring Cloud、Dubbo 等主流微服务框架无缝集成广泛应用于分布式系统架构中保障系统的高可用性。 重点限流是做在被调用方熔断是做在调用方 三. 代码演示
0. 限流场景
在基于SpringCloud的仿12306项目中对于抢票这一环节需要做限流。对于关键业务doConfirm方法进行限流访问。
1. 引入依赖
引入SpringCloud的sentinel依赖 !-- 限流熔断 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency2. 定义资源
定义限流的内容就是资源 SentinelResource(value doConfirm, blockHandler doConfirmBlock)public void doConfirm(ConfirmOrderDoReq req) {// 业务代码}/*** 降级方法需包含限流方法的所有参数和BlockException参数* param req* param e*/public void doConfirmBlock(ConfirmOrderDoReq req, BlockException e) {LOG.info(购票请求被限流{}, req);throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_FLOW_EXCEPTION);} blockHandler “doConfirmBlock” 表示被阻塞之后调用doConfirmBlock方法 3. 定义规则
在启动类定义并调用规则
SpringBootApplication
ComponentScan(com.mystudy)
MapperScan(com.mystudy.train.*.mapper)
EnableFeignClients(com.mystudy.train.business.feign)
EnableCaching
public class BusinessApplication {private static final Logger LOG LoggerFactory.getLogger(BusinessApplication.class);public static void main(String[] args) {SpringApplication app new SpringApplication(BusinessApplication.class);Environment env app.run(args).getEnvironment();LOG.info(启动成功);LOG.info(测试地址: \thttp://127.0.0.1:{}{}/test, env.getProperty(server.port), env.getProperty(server.servlet.context-path));// 限流规则initFlowRules();LOG.info(已定义限流规则);}// 定义限流规则private static void initFlowRules(){ListFlowRule rules new ArrayList();FlowRule rule new FlowRule();rule.setResource(doConfirm);rule.setGrade(RuleConstant.FLOW_GRADE_QPS);// Set limit QPS to 20.rule.setCount(1);rules.add(rule);FlowRuleManager.loadRules(rules);}
}4. 启动测试
通过JMeter测试启动十个线程同时抢票运行结束后查看限流情况 控制台打印被拦截的请求有8个说明成功限流。 还有2个请求成功进入业务代码是因为每秒只允许1个请求进入运行时间超过1秒 四. 使用Sentinel控台监控流量
1. Sentinel控台1.8.6版本下载地址
https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
2. 文档说明
https://sentinelguard.io/zh-cn/docs/dashboard.html
3. 启动控制台
命令行运行
java -Dserver.port18080 -Dcsp.sentinel.dashboard.serverlocalhost:18080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.6.jar访问浏览器http://localhost:18080/ 默认用户名密码均是sentinel 4. 客户端代码配置连接控制台
增加配置
# sentinel控台https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
spring.cloud.sentinel.transport.port8719
spring.cloud.sentinel.transport.dashboardlocalhost:1808018080端口与上述启动的端口要一致 连接完成后只有当business模块有流量时才会在控制台显示 控制台显示 控制台成功显示流量信息 同时可以在控制台查看限流规则删除修改或者新增 五. 使用Sentinel控制台配置接口限流
有了控制台就不需要把流控规则写死在代码里了可以利用控制台中的簇点链路来增加规则 同时在对应的接口或者方法上增加相对应的注解定义为资源 SentinelResource(value xxx, blockHandler doConfirmBlock) 这样就可以设置动态流控策略了
六. SentinelNacos实现限流规则持久化 上述在控制台修改流控策略的方法在服务器重启之后会消失不能实现持久化因此可以使用SentinelNacos实现限流规则持久化 1. 添加依赖 !-- sentinel nacos --dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency2. 增加配置
# sentinel nacos
spring.cloud.sentinel.datasource.flow.nacos.serverAddr127.0.0.1:8848
spring.cloud.sentinel.datasource.flow.nacos.namespacetrain
spring.cloud.sentinel.datasource.flow.nacos.groupIdDEFAULT_GROUP
spring.cloud.sentinel.datasource.flow.nacos.dataIdsentinel-business-flow
spring.cloud.sentinel.datasource.flow.nacos.ruleTypeflow3. Nacos增加流控规则 [{resource: doConfirm,limitApp: default,grade: 1,count: 100,strategy: 0,controlBehavior: 0,clusterMode: false}
]4. 控制台查看 此时就有持久化配置项了
七. 熔断简介
熔断是一种容错机制用于防止分布式系统中的雪崩效应。当某个服务或资源出现故障如响应时间过长、错误率过高时熔断器会快速失败并停止对该服务的调用避免故障扩散到整个系统。经过一段时间后熔断器会尝试恢复调用如果问题已解决则恢复正常调用。