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~