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

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

目录:

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

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

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

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

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

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

附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample

二、通讯框架地址:https://github.com/sd797994/Oxygen-Dapr

  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.ratelimitversion: v1metadata:- name: maxRequestsPerSecondvalue: 1

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

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:name: appconfig
spec:httpPipeline:handlers:- name: ratelimittype: middleware.http.ratelimit
apiVersion: 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

  现在我们在代码中,让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: 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: 80

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

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

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

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

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

相关文章:

  • Dapr能否引领云原生中间件的未来?

  • 云原生 | 阿里巴巴的Dapr实践与探索

  • Dapr | 云原生的抽象与实现

  • Dapr 可视化指南

  • Dapr 知多少 | 分布式应用运行时

  • Dapr 正式发布 1.0

  • Dapr 交通流量控制示例

  • Dapr是如何简化微服务的开发和部署

  • 微软开源微服务运行时Dapr,赋能云原生应用开发

  • YARP实现Dapr服务调用的反向代理

  • Dapr微服务应用开发系列0:概述

  • Dapr微服务应用开发系列1:环境配置

  • Dapr微服务应用开发系列2:Hello World与SDK初接触

  • Dapr微服务应用开发系列3:服务调用构件块

  • Dapr微服务应用开发系列4:状态管理构件块

  • Dapr微服务应用开发系列5:发布订阅构建块

  • Windows环境下Dapr入门

  • 云原生 | .NET 5 with Dapr 初体验

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转)完美画质 3D游戏反锯齿技术浅析 .

完美的画面已经离我们不再遥远——反锯齿技术浅析 不管现今的游戏画面有多完美&#xff0c;人物和环境有多真实&#xff0c;但游戏画面的构成的主要方式仍然没有得到改善&#xff1a;一帧画面由成千上万像素构成。这意味着物体多边形的轮廓最终是锯齿状的图形。所以画面质量不可…

业余时间学数据分析,如何快速上手

广泛被应用的数据分析谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c;通过其相似性算法&#xff0c;为不同的人…

java连接mysql数据库连接池_java使用原生MySQL实现数据的增删改查以及数据库连接池技术...

一、工具类及配置文件准备工作1.1 引入jar包使用原生MySQL&#xff0c;只需要用到MySQL连接的jar包&#xff0c;maven引用方式如下&#xff1a;mysqlmysql-connector-java5.1.481.2 jdbc.properties文件配置在resources文件夹根目录&#xff0c;新增jdbc.properties配置文件&am…

64位Visual Studio 2022,微软在下一盘大棋!

有没有跟我一样奇怪过&#xff0c;都2021年了&#xff0c;用的还是VS2019&#xff1f;原来微软是憋大招去了&#xff0c;4月18号Amanda的一篇博文宣布了一则重磅消息——Visual Studio 2022 首个预览版将于今年夏季发布 &#xff0c;并且终于成为万众期待的 64 位版&#xff01…

如何添加自定义icon

(1)一般命令行程序编译后是一个方框图标。 我们可以自定义&#xff1a; Project -> Add to project -> New... 选择Resource Script&#xff0c;新建一个资源脚本&#xff0c;这样左面就多了一个资源视图 然后Project -> Add to project -> File&#xff0c;加进…

mysql 5.7.17 源码安装_mysql5.7.17源码安装

创建用户和目录groupadd mysqluseradd -r -g mysql mysqlmkdir -p /data/mysql/standby/datamkdir -p /data/mysql/standby/tmpmkdir -p /data/mysql/standby/elogmkdir -p /data/mysql/standby/blogchown -R mysql:root /data/mysql配置yum源cd /etc/yum.repos.d/rm -rf *vi c…

跟几个程序员聊了聊他们的每月薪资收入

阅读本文大概需要6分钟。我一直有一个技术小群&#xff0c;这个群最初是在360当新人入职导师带的几个人&#xff0c;和大家挺聊得来就建了一个群&#xff0c;没想到居然存在了6年之久。压力大的时候就在群里和大家相互调侃或者拉拉家常&#xff0c;偶尔谁跳槽了也会喷喷前东家&…

开通博客

今天注册了博客园并且开通了博客&#xff01; 我想用博客来记录并分享我学习编程过程和知识。 希望大家予以支持和帮助。转载于:https://www.cnblogs.com/crislina/archive/2012/01/28/2330629.html

【重磅】MIT发布2018年“全球十大突破性技术”

