探究EnvoyProxy的流量限制

Envoy已在服務網格和代理世界中得到了不少歡迎。這是一項了不得的技術,但有時有些難以理解。我一直在玩的一件事是使用Envoy來執行速率限制。幸運的是,限速是Envoy的頭等公民。然而,閱讀率限制的文檔有不少概念,這就可能致使咱們很難運行一個demo。通過探索,我對Envoy的限速理念和概念作一些總結。 Envoy容許咱們同時配置TCP和HTTP速率限制過濾器,但在本文中咱們將重點介紹HTTP。git

Rate Limit Service

在查看這一切在Envoy中的工做方式時,咱們注意到的第一件事是Envoy但願您定義速率限制服務。這是由於Envoy自己沒有機制來肯定是否應讓請求經過或限制請求。這是有道理的,由於有時這須要代理可能不該該是全部者的信息。很酷的事情是,Envoy但願從限速服務中得到的接口已被詳細記錄。因爲這是一個gRPC API(與Envoy的其餘控制平面和數據平面API同樣),所以能夠很容易地從響應該模式的服務開始。爲了使事情變得更好,Lyft最近發佈了響應該接口的服務版本:https://github.com/lyft/ratel...github

要使用Envoy的配置文件配置此服務,咱們須要執行如下操做:算法

rate_limit_service:
    grpc_service:
        envoy_grpc:
            cluster_name: my_rate_limit_service
        timeout: 0.25s

可是要使咱們的限速服務正常工做,咱們須要一些信息。該信息與gRPC請求一塊兒發送,咱們能夠在這裏查看:https://github.com/envoyproxy...json

率限制請求有三個字段:api

  • domain 讓envoy告訴咱們的限速請求,咱們系統中的哪些設備正在要求這些限速。這對於避免可能因domain而異的鍵衝突頗有用。
  • hits_addend 是envoy爲該請求指定額外費用的一種方式,例如,更昂貴的路線。我很好奇爲何要在請求中,而不是讓服務來決定,但這仍然頗有趣。
  • 最後,descriptors 是速率限制請求的關鍵。它是一組描述此請求上下文的鍵值對。它們能夠幫助咱們的限速服務計算密鑰,識別參與者等。

Descriptors

當我第一次閱讀gRPC接口時,這一切對我來講頗有意義。但立刻產生一個疑問,我不清楚如何配置descriptors。個人目標是可以根據用戶的HTTP_AUTHORIZATION標頭對限制用戶進行評分,很難看到如何發送帶有標頭值的描述符值。這是一個運行時值,可能會隨每一個請求而變化,所以將其做爲靜態配置沒有任何意義。 這是速率限制操做起做用的地方。服務器

Actions

到目前爲止,咱們涉及的內容是咱們的限速服務的一部分,以便讓咱們作出正確的決定。可是,咱們仍然不知道Envoy如何填充這些數據,甚至不知道咱們如何發送感興趣的數據。在envoy中配置的路由能夠選擇定義RateLimit配置,定義動做。動做是構建descriptor的一種方法:經過配置動做,咱們使Envoy知道咱們但願它如何使用幾個不一樣的選項來構建要發送到速率限制服務的descriptor列表。dom

例如,若是咱們想對請求的Authorization標頭實現速率限制,則能夠指示envoy經過如下操做構建此類descriptor:設計

rate_limit:
  actions:
  - request_headers:
      header_name: HTTP_AUTHORIZATION
      descriptor_key: auth_token

如今,在進行此配置的狀況下,速率限制服務將收到如下descriptor列表:代理

[
  "key": "auth_token",
  "value": "1ae59f456ff7ec1185c03b781f955a4e"
]

這是咱們的限速服務將作出決定的地方。基於該descriptor集(此示例中只有1個),咱們能夠查找密鑰,使用某種速率限制算法(令牌桶,滑動窗口等)對密鑰進行速率限制,而後將決策發送回envoy。注意,能夠定義多個動做,在此進行解釋code

這裏更復雜的是發送多個descriptor時。descriptor條目是分層的,這意味着條目能夠創建在其餘條目之上。

速率限制請求的主要消息。速率限制服務被設計爲徹底通用的,由於它能夠在任意層次的鍵/值對上運行。加載的配置將解析請求並找到最具體的限制。此外,RateLimitRequest能夠包含多個「descriptor」以進行限制。當提供多個descriptor時,服務器將限制它們的所有,若是其中任何一個超出限制,則返回OVER_LIMIT響應。若是須要,這將啓用更復雜的應用程序級別速率限制方案。

如您所見,Envoy中的速率限制很是通用且強大。

相關文章
相關標籤/搜索