肖雅婷“单挑”大榜:当实力遇上野心,谁能问鼎巅峰?
è¦�å®�ç�°â€œä¸¤æ¬¡è¯·æ±‚的时间间隔必须在3秒以上â€�è¿™ç§�需求需è¦�æ ¹æ�®å…·ä½“的业务场景选择å�ˆé€‚çš„Sentinelé…�置方å¼�。本文å�šä¸»å°†ä»‹ç»�å‡ ç§�å®�ç�°æ–¹æ¡ˆæ–¹æ¡ˆ1使用æ�’队ç‰å¾…æµ�æ�§æ•ˆæ�œæœ€æ�¥è¿‘需求# Sentinel规则é…�置对应æ�§åˆ¶å�°è®¾ç½®è§„则类å�‹æµ�æ�§è§„则 资æº�å��yourResource æµ�æ�§æ¨¡å¼�ç›´æ�¥ 阈值类å�‹QPS 阈值
33å› ä¸º1/3≈
33��秒最多
33个请求 æµ�æ�§æ•ˆæ�œæ�’队ç‰å¾… è¶…æ—¶æ—¶é—´3000ms3ç§’æ�§åˆ¶å�°è®¾ç½®â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”� │ æ·»åŠ æµ�æ�§è§„则 │ ├─────────────────────────────────────┤ │ 资æº�å�� yourResource │ │ 阈值类å�‹ QPS │ │ å�•机阈值
33 │ │ æµ�æ�§æ¨¡å¼� [ç›´æ�¥] │ │ │ │ æµ�æ�§æ•ˆæ�œ [æ�’队ç‰å¾…] │ │ è¶…æ—¶æ—¶é—´ 3000 ms │ └─────────────────────────────────────┘工作å�Ÿç�†è¯·æ±‚进入队列æ�’队æ¯�个请求处ç�†é—´éš”至少3秒如æ�œè¯·æ±‚到达太快会在队列ä¸ç‰å¾…如æ�œç‰å¾…时间超过3秒会被拒ç»�代ç �示例RestControllerpublicclassMyController{GetMapping(/api/resource)SentinelResource(valuemyResource,blockHandlerhandleBlock)publicStringmyApi(){// 业务逻辑returnsuccess;}// 阻å¡�处ç�†å‡½æ•°publicStringhandleBlock(BlockExceptione){return请求太频ç¹�请至少间隔3ç§’å†�试;}}方案2使用Warm Upé¢„çƒæ¨¡å¼�æ�¥è¿‘但ä¸�完全符å�ˆè§„则类å�‹æµ�æ�§è§„则 资æº�å��yourResource 阈值类å�‹QPS 阈值
33 æµ�æ�§æ•ˆæ�œWarm Up é¢„çƒæ—¶é•¿3秒方案3使用çƒç‚¹å�‚æ•°é™�æµ�针对å�Œä¸€ç”¨æˆ·/设备如æ�œéœ€è¦�针对å�Œä¸€ç”¨æˆ·é™�制3秒间隔使用çƒç‚¹å�‚数规则GetMapping(/api/resource)SentinelResource(valuemyResource)publicStringmyApi(RequestParamStringuserId){// 业务逻辑returnsuccess;}æ�§åˆ¶å�°é…�置规则类å�‹çƒç‚¹å�‚数规则 资æº�å��myResource å�‚数索引0对应userId å�•机阈值1æ¯�个userId 统计窗å�£æ—¶é•¿3000ms3秒方案4自定义å®�ç�°æœ€ç�µæ´»ComponentpublicclassRequestIntervalLimiter{privatefinalMapString,LonglastRequestTimenewConcurrentHashMap();publicbooleanallowRequest(Stringkey){longcurrentTimeSystem.currentTimeMillis();LonglastTimelastRequestTime.get(key);if(lastTimenull){lastRequestTime.put(key,currentTime);returntrue;}// 检查时间间隔if(currentTime-lastTime
{lastRequestTime.put(key,currentTime);returntrue;}returnfalse;}}RestControllerpublicclassMyController{AutowiredprivateRequestIntervalLimiterlimiter;GetMapping(/api/resource)publicResponseEntity?myApi(HttpServletRequestrequest){StringclientIdgetClientId(request);// è�·å�–å®¢æˆ·ç«¯æ ‡è¯†if(!limiter.allowRequest(clientId)){returnResponseEntity.status(
.body(请求太频ç¹�请至少间隔3ç§’å†�试);}// 业务逻辑returnResponseEntity.ok(success);}privateStringgetClientId(HttpServletRequestrequest){// æ ¹æ�®ä¸šåŠ¡è�·å�–å®¢æˆ·ç«¯æ ‡è¯†// å�¯ä»¥æ˜¯userId, IP, sessionIdç‰returnrequest.getHeader(X-User-Id)!null?request.getHeader(X-User-Id):request.getRemoteAddr();}}方案5使用Sentinel的系统自适应ä¿�护全局é™�制spring:cloud:sentinel:filter:enabled:true# 系统规则 - é™�制整体QPSdatasource:ds1:nacos:server-addr:localhost:8848dataId:sentinel-system-rulesrule-type:system系统规则é…�ç½®{avgRt:1000,highestSystemLoad:
8,qps:
33,// 全局QPS�制highestCpuUsage:
8,maxThread:50}æ�¨è��方案比较方案优点缺点适用场景æ�’队ç‰å¾…Sentinelå�Ÿç”Ÿæ”¯æŒ�ä¸�æ˜¯ä¸¥æ ¼3秒间隔需è¦�å�‡åŒ€å¤„ç�†è¯·æ±‚自定义å®�ç�°æœ€ç²¾ç¡®æ�§åˆ¶éœ€è¦�自己å®�ç�°ç²¾ç¡®çš„3秒间隔需求çƒç‚¹å�‚数按用户/设备é™�制é…�ç½®å¤�æ�‚针对特定用户é™�制系统规则全局æ�§åˆ¶ä¸�够精确系统整体ä¿�护最æ�¥è¿‘需求的é…�置如æ�œä¸¥æ ¼è¦�求两次请求间隔必须≥3秒使用方案1çš„æ�’队ç‰å¾…QPS阈值 1 / 3 ≈
33 è¶…æ—¶æ—¶é—´ 3000msé…�å�ˆè‡ªå®šä¹‰é€»è¾‘å¢�强ComponentpublicclassStrictIntervalLimiter{privatefinalLoadingCacheString,LongrequestCacheCacheBuilder.newBuilder().expireAfterWrite(3,TimeUnit.SECONDS).build(newCacheLoaderString,Long(){OverridepublicLongload(Stringkey){returnSystem.currentTimeMillis();}});publicbooleantryAcquire(Stringkey){try{// 如æ�œkeyå˜åœ¨è¯´æ˜�3秒内有过请求LonglastTimerequestCache.getIfPresent(key);if(lastTime!null){returnfalse;}requestCache.put(key,System.currentTimeMillis());returntrue;}catch(Exceptione){returnfalse;}}}最佳å®�践建议如æ�œå�ªæ˜¯éœ€è¦�大致3秒间隔使用方案1æ�’队ç‰å¾…如æ�œéœ€è¦�ä¸¥æ ¼ç²¾ç¡®çš„3秒间隔使用方案4自定义å®�ç�°å¦‚æ�œéœ€è¦�针对ä¸�å�Œç”¨æˆ·åˆ†åˆ«é™�制使用方案3çƒç‚¹å�‚æ•° 方案4组å�ˆ
jmcoin2安装包-jmcoin2安装包应用