.NET8 gRPC服务如何为不同RPC方法配置独立并发限流策略?
可以给Get和Set方法分别配置不同的限流规则,以下是两种可行的实现方案:
方案一:单独映射每个RPC方法,指定对应限流策略
这种方式直观清晰,直接为每个方法单独配置限流规则:
1. 注册不同的限流策略
先在服务注册阶段,为Get和Set分别定义独立的并发限流策略:
services.AddRateLimiter(options => { // Get方法专属限流策略 options.AddConcurrencyLimiter("GetConcurrencyPolicy", policy => { policy.PermitLimit = 100; // 自定义Get方法的并发许可数 policy.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; policy.QueueLimit = 80; // Get方法的排队请求上限 }); // Set方法专属限流策略(比如Set操作更耗资源,可设置更严格的限制) options.AddConcurrencyLimiter("SetConcurrencyPolicy", policy => { policy.PermitLimit = 60; policy.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; policy.QueueLimit = 60; }); // 全局请求拒绝处理逻辑(也可为每个策略单独配置OnRejected) options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 503; await context.HttpContext.Response.WriteAsync("服务当前请求过多,请稍后重试...", cancellationToken: token); }; });
2. 单独映射每个RPC方法并绑定策略
不再使用MapGrpcService批量映射,而是为每个方法单独配置:
// 给Get方法绑定对应的限流策略 endpoints.MapGrpcMethod<MyService>(nameof(MyService.Get)) .RequireRateLimiting("GetConcurrencyPolicy"); // 给Set方法绑定对应的限流策略 endpoints.MapGrpcMethod<MyService>(nameof(MyService.Set)) .RequireRateLimiting("SetConcurrencyPolicy");
方案二:通过策略匹配规则,自动识别RPC方法并应用策略
适合RPC方法较多的场景,无需逐个映射,通过请求路径匹配自动选择策略:
1. 注册带匹配条件的限流策略
利用gRPC请求路径的固定格式(/服务名/方法名),为每个策略添加匹配规则:
services.AddRateLimiter(options => { options.AddConcurrencyLimiter("GetConcurrencyPolicy", policy => { policy.PermitLimit = 100; policy.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; policy.QueueLimit = 80; // 匹配Get方法的请求路径:对应proto中的My_Service/Get policy.Match = context => context.HttpContext.Request.Path.StartsWithSegments("/My_Service/Get"); }); options.AddConcurrencyLimiter("SetConcurrencyPolicy", policy => { policy.PermitLimit = 60; policy.QueueProcessingOrder = QueueProcessingOrder.OldestFirst; policy.QueueLimit = 60; // 匹配Set方法的请求路径:对应proto中的My_Service/Set policy.Match = context => context.HttpContext.Request.Path.StartsWithSegments("/My_Service/Set"); }); options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = 503; await context.HttpContext.Response.WriteAsync("服务当前请求过多,请稍后重试...", cancellationToken: token); }; });
2. 为整个服务绑定所有策略
只需一次映射,RateLimiter会自动根据请求路径匹配对应策略:
endpoints.MapGrpcService<MyService>() .RequireRateLimiting("GetConcurrencyPolicy", "SetConcurrencyPolicy");
内容的提问来源于stack exchange,提问作者CodeMonkey
相关产品推荐
相关产品推荐

