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...