
Dapr .NetCore 并发限流
限流控制
使用限制dapr中间件来限制每秒请求数(当dapr请求dapr的时候我们进行限流),大致如下图所示:
创建限流组件
在~/.dapr/components/
下创建限流中间件,文件名为bf.yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: ratelimit
spec:
type: middleware.http.ratelimit
version: v1
metadata:
- name: maxRequestsPerSecond
value: 1
将maxRequestsPerSecond
设置为1,表示同一时间内最多允许一个请求处理
添加相关dapr配置
在~/.dapr/config.yaml
进行添加中间件配置
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
tracing:
samplingRate: "1"
zipkin:
endpointAddress: http://localhost:9411/api/v2/spans
httpPipeline:
handlers:
- name: ratelimit
type: middleware.http.ratelimit
注意我这里修改在之后运行的项目将全部都受到影响,建议自行定义一个config yaml并在运行时单独运用。
客户端代码定义
对myserver appid进行请求/Request/v3
方法。
[HttpGet("sendv3")]
public async Task<string> Sendv3()
{
_logger.LogInformation($"进来了");
var idnumber = new Random().Next(0,99);
var mydata = new MyClass(idnumber,$"MyClass{idnumber}");
var client = DaprClient.CreateInvokeHttpClient(appId: "myserver");
// http的方式
var response = await client.PostAsJsonAsync("/Request/v3", mydata);
if (response.IsSuccessStatusCode)
{
var newdata = await response.Content.ReadFromJsonAsync<MyClass>();
_logger.LogInformation($"得到服务器端处理的新数据:{newdata.Id} {newdata.Name}");
return JsonConvert.SerializeObject(newdata);
}else{
return "bad";
}
}
public class MyClass
{
public MyClass(){}
public MyClass(int id,string name)
{
Id = id;
Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
}
服务器端定义
我们让其等待三秒
[HttpPost("v3")]
public MyClass Getv3(MyClass myClass)
{
Thread.Sleep(3000);
_logger.LogInformation($"{DateTime.Now} {myClass.Id} {myClass.Name} finish!");
myClass.Name = myClass.Name + " ---- Finish";
return myClass;
}
运行测试
dapr run --app-id myserver --app-port 5002 --dapr-http-port 3501 -- dotnet InvokeMethodServer.dll --urls="http://*:5002"
dapr run --app-id dotnetapp --app-port 5001 --dapr-http-port 3500 -- dotnet InvokeMethod.dll --urls="http://*:5001"
我们通过Jmeter进行10个并发请求进行测试
我们并发请求了10个但是只处理了一个,其他的都失败了。并且吞吐量控制在了3.1/sec
。
可能会有一些同志感到又些疑惑,既然是全局限流,为啥子客户端不受影响。因为我们请求的客户端方法不是通过dapr的中间件去请求的,所以自然也不会受影响。
(接下来dapr还提供一种并发控制)
并发控制
dapr另一种控制是:dapr边车访问应用时进行限制。参考下图所示
我们先去掉中间件处理。然后运行服务器端时添加上app-max-concurrency
参数,用于设置最大并发处理的数量。
dapr run --app-max-concurrency 1 --app-id myserver --app-port 5002 --dapr-http-port 3501 -- dotnet InvokeMethodServer.dll --urls="http://*:5002"
在k8s中可以这样添加上这个字段
dapr.io/app-max-concurrency: "1"
自行尝试吧
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术