通過 Dapr 實現一個簡單的基於 dotnet 的微服務電商系統——dapr-sentinel 中間件實現服務保護

  dapr 目前更新到了 1.2 版本,在之前 4 月份的時候來自阿里的開發工程師發起了一個 dapr 集成 Alibaba Sentinel 的提案,很快被社區加入到了 1.2 的里程碑中並且在 1.2 release 相關升級文檔裏可以看到已經實現了對 Alibaba Sentinel 的支持。今天我們就講講我們如何通過 Sentinel 實現對我們接口的保護。

附錄:(如果你覺得對你有用,請給個 star)
一、電商 Demo 地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample

二、通訊框架地址:https://github.com/sd797994/Oxygen-Dapr

  dapr 的發展確實很快,在 4 月份開始這個基於 dapr1.0 的系列在服務治理這塊 dapr 還僅僅只能依靠基於 middleware.http.ratelimit 的對下游進行粗粒度的服務保護,或者基於 app-max-concurrency 來約束來自上游的併發數。僅僅兩個小版本後 dapr 就通過 component 實現了對 sentinel 的支持,不得不說社區的反應速度還是很快的。那 sentinel 到底是個什麼呢?在 sentinel 官網開篇的一句話簡介裏是這麼描述的:“sentinel 是面向分佈式服務架構的高可用防護組件,主要以流量爲切入點,從流量控制、熔斷降級、系統自適應保護等多個維度來幫助用戶保障微服務的穩定性。”,所以 sentinel 提供的是分佈式應用四大類基本需求中之一——網絡需求這塊的相關部分能力。也就是微服務常見的限流、熔斷降級等服務保護能力,而 dapr 通過模塊化的 component 讓開發者可以快速集成 sentinel 只需要配置不同的規則約束告知 dapr sidecar 即可獲取相關的下游服務保護能力。sentinel 組件本身成熟度也挺高的,在阿里內部廣泛使用了多年,並且對 Dubbo、Spring Cloud、gRPC、Zuul、Reactor、Quarkus 等框架都做了集成,所以目前我們可以放心的使用它。

  今天的案例我們簡單的模擬一下使用 sentinel 的限流能力來對我們下游服務特定接口提供保護能力,依然使用我們目前這套電商 demo 來完成,由於 sentinel 是對下游服務進行保護,所以我們需要將相關的規則寫入到我們的 apigateway 對應的 sidecar 中,這樣確保來自於客戶端的請求都會被正確的限制流量,接下來我們來限制一下對 accountservice 的 accountquery/checkrolebasedaccesscontroler 這個接口做流量限制,按照 1 秒 10 次的方式,component 如下:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: sentinel
  namespace: dapreshop
spec:
  type: middleware.http.sentinel
  version: v1
  metadata:
  - name: appName
    value: "accountflowrule"
  - name: logDir
    value: "/tmp"
  - name: flowRules
    value: >-
      [
        {
          "resource": "POST:/v1.0/invoke/accountservice/method/accountquery/checkrolebasedaccesscontroler",
          "threshold": 10,
          "tokenCalculateStrategy": 0,
          "controlBehavior": 0
        }
      ]

  這條規則告訴 dapr 我們需要啓動 sentinel 中間件,並且注入一條規則規定對下游資源 (resource) 的訪問維持在 10 次 / 秒(threshold),其中流量控制器的 Token 計算策略(tokenCalculateStrategy)採用默認也就是以 threshold 作爲閾值,超出的請求部分採用的策略(controlBehavior)是拒絕服務。接着我們創建一個 Configuration 並注入到我們的 apigateway 這個 deployment 中:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: sentinelconfig
  namespace: dapreshop
spec:
  httpPipeline:
    handlers:
      - name: sentinel
        type: middleware.http.sentinel

  接着我們 apply 一下將 compenent 註冊到 dapr 環境中,並且重啓我們的 apigateway。重啓完成後我們查看一下 apigateway sidecar 的日誌可以看到配置已經正確的注入進去了並且已經成功的 enabled sentinel:

   接下來我們啓動一個測試程序通過 apigateway 暴露到內網的地址來訪問這個接口,其最終結果如下:

   可以看到 sentinel 成功的完成了對接口的保護工作,將我們的接口請求頻率維持在了 10 次 / 秒的基礎上。好了,今天的分享就到這裏,照例歡迎轉發 fork + star~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lFC69FNpQFOWrCFvwMUEgw