通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流...
在一般的互聯(lián)網(wǎng)應(yīng)用中限流是一個比較常見的場景,也有很多常見的方式可以實現(xiàn)對應(yīng)用的限流比如通過令牌桶通過滑動窗口等等方式都可以實現(xiàn),也可以在整個請求流程中進(jìn)行限流比如客戶端限流就是在客戶端通過隨機數(shù)直接返回成功失敗來決定是否發(fā)起請求。也可以在網(wǎng)關(guān)層直接根據(jù)一定策略丟棄一部分流量達(dá)到限流的目的,亦可請求到業(yè)務(wù)端后由業(yè)務(wù)端判斷是否進(jìn)行限流。而一般的service mesh框架會在代理的sidecar部分完成限流的工作。今天就講講dapr是如何通過簡易的配置來實現(xiàn)一個限流的。
目錄:
一、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)
二、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解
三、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr
四、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù)
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample
二、通訊框架地址:https://github.com/sd797994/Oxygen-Dapr
Dapr限流包含兩種模式,一種是客戶端限流,一種是服務(wù)端限流。
客戶端限流簡單來講就是對下游服務(wù)的一種限流保護(hù),舉個例子比如我的網(wǎng)關(guān)要保護(hù)后面的所有服務(wù),我可以配置一個ratelimit的component下游限流注入到網(wǎng)關(guān)的sidecar中,Dapr會為流經(jīng)該網(wǎng)關(guān)實例的流量的下游服務(wù)根據(jù)遠(yuǎn)程IP和路徑進(jìn)行限流,確保單位時間內(nèi)最大請求數(shù)被限制在規(guī)定范圍之內(nèi)。
? 下面我們就來模擬這種限流模式,首先我們創(chuàng)建一個類型為middleware.http.ratelimit的Component,其metadata可以設(shè)置一個maxRequestsPerSecond參數(shù),代表每秒流經(jīng)該sidecar的請求最大能通過多少前往下游服務(wù)。如果超出這個請求,則sidecar會直接返回一個429響應(yīng)碼提示客戶端請求過多
apiVersion: dapr.io/v1alpha1 kind: Component metadata:name: ratelimit spec:type: middleware.http.ratelimitversion: v1metadata:- name: maxRequestsPerSecondvalue: 1接著我們配置一個Configuration并注入到clientsample的deployment中(注意紅字部分)
apiVersion: dapr.io/v1alpha1 kind: Configuration metadata:name: appconfig spec:httpPipeline:handlers:- name: ratelimittype: middleware.http.ratelimitapiVersion: apps/v1 kind: Deployment metadata:name: clientsamplelabels:app: clientsample spec: replicas: 1selector:matchLabels:app: clientsampletemplate: metadata:labels: app: clientsampleannotations:dapr.io/enabled: "true"dapr.io/app-id: "clientsample"dapr.io/app-port: "80"dapr.io/config: "appconfig"spec:containers:- name: webimage: clientsample:releaseimagePullPolicy: Neverports:- containerPort: 80現(xiàn)在我們在代碼中,讓clientsample通過多現(xiàn)成同時發(fā)起10個下游請求
public async Task<dynamic> Call(){var result1 = new OutDto();var remoteService = serviceProxyFactory.CreateProxy<IHelloService>();var tasks = new Task<OutDto>[10];for (int i = 0; i < 10; i++){tasks[i] = remoteService.HelloWorldByName(new InputDto() { Name = "xiaoming" });}await Task.WhenAll(tasks);foreach (var item in tasks){Console.WriteLine($"result is :{(item.GetAwaiter().GetResult().Word ?? "noresult")}");}return "操作完成";}可以看到并發(fā)訪問10條task,只有1條返回了result,其余的請求發(fā)送到自己的sidecar后就直接返回429然后被通訊框架捕獲429后拋到日志中。
接下來我們看看服務(wù)端模式,服務(wù)端模式顧名思義就是保護(hù)自己,確保所有流向自己的請求會以一個限定頻率被處理,有點類似于C#的semaphore,通過信號量來阻塞線程并發(fā)訪問數(shù)。注意該模式并不是通過限制每秒流量來實現(xiàn)的,而是指同時只能有多個請求被處理。
接著我們看看yaml需要調(diào)整的部分,通過dapr.io/app-max-concurrency參數(shù)即可實現(xiàn)并發(fā)數(shù)控制
apiVersion: apps/v1 kind: Deployment metadata:name: servicesamplelabels:app: servicesample spec: replicas: 1selector:matchLabels:app: servicesampletemplate: metadata:labels: app: servicesampleannotations:dapr.io/enabled: "true"dapr.io/app-id: "servicesample"dapr.io/app-port: "80"dapr.io/app-max-concurrency: "1"spec:containers:- name: webimage: servicesample:releaseimagePullPolicy: Neverports:- containerPort: 80clientsample不用修改,我們在servicesample的方法中增加以下模擬耗時操作
重新生成后(注意需要刪除之前配置在clientsample上的dapr.io/config),我們通過postman模擬發(fā)起請求:
可以看到請求全部都執(zhí)行成功并獲取回調(diào)了,但是整個請求耗時是10秒,恰好就是一次處理1個請求,單個請求耗時1秒得到的結(jié)果,我們可以再次驗證一下將app-max-concurrency設(shè)置為2,應(yīng)該會5秒請求完畢:
可以看到信號量每次放入了兩個線程同步處理,我們的請求確實被壓縮到了5秒處理完畢。
整個限流其實分為下游限流+并發(fā)控制兩種方式,其實都是為了保護(hù)自己/下游服務(wù)。另外大家注意一下如果你的請求并不是通過sidecar進(jìn)入到服務(wù)的比如直接暴露服務(wù)端口到network或通過ingress+service的方式訪問應(yīng)用也就是說流量不走sidecar,則無法通過dapr進(jìn)行限流!關(guān)于限流今天就到這,下次分享一下如何做鏈路監(jiān)控~
相關(guān)文章:
Dapr能否引領(lǐng)云原生中間件的未來?
云原生 | 阿里巴巴的Dapr實踐與探索
Dapr | 云原生的抽象與實現(xiàn)
Dapr 可視化指南
Dapr 知多少 | 分布式應(yīng)用運行時
Dapr 正式發(fā)布 1.0
Dapr 交通流量控制示例
Dapr是如何簡化微服務(wù)的開發(fā)和部署
微軟開源微服務(wù)運行時Dapr,賦能云原生應(yīng)用開發(fā)
YARP實現(xiàn)Dapr服務(wù)調(diào)用的反向代理
Dapr微服務(wù)應(yīng)用開發(fā)系列0:概述
Dapr微服務(wù)應(yīng)用開發(fā)系列1:環(huán)境配置
Dapr微服務(wù)應(yīng)用開發(fā)系列2:Hello World與SDK初接觸
Dapr微服務(wù)應(yīng)用開發(fā)系列3:服務(wù)調(diào)用構(gòu)件塊
Dapr微服務(wù)應(yīng)用開發(fā)系列4:狀態(tài)管理構(gòu)件塊
Dapr微服務(wù)應(yīng)用開發(fā)系列5:發(fā)布訂閱構(gòu)建塊
Windows環(huán)境下Dapr入門
云原生 | .NET 5 with Dapr 初體驗
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù)
總結(jié)
以上是生活随笔為你收集整理的通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记一次 .NET医院公众号程序 线程CP
- 下一篇: java信息管理系统总结_java实现科