在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接返回成功失败来决定是否发起请求。也可以在网关层直接根据一定策略丢弃一部分流量达到限流的目的,亦可请求到业务端后由业务端判断是否进行限流。而一般的service mesh框架会在代理的sidecar部分完成限流的工作。今天就讲讲dapr是如何通过简易的配置来实现一个限流的。

目录:
一、通过Dapr实现一个简单的基于.net的微服务电商系统

二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

三、通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

四、通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

五、通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

六、通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

七、通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流
附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址

二、通讯框架地址

  Dapr限流包含两种模式,一种是客户端限流,一种是服务端限流。

  客户端限流简单来讲就是对下游服务的一种限流保护,举个例子比如我的网关要保护后面的所有服务,我可以配置一个ratelimit的component下游限流注入到网关的sidecar中,Dapr会为流经该网关实例的流量的下游服务根据远程IP和路径进行限流,确保单位时间内最大请求数被限制在规定范围之内。

  下面我们就来模拟这种限流模式,首先我们创建一个类型为middleware.http.ratelimit的Component,其metadata可以设置一个maxRequestsPerSecond参数,代表每秒流经该sidecar的请求最大能通过多少前往下游服务。如果超出这个请求,则sidecar会直接返回一个429响应码提示客户端请求过多

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: ratelimit
spec:
type: middleware.http.ratelimit
version: v1
metadata:
- name: maxRequestsPerSecond
value: 1

  接着我们配置一个Configuration并注入到clientsample的deployment中(注意红字部分)

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
httpPipeline:
handlers:
- name: ratelimit
type: middleware.http.ratelimit
apiVersion: apps/v1
kind: Deployment
metadata:
name: clientsample
labels:
app: clientsample
spec:
replicas: 1
selector:
matchLabels:
app: clientsample
template:
metadata:
labels:
app: clientsample
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "clientsample"
dapr.io/app-port: "80"
dapr.io/config: "appconfig"
spec:
containers:
- name: web
image: clientsample:release
imagePullPolicy: Never
ports:
- containerPort: 80

  现在我们在代码中,让clientsample通过多现成同时发起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 "操作完成";
}

  可以看到并发访问10条task,只有1条返回了result,其余的请求发送到自己的sidecar后就直接返回429然后被通讯框架捕获429后抛到日志中。

  接下来我们看看服务端模式,服务端模式顾名思义就是保护自己,确保所有流向自己的请求会以一个限定频率被处理,有点类似于C#的semaphore,通过信号量来阻塞线程并发访问数。注意该模式并不是通过限制每秒流量来实现的,而是指同时只能有多个请求被处理。

  接着我们看看yaml需要调整的部分,通过dapr.io/app-max-concurrency参数即可实现并发数控制

apiVersion: apps/v1
kind: Deployment
metadata:
name: servicesample
labels:
app: servicesample
spec:
replicas: 1
selector:
matchLabels:
app: servicesample
template:
metadata:
labels:
app: servicesample
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "servicesample"
dapr.io/app-port: "80"
dapr.io/app-max-concurrency: "1"
spec:
containers:
- name: web
image: servicesample:release
imagePullPolicy: Never
ports:
- containerPort: 80

  clientsample不用修改,我们在servicesample的方法中增加以下模拟耗时操作

  重新生成后(注意需要删除之前配置在clientsample上的dapr.io/config),我们通过postman模拟发起请求:

  可以看到请求全部都执行成功并获取回调了,但是整个请求耗时是10秒,恰好就是一次处理1个请求,单个请求耗时1秒得到的结果,我们可以再次验证一下将app-max-concurrency设置为2,应该会5秒请求完毕:

  可以看到信号量每次放入了两个线程同步处理,我们的请求确实被压缩到了5秒处理完毕。

  整个限流其实分为下游限流+并发控制两种方式,其实都是为了保护自己/下游服务。另外大家注意一下如果你的请求并不是通过sidecar进入到服务的比如直接暴露服务端口到network或通过ingress+service的方式访问应用也就是说流量不走sidecar,则无法通过dapr进行限流!关于限流今天就到这,下次分享一下如何做链路监控~

通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流的更多相关文章

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统

    本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

    目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

    Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定

    如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...

随机推荐

  1. Tomcat 安装Manager

    sudo apt-get install tomcat8-admin tomcat8-docs tomcat8-examplessudo vi /etc/tomcat8/tomcat-users.xm ...

  2. 完全基于node的web应用

    完全基于node的web应用 node js web fs fs文件路径 事实上通常"正确的方式"一般都不简单. 用例 模块 基本http服务器 基于事件驱动回调 模块化serve ...

  3. 使用.net5 创建具有身份验证和授权的Blazor应用程序

     

  4. Mac忘记密码

    1.启动电脑的时候,按住 Command+R,直到苹果的图标出现,松开,等待进入... 2.直接点击菜单栏上有个功能里面有 "终端" 功能,点击打开. 3.在终端页面里输入---& ...

  5. 关于python中的[::-1],[:,:,::-1]的反转理解

    其实就是单纯的关于反转,我们只需要记住每一个列表的中间有两个冒号: 即[a: b:c],意思是从a到b,间隔是c,因为经常省略c,所以经常看到[a:b]. 一.在一维数据中的反转 import num ...

  6. 在Fedora中安装PostgreSQL并配置密码和开启远程登陆

    在Fedora中安装PostgreSQL并配置密码 首先先放出官方的文档教程 :https://fedoraproject.org/wiki/PostgreSQL 我写的内容其实也八九不离十,站在一个 ...

  7. MySQL 40题练习题和答案

    2.查询"生物"课程比"物理"课程成绩高的所有学生的学号: 思路:    获取所有有生物课程的人(学号,成绩) - 临时表    获取所有有物理课程的人(学号, ...

  8. web之面试常问问题:如何实现水平垂直居中?

    前提准备,在HTML页面中定义一个div,div中内容自定义. <div class="box sc">致我们呼啸而过的青春</div> 样式: div.b ...

  9. 卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和Mo ...

  10. AmazonS3 使用AWS SDK for Java实现跨源资源共享 (CORS)

    CORS 配置 创建 CORS 配置并对存储桶设置该配置 通过添加规则来检索并修改配置 向存储桶添加修改过的配置 删除配置 import com.amazonaws.AmazonServiceExce ...