python 熔斷器,限流器,實現(xiàn)服務(wù)的熔斷和限流,也可以應(yīng)用與其他場景的函數(shù)超時處理和異常錯誤處理。

基于函數(shù)的 熔斷器,限流器

上一篇博文寫了我的naocs sdk,但啥都有了,那微服務(wù)關(guān)鍵的熔斷和限流的功能也必須安排上。雖然說是微服務(wù)的熔斷器和限流器,但是你只要導入并創(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)

```


? 當開啟熔斷時,即返回自定義熔斷返回函數(shù),不開啟根據(jù)情況返回其他兩個


```

? SimpleFuncFuse1 = funcFuse.funcFuse()#不設(shè)置則使用內(nèi)置默認錯誤返回函數(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ā)生異常,熔斷器會將詳細的函數(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時則表示開啟熔斷器模式(默認是關(guān)閉的)

? exceptPercent=0.5, 0-1之間 異常比例,即在熔斷統(tǒng)計時間窗口期內(nèi)發(fā)生異常的比例

? timeWindows=5, 單位:秒 熔斷時間窗口期,即觸發(fā)熔斷后熔斷多久,熔斷時間窗口期過去后,會自動再放開請求進去,

? ? ? ? ? ? ? ? 如果異常比例還是很高的話,則繼續(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 + " 當前線程:"+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更新版本即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容