通過Dapr實現一個簡單的基於.net的微服務電商系統(十六)——dapr+sentinel中介軟體實現服務保護

a1010發表於2021-06-03

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

目錄:
一、通過Dapr實現一個簡單的基於.net的微服務電商系統

二、通過Dapr實現一個簡單的基於.net的微服務電商系統(二)——通訊框架講解

三、通過Dapr實現一個簡單的基於.net的微服務電商系統(三)——一步一步教你如何擼Dapr

四、通過Dapr實現一個簡單的基於.net的微服務電商系統(四)——一步一步教你如何擼Dapr之訂閱釋出

五、通過Dapr實現一個簡單的基於.net的微服務電商系統(五)——一步一步教你如何擼Dapr之狀態管理

六、通過Dapr實現一個簡單的基於.net的微服務電商系統(六)——一步一步教你如何擼Dapr之Actor服務

七、通過Dapr實現一個簡單的基於.net的微服務電商系統(七)——一步一步教你如何擼Dapr之服務限流

八、通過Dapr實現一個簡單的基於.net的微服務電商系統(八)——一步一步教你如何擼Dapr之鏈路追蹤

九、通過Dapr實現一個簡單的基於.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權 && 百度版Oauth2

十、通過Dapr實現一個簡單的基於.net的微服務電商系統(十)——一步一步教你如何擼Dapr之繫結

十一、通過Dapr實現一個簡單的基於.net的微服務電商系統(十一)——一步一步教你如何擼Dapr之自動擴/縮容

十二、通過Dapr實現一個簡單的基於.net的微服務電商系統(十二)——istio+dapr構建多執行時服務網格

十三、通過Dapr實現一個簡單的基於.net的微服務電商系統(十三)——istio+dapr構建多執行時服務網格之生產環境部署

十四、通過Dapr實現一個簡單的基於.net的微服務電商系統(十四)——開發環境容器除錯小技巧

十五、通過Dapr實現一個簡單的基於.net的微服務電商系統(十五)——集中式介面文件實現

十六、通過Dapr實現一個簡單的基於.net的微服務電商系統(十六)——dapr+sentinel中介軟體實現服務保護
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址

二、通訊框架地址

  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
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apigateway
  namespace: dapreshop
spec:
  selector:
    matchLabels:
      app: apigateway
  replicas: 1
  template:
    metadata:
      labels:
        app: apigateway
        version: v1
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "apigateway"
        dapr.io/app-port: "80"
        dapr.io/config: "sentinelconfig"
......

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

 

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

 

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

相關文章