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中間件實現服務保護
十七、通過Dapr實現一個簡單的基於.net的微服務電商系統(十七)——服務保護之動態配置與熱重載
十八、通過Dapr實現一個簡單的基於.net的微服務電商系統(十八)——服務保護之多級緩存
十九、通過Dapr實現一個簡單的基於.net的微服務電商系統(十九)——分布式事務之Saga模式
二十、通過Dapr實現一個簡單的基於.net的微服務電商系統(二十)——Saga框架實現思路分享
附錄:(如果你覺得對你有用,請給個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~