“有些技术已经应用多年&#xff0c;有些则是意外之喜。无论如何&#xff0c;以下是我们认为将在未来的几年对我们的工作和生活产生巨大影响的技术突破。”北京时间2018年2月21日&#xff0c;《麻省理工科技评论》揭晓了2018年“全球十大突破性技术”&#xff0c;这份全球新兴科…

mysql必须的组件_mysql innodb的重要组件

innodb包涵如下几个组件一、innodb_buffer_pool&#xff1a;1  它主要用来缓存数据与索引(准确的讲由于innodb中的表是由聚集索引组织的&#xff0c;所以数据只不是过主键这个索引的叶子结点)。二、change buffer:1  如果更新语句要更新二级索引的记录&#xff0c;但是记录…

[Stardust]星尘配置中心

在分布式系统开发中&#xff0c;配置中心必不可少。在中通几年时间里&#xff0c;为了配合大数据计算平台&#xff0c;统一管理数百个微小应用&#xff0c;设计了一套轻量级配置中心。星尘配置中心在其理念基础上改进&#xff0c;针对中小团队而全新设计&#xff01;源码&#…

oracle中v$database视图详解

SQL> desc v$database 名称 是否为空? 类型 ----------------- -------- ------------ DBID NUMBER NAME VARCHAR2(9) CREATED DATE RESETLOGS_CHANGE# NUMBER RESETLOGS_T…

大数据可视化设计到底是啥,该怎么用

大数据可视化是个热门话题&#xff0c;在信息安全领域&#xff0c;也由于很多企业希望将大数据转化为信息可视化呈现的各种形式&#xff0c;以便获得更深的洞察力、更好的决策力以及更强的自动化处理能力&#xff0c;数据可视化已经成为网络安全技术的一个重要趋势。文章目录一…

九度 1376 最近零子序列

http://ac.jobdu.com/problem.php?id1376 N^2的算法超时 优化算法想了好久没想出来&#xff0c;就当是学习一下STL的set了吧 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <set> 5 #include <iostream> 6 #defi…

WPF 如何实现颜色值拾取

WPF开发者QQ群&#xff1a; 340500857 前言如何进行颜色值拾取&#xff1f;这里采用的是调用WindowsAPI进行实现。吸取 沙漠尽头的狼 的建议多写一些文字进行描述。效果图如下&#xff1a;第一步 注册WindowsAPI 代码如下&#xff1a;[DllImport("user32.dll")]stati…

大文本导入mysql_大文本数据,导入导出到数据库

大文本数据&#xff0c;导入到数据库240w的数据&#xff0c;利用plsql的文本导入器&#xff0c;导了一个半小时&#xff0c;且数据出现缺失。两种方式导入到数据库一&#xff0c;使用sql load创建表create table ext_gv_tmp_amazon_sku(skucode varchar2(255 char),eancode var…

仿Google+相册的动画

在使用Google的时候&#xff0c;查看某一相册&#xff0c;会经常看到&#xff0c;如下图所示的动画效果。 鼠标移入、移出时均有动画效果&#xff0c;咋一看估计是使用了css3的transform属性来实现动画效果的。 在网上搜索“Google 相册 效果”的时候发现有人使用CSS3做了这样的…

看见到洞见之引子(二)机器学习算法

《看见到洞见》系列文章汇聚、分享的是绿盟科技创新中心对于数据分析在安全领域应用的技战术思考与经验&#xff0c;力求由浅入深层次递进&#xff0c;实战到方法论双线剖析。此文为系列文章之引子第二篇&#xff0c;深入浅出的对常用的数据分析和机器学习的算法进行介绍。在上…

mysql pmod项目_内置函数 - 数学函数 - 《Apache Doris 文档(201812)》 - 书栈网 · BookStack...

数学函数abs(double a)功能&#xff1a; 返回参数的绝对值返回类型&#xff1a;double类型使用说明&#xff1a;使用该函数需要确保函数的返回值是整数。acos(double a)功能&#xff1a; 返回参数的反余弦值返回类型&#xff1a;double类型asin(double a)功能&#xff1a; 返回…

gcc中常用的选项

开始学习在Linux下写程序&#xff0c;利用gcc进行编译的时候经常需要添加一些选项&#xff0c;为了便于查找&#xff0c;将这写常用的选项整理出来。GCC常用选项 -c 通知GCC取消链接步骤&#xff0c;即编译源码并在最后生成目标文件&#xff1b; -Dmacro 定义指定的宏&am…