基於redis快取的分布式服務限流
1、定於限流註解,限流註解可以加需要限流的業務類上,value為限流業務型別
@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @inte***ce tpscontrol
2、限流配置類,用於解析限流配置資訊存放
@data
public class tpscontrolconfig
3、redis工具類,分布式系統限流基於redis快取
@service
public class redisutils
public object excuteluascript(list keys,list args,string luascript)
// 單點
else if (nativeconnection instanceof jedis)
return null;
}});
return result;
}}
4、限流切面控制,根據註解上的業務型別,根據機構的限流配置,對機構的請求進行限流
@aspect
@component
@slf4j
public class tpscontrolaspect ")
private void settpscontrolmap(string tpscontrol)
// 切面攔截tpscontrol這個註解
@pointcut("@annotation(com.jfbank.fincloud.loan.order.loan.core.annotation.tpscontrol)")
public void tpscontrol()
// 環繞攔截
@around("tpscontrol()")
public object doaround(proceedingjoinpoint pjp) throws throwable
throw new serviceexception("500000", "超過最大訪問數");
}/**
* * 攔截方法引數物件中必須要要有機構號(instno)屬性
* 限流配置是機構維度的限流配置
** @param pjp
* @return
* @throws exception
*/private tpscontrolconfig resolvetpscontrolconfig(proceedingjoinpoint pjp) throws exception catch (nosuchfieldexception e) {}
if (!objectutils.isempty(field))
}// 獲取業務型別
string businesstype = targetmethod.getannotation(tpscontrol.class).value();
return getcurrenttpsconfig(businesstype, instno);
}/**
* 解析注入配置
* 無法通過apollo自動更新
** @param tpsconfig
*/private void inittpscontrolconfig(string tpsconfig)
configmap.foreach((key, value) -> );
tpscontrolconfig.foreach((key, value) ->
value.foreach(config ->
});});
}/**
* 獲取當前業務的tps限流配置
** @param businesstype 業務型別
* @param instno 機構號
* @return
*/public tpscontrolconfig getcurrenttpsconfig(string businesstype, string instno)
optionaloptional = tpscontrolconfiglist.stream().filter(config -> config.getinstno().equals(instno)).findfirst();
return optional.orelse(null);
}/**
* 是否過載
** @param tpscontrolconfig
* @return
*/public boolean isoverload(tpscontrolconfig tpscontrolconfig) catch (exception e)
int currentvisitcount = integer.parseint(result.tostring());
if (currentvisitcount > tpscontrolconfig.getmaxrequest()) tpsconfig = {}", currentvisitcount, tpscontrolconfig);
return true;
}return false;
}}
5、自定義異常類
public class serviceexception extends runtimeexception
public serviceexception(string errorcode, string message, throwable cause)
public string geterrcode()
public void seterrcode(string errcode)
}
6、限流配置,對業務型別為query的請求進行機構維度的限流,限制機構號10450的機構每分鐘最大請求數為5
tpscontrol = ]}
7、限流測試
@data
public class commonrequestdto
@service
@slf4j
public class tpscontroltarget
}@runwith(springrunner.class)
@slf4j
public class tpscontroltest ", result);
}).start();
}thread.sleep(3000);
}}
8、測試結果
只有五個請求可以正常返回,其餘請求丟擲異常!
分布式限流實戰 redis實現令牌桶限流
這篇文章我們主要是分析一下分布式限流的玩法。因為限流也是乙個經典用法了。隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。快取 降級和限流是保護微服務系統執行穩定性的三大利器。快取的目的是提公升系統訪問速度和增大系統能處理的容量,而降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待...
redis lua分布式限流
註解反思 我們專案有好幾個介面,呼叫公司中颱的介面,包括定時器的分片執行還有本人的多執行緒強行壓榨,哈哈。最後加上使用者的瘋狂請求,導致中颱的介面偶爾出現問題,主要是資料庫cpu達到100 昨晚專門做了個限流,那麼技術定型使用什麼呢?ratelimiter?這好像是單機才能玩,sentinel?這個...
分布式限流實戰
由於api介面無法控制呼叫方的行為,因此當遇到瞬時請求量激增時,會導致介面占用過多伺服器資源,使得其他請求響應速度降低或是超時,更有甚者可能導致伺服器宕機。限流 rate limiting 指對應用服務的請求進行限制,例如某一介面的請求限制為100個每秒,對超過限制的請求則進行快速失敗或丟棄。限流可...