在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接返回成功失败来决定是否发起请求。也可以在网关层直接根据一定策略丢弃一部分流量达到限流的目的,亦可请求到业务端后由业务端判断是否进行限流。而一般的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. Spring注解@PropertySource加载配置文件和SpringBoot注解@Value、@ConfigurationProperties进行属性映射

    SpringBoot的配置文件 位置:resources目录下 配置文件的作用: (1).SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用a ...

  2. redis数据结构和对象二

    跳跃表(skiplist) 跳跃表是一种有序数据结构.跳跃表支持平均O(logN),最坏O(N)复杂度的节点查找,大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树简单,所有不 ...

  3. Bullet碰撞检测

    DBVT 在bullet 引擎中是很基础且重要的一个数据结构,本质上是一个可以动态更新的AABB树. 碰撞响应的分析 约束分类:可积约束,不可积约束 ,摩擦力(见[1]第四章) 整个bullet在动力 ...

  4. JVM 中的垃圾回收

    说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...

  5. WAV16T VPX国产化千兆交换板

      WAV16T是基于盛科CTC5160设计的国产化3U三层千兆VPX交换板,提供16路千兆电口,采用龙芯 2K1000处理器.支持常规的L2/L3协议,支持Telnet.SNMP.WEB,CLI等多 ...

  6. 超详细Linux新手快速入门(一)——Linux的介绍安装以及虚拟机的介绍安装

    一.Linux的介绍 1.Linux和Windows的比较  Linux是一款操作系统,其性能稳定,因其防火墙组件高效安全.简单易配置,所以获得了追求速度和安全的一些企业和人群的青睐.与我们日常所熟知 ...

  7. linux云服务搭建Minecraft服务器

    1 准备工作 以下内容全部要在root用户内完成 1.1 安装文件传输工具 为了方便传文件到服务器上,这里先装一个远程传输工具. yum -y install lrzsz 1.2 安装java Min ...

  8. 2019HDU多校第一场 6582 Path 【最短路+最大流最小割】

    一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to] ...

  9. weex参考文章

    1官网:https://weex.apache.org/zh/guide/introduction.html 2.weexui   https://alibaba.github.io/weex-ui/ ...

  10. 安装RPM包或者源码包

    RPM工具 RPM他是以一种数据库记录的方式将我们所需要的套件安装到linux主机的一套管理程序关于RPM各个选项的含义如下-i:表示安装-v:表示可视化-h:表示安装进度在安装RPM包时,常用的附带 ...