基于函數(shù)的 熔斷器,限流器
上一篇博文寫了我的naocs sdk济炎,但啥都有了川抡,那微服務(wù)關(guān)鍵的熔斷和限流的功能也必須安排上。雖然說是微服務(wù)的熔斷器和限流器冻辩,但是你只要導(dǎo)入并創(chuàng)建好對應(yīng)的熔斷器和限流器猖腕,你可以用在函數(shù)上面,替你處理函數(shù)超時響應(yīng)以及函數(shù)異常恨闪。也可以對你的函數(shù)做限流和熔斷倘感。
我的git地址:https://github.com/KcangYan/nacos-python-sdk
熔斷器
在自己的項目中使用
? pip install KcangFuse #安裝
? import KcangFuse.funcFuse as funcFuse
使用說明:
```
? def myFallBackFunc(*args,**kwargs):#自定義熔斷返回函數(shù)
? ? ? return "function fallback " + "? function info: " + str(args)+ " " + str(kwargs)
? def myTimeoutFallbackFunc(ex, *args,**kwargs): #自定義錯誤返回函數(shù)
? ? ? print(ex)
? ? ? return "function time out " + "? function info: " + str(args)+ " " + str(kwargs)
? def myExceptFallbackFunc(ex, *args,**kwargs): #自定義超時返回函數(shù)
? ? ? return "function except " + str(ex) + "? function info: " + str(args)+ " " + str(kwargs)
```
? 當(dāng)開啟熔斷時,即返回自定義熔斷返回函數(shù)咙咽,不開啟根據(jù)情況返回其他兩個
```
? SimpleFuncFuse1 = funcFuse.funcFuse()#不設(shè)置則使用內(nèi)置默認(rèn)錯誤返回函數(shù)
? 注意:注解需聲明在函數(shù)上方老玛,不可以在@app這個注解上方,否則不生效钧敞!
? @app.route(Router + "/test1", methods=['GET'])
? @SimpleFuncFuse1.fuse(timeout=2)
? def fuseTest1():#超時返回自定義超時錯誤返回函數(shù)
? ? ? time.sleep(3)
? ? ? return "ok"
```
```
SimpleFuncFuse2 = funcFuse.funcFuse(timeoutFallbackFunc=myTimeoutFallbackFunc,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? exceptFallbackFunc=myExceptFallbackFunc)
? 可以嘗試讓路由映射的函數(shù)發(fā)生異常蜡豹,熔斷器會將詳細(xì)的函數(shù)信息返回給自定義異常返回函數(shù),交由你自己處理? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? @app.route(Router + "/test2/<int:x>/<int:y>", methods=['GET'])
? @SimpleFuncFuse2.fuse()
? def fuseTest2(x,y):
? ? ? z = x/y #路由中輸入0嘗試錯誤返回自定義函數(shù)
? ? ? return str(z)
```
? fuseStatus=True時則表示開啟熔斷器模式(默認(rèn)是關(guān)閉的)
? exceptPercent=0.5, 0-1之間 異常比例溉苛,即在熔斷統(tǒng)計時間窗口期內(nèi)發(fā)生異常的比例
? timeWindows=5, 單位:秒 熔斷時間窗口期镜廉,即觸發(fā)熔斷后熔斷多久,熔斷時間窗口期過去后愚战,會自動再放開請求進(jìn)去娇唯,
? ? ? ? ? ? ? ? 如果異常比例還是很高的話,則繼續(xù)熔斷寂玲。
? timeCount=2, 單位:秒 熔斷統(tǒng)計異常時間窗口期塔插,即統(tǒng)計異常的時間段長度。建議1-2秒
```
? SimpleFuncFuse3 = funcFuse.funcFuse(fallbackFunc=myFallBackFunc)
? @app.route(Router + "/test3", methods=['GET'])
? @SimpleFuncFuse3.fuse(timeout=2,fuseStatus=True,exceptPercent=0.5,timeWindows=5,timeCount=2)
? def fuseTest3(): #超時熔斷
? ? ? time.sleep(3)
? ? ? return "ok"
? @app.route(Router + "/test4/<int:x>/<int:y>", methods=['GET'])
? @SimpleFuncFuse3.fuse(fuseStatus=True, exceptPercent=0.5,timeWindows=5,timeCount=2)
? def fuseTest4(x, y):
? ? ? z = x / y? # 路由中輸入0嘗試錯誤熔斷
? ? ? return str(z)
```
限流器
在自己的項目中使用
```
? pip install KcangFuse
? import KcangFuse.funcFuse as funcFuse
```
? 建立限流器類拓哟,并賦予自定義的限流返回函數(shù)
```
flowControl = funcFuse.funcFlowControl(fallBackFunc=myFallBackFunc)
```
? timeWindows=2, 單位秒 限流時間窗口期
? maxCount=5? 允許請求數(shù) 即 在限流時間窗口期內(nèi) 最多允許5個請求在處理想许,可以理解為最多五個線程
? 可以和熔斷器注解一起使用!
```
? @app.route(Router + "/test5", methods=['GET'])
? @SimpleFuncFuse3.fuse(timeout=2)
? @flowControl.flowControl(timeWindows=2,maxCount=5)
? def fuseTest5(): #嘗試這個demo 即可
? ? ? time.sleep(3)
? ? ? return "ok"
```
? 可以嘗試一下下面這個demo調(diào)用上面這個接口断序,看看效果
```python
? def t5(count):
? ? ? re = requests.get("http://127.0.0.1:8080/fuse/test5")
? ? ? print(re.text + " 當(dāng)前線程:"+str(count)+"\n")
? if __name__ == '__main__':
? ? import requests,threading
? ? for i in range(0,200):
? ? ? ? threading.Thread(target=t5,args=(i,)).start()
? ? time.sleep(5)
```
結(jié)尾
后續(xù)如果有什么問題流纹,我會第一時間更新在github上,只要pip install更新版本即可