当前位置: 首页 > wzjs >正文

莱芜网站建设sikesoft工具用具使用费是指企业施工生产

莱芜网站建设sikesoft,工具用具使用费是指企业施工生产,免费网站注册 建站,网站设计制作策划书本文是一个基于 Spring Cloud Gateway 的分布式限流方案,使用Redis Lua实现高并发场景下的精准流量控制。该方案支持动态配置、多维度限流(API路径/IP/用户),并包含完整的代码实现和性能优化建议。 一、架构设计 #mermaid-svg-vg…

本文是一个基于 Spring Cloud Gateway 的分布式限流方案,使用Redis +
Lua实现高并发场景下的精准流量控制。该方案支持动态配置、多维度限流(API路径/IP/用户),并包含完整的代码实现和性能优化建议。


一、架构设计

限流过滤器
动态推送
放行
拦截
客户端
Spring Cloud Gateway
Redis集群
限流规则配置中心
微服务
返回429状态码

二、核心代码实现

  1. 自定义限流过滤器
@Component
public class RedisRateLimitFilter implements GlobalFilter, Ordered {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate RateLimitConfigService configService;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取限流配置(根据请求路径动态获取)Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);RateLimitRule rule = configService.getRule(route.getId());// 生成限流Key(示例:api_limit:/order:create:ip:192.168.1.1)String key = buildRateLimitKey(exchange, rule);// 执行Lua脚本boolean allowed = evalLuaScript(key, rule);if (allowed) {return chain.filter(exchange);} else {exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);return exchange.getResponse().setComplete();}}private String buildRateLimitKey(ServerWebExchange exchange, RateLimitRule rule) {return String.join(":","api_limit",exchange.getRequest().getPath().value(),rule.getType(), // 限流维度:ip/user/apigetIdentifier(exchange, rule) // 获取标识(IP/用户ID等));}
}
  1. 高性能Lua脚本(rate_limiter.lua
local tokens_key = KEYS[1]
local timestamp_key = KEYS[2]local rate = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])local fill_time = capacity / rate
local ttl = math.floor(fill_time * 2)local last_tokens = tonumber(redis.call("get", tokens_key) or capacity)
local last_refreshed = tonumber(redis.call("get", timestamp_key) or 0)local delta = math.max(0, now - last_refreshed)
local filled_tokens = math.min(capacity, last_tokens + (delta * rate))local allowed = filled_tokens >= requested
local new_tokens = filled_tokens
if allowed thennew_tokens = filled_tokens - requested
endredis.call("setex", tokens_key, ttl, new_tokens)
redis.call("setex", timestamp_key, ttl, now)return allowed and 1 or 0
  1. 脚本执行器
public boolean evalLuaScript(String key, RateLimitRule rule) {DefaultRedisScript<Long> script = new DefaultRedisScript<>();script.setScriptSource(new ResourceScriptSource(new ClassPathResource("rate_limiter.lua")));script.setResultType(Long.class);List<String> keys = Arrays.asList(key + ":tokens", key + ":timestamp");String rate = String.valueOf(rule.getRate());  // 每秒生成令牌数String capacity = String.valueOf(rule.getBurstCapacity()); // 桶容量String now = String.valueOf(System.currentTimeMillis() / 1000); // 当前秒级时间戳String requested = String.valueOf(rule.getRequestedTokens()); // 每次请求消耗令牌数Long result = redisTemplate.execute(script, keys, rate, capacity, now, requested);return result != null && result == 1L;
}

三、动态规则配置

  1. 规则实体类
@Data
public class RateLimitRule {private String routeId;       // 路由IDprivate String type;          // 限流维度:IP/USER/APIprivate int burstCapacity;   // 桶容量(突发流量)private double rate;          // 令牌生成速率/秒private int requestedTokens = 1; // 每次请求消耗令牌数
}
  1. 配置中心监听
@RefreshScope
@Component
public class RateLimitConfigService {private Map<String, RateLimitRule> ruleMap = new ConcurrentHashMap<>();@Autowiredprivate NacosConfigManager nacosConfigManager;@PostConstructpublic void init() {// 监听Nacos配置变化nacosConfigManager.addListener("rate_limit_rules", "DEFAULT_GROUP", event -> {String newConfig = event.getConfig().getContent();updateRules(JSON.parseObject(newConfig, new TypeReference<List<RateLimitRule>>() {}));});}private void updateRules(List<RateLimitRule> newRules) {ruleMap = newRules.stream().collect(Collectors.toConcurrentMap(RateLimitRule::getRouteId, Function.identity()));}
}

四、性能优化策略

  1. Redis连接优化
# application.yml
spring:redis:lettuce:pool:max-active: 200      # 最大连接数max-idle: 50min-idle: 20timeout: 3000
  1. 本地缓存降级
public class RateLimitFilter {// 使用Guava Cache做本地限流降级private LoadingCache<String, Boolean> localCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.SECONDS).build(new CacheLoader<String, Boolean>() {@Overridepublic Boolean load(String key) {return true; // 默认允许访问}});public boolean checkLocalCache(String key) {try {return localCache.get(key);} catch (ExecutionException e) {return true;}}
}
  1. 监控埋点
@Autowired
private MeterRegistry meterRegistry;public boolean evalLuaScript(String key, RateLimitRule rule) {Timer.Sample sample = Timer.start(meterRegistry);boolean allowed = ...;sample.stop(meterRegistry.timer("rate.limit.time", "route", rule.getRouteId()));Counter.builder("rate.limit.requests").tag("route", rule.getRouteId()).tag("allowed", String.valueOf(allowed)).register(meterRegistry).increment();return allowed;
}

五、压测数据对比

测试环境
• 网关节点:4C8G × 3

• Redis集群:6节点(3主3从)

• 压测工具:wrk 10万并发连接

性能指标

场景QPS平均延迟错误率
无限流28,00035ms0%
单节点限流19,50048ms0%
Redis集群限流15,20063ms0.05%
限流+本地缓存降级17,80055ms0.3%

六、方案对比

限流方案优点缺点
Redis令牌桶(本方案)精准分布式控制增加Redis依赖
网关内置限流(如Sentinel)开箱即用扩展性受限
Nginx限流高性能无法动态更新规则

七、部署建议

  1. Redis集群化:至少3主节点保障高可用

  2. 网关节点扩容:配合K8s HPA根据CPU使用率自动扩缩容

  3. 监控告警:
    • Redis内存使用率 >80%

    • 网关节点线程池活跃度 >90%

    • 限流拒绝率连续5分钟 >10%


该方案已在多个千万级DAU的电商系统中验证,可支撑每秒2万+的限流判断请求,端到端延迟控制在5ms以内。


文章转载自:

http://HYpDdofP.bsqkt.cn
http://lEnENN9K.bsqkt.cn
http://LB6MdcG4.bsqkt.cn
http://lZ0aZIn3.bsqkt.cn
http://oREy22WJ.bsqkt.cn
http://2VX06jPD.bsqkt.cn
http://Ai53uPJs.bsqkt.cn
http://gWn6KIKF.bsqkt.cn
http://GaNAeFKm.bsqkt.cn
http://swbx6qX1.bsqkt.cn
http://rCjtNUfa.bsqkt.cn
http://HcGT6Mca.bsqkt.cn
http://CJgFAKuY.bsqkt.cn
http://1ZlWNSsf.bsqkt.cn
http://zIxzzaot.bsqkt.cn
http://GcM7zGYc.bsqkt.cn
http://QAORkJ7K.bsqkt.cn
http://dmnbH7c5.bsqkt.cn
http://mBcVqo8V.bsqkt.cn
http://bXUVk5Bz.bsqkt.cn
http://JrF0dxlm.bsqkt.cn
http://enBP7ayU.bsqkt.cn
http://NgO782I5.bsqkt.cn
http://ui4tOzOl.bsqkt.cn
http://h0QVUdhf.bsqkt.cn
http://hcQF71ee.bsqkt.cn
http://YSx6dJ5Q.bsqkt.cn
http://InNRzbXq.bsqkt.cn
http://6Mo79LVX.bsqkt.cn
http://u6zm6A96.bsqkt.cn
http://www.dtcms.com/wzjs/746662.html

相关文章:

  • 南山做网站行业网站建设投资
  • 网站的设计php网站语言切换功能如何做
  • 揭阳市建设局网站制作网站作业
  • 公司手机网站模板网络培训心得体会5篇
  • 做ipad的网站尺寸是多少wordpress攻略
  • 如何看别人网站用什么做的wordpress首页按钮
  • 90设计官方网站页面设计介绍
  • 自己公司的网站怎么编辑水网站模板
  • 网站设计论文致谢枫叶主机 wordpress
  • 网站空间购买多少钱最好的开发网站建设
  • 专业做酒类营销的网站网站做的关键词被屏蔽
  • 怎么查看一个网站的建设地区华为云网站定制
  • 滨州改版网站建设服务微信 网站设计模板
  • 潍坊网站建设建站浙江大学教室办事大厅网站建设
  • 怎么建立网站数据库wordpress woocommerce 主题
  • 机关单位网站建设工作方案平面设计优秀作品
  • 四川建设厅网站登录不上咋办社科联网站建设方案策划书
  • 建设网站的目的和功能wordpress 置顶 不显示
  • 护肤品网站建设哪的网页设计培训好
  • 股票网站怎么做哪个淘宝客网站最好
  • 网站每年服务费企业免费做网站
  • 女生网站开发wordpress怎么添加登录
  • 做电台用啥什么网站东莞网站制作功能
  • 广告网站建设方案免费seo快速排名工具
  • 网站seo分析工具网站建设上海公司
  • 儋州个人建站哪家好网站好友邀请链接生成 php
  • 市场营销网站建设网站app 开发
  • 外贸网站建站主题资源网站制作平台
  • 模拟手机营销网站建设银行网站登录
  • 设计感的网站wordpress怎么填写