envoy實現 自己動手實現乙個envoy限流器

2021-10-17 06:43:36 字數 1288 閱讀 7641

envoy ratelimit

envoy 可以繼承乙個全域性grpc ratelimit 服務,稱之為為rate limit service,

go-control-plane 是乙個官方實現的golang 庫github.com/envoyproxy/go-control-plane

go-control-plane中關於rls的pb檔案為envoy/service/ratelimit/v2/rls.pb.go

其包含了乙個registerratelimitserviceserver方法,將乙個限流器實現註冊到grpcserver

func registerratelimitserviceserver(s *grpc.server, srv ratelimitserviceserver)

func (r ratelimitservice) shouldratelimit(ctx context.context, request *pb.ratelimitrequest) (*pb.ratelimitresponse, error) , nil

註冊限流實現

在main函式中,將我們的限流器註冊到grpcserver,呼叫reflection.register(s)方便我們使用grpcurl進行除錯。

func main() )

reflection.register(s)

s.serve(listener)

新增限流邏輯

這裡將通過redis固定視窗實現限流器,限制每分鐘不能超過2個請求,超過則處罰限流

func (r ratelimitservice) shouldratelimit(ctx context.context, request *pb.ratelimitrequest) (*pb.ratelimitresponse, error) else , err

if count,_:=strconv.atoi(fmt.sprint(reply));count>2 , nil

if _, err := conn.do("incr", uq); err != nil , err

return &pb.ratelimitresponse, nil

我們通過 timestamp除去60獲取乙個時間視窗,在時間視窗內將訪問次數進行累加,當達到閾值返回overlimit,這裡並沒有進行ttl設定,生產級別實現需要對rediskey 設定ttl,自動刪除過期的key,這個使用overallcode進行統一返回,實際上我們針對每個descriptor可以進行單獨設定,並且可以設定limit_remaining,讓客戶端可以獲取當前剩餘的可訪問次數

掃瞄關注我:

自己動手程式設計實現乙個shell

這是本部落格的第乙個文章 主要介紹如何用 c 語言基於linux系統來實現乙個簡單shell,diy 乙個shell。通過自己程式設計實現乙個linux下的 shell,可以使得個人對程序的概念 程序的通訊和作業系統的執行的理解更加的深刻。還會大大增加個人學習的成就感,提供學習興趣。這乙個文章 被命...

自己動手實現乙個MVVM庫

我們知道的,常見的資料繫結的實現方法 1 資料劫持 vue 通過object.defineproperty 去劫持資料每個屬性對應的getter和setter 2 髒值檢測 angular 通過特定事件比如input,change,xhr請求等進行髒值檢測。3 發布 訂閱模式 backbone 通過...

自己動手實現乙個簡單的React

為了更好的理解react,我決定讀preact的原始碼,preact是乙個非常小的框架,同時也和react的實現原理以及api一樣,幾乎可以很好代替react。雖然還是有一些差異的。但是使用的時候幾乎不會有什麼違和感。看原始碼總是不夠過癮,於是做了乙個偉大的決定就是自己親手去寫乙個react,畢竟p...