通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...

 很久没有更新dapr系列了。今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star

目录:

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

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

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

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

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

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

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

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

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

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

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

通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容

通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格

通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署

通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧

通过Dapr实现一个简单的基于.net的微服务电商系统(十五)——集中式接口文档实现

通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护

通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载

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

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

  首先我们看看最终效果如何,重新拉取代码并rebuild之后,登录admin.dapreshop.com:30882在基础配置新增了两个模块,其中swagger文档只是简单的对系列15文章中创建的集中式文档的简易集成。服务保护配置就是本次新增的部分了,其界面如下:079b3b1861baa1edc39412eafaac79ae.png

   当我们需要保护某个接口时,点击新增限流规则,并通过下拉选择我们的服务+路径即可配置一个规则,点击保存并重启网关会自动调用k8s进行component的重载并重启apigateway。

cff337fb3ff8341b00565bfdfda8d8be.png

   在稍微等待20秒左右网关重启后(亦可通过使用kubectl get po -n dapreshop | findstr apigateway观察网关重启)即可通过并发测试来看看其效果。可以看到正确的对我们的接口产生了保护,也就是10秒内产生了100次左右的有效访问,剩余的访问被拦截并返回了429请求过多。

f37d12fa29d47f033287d5fb00c3c1c7.png

   在dapr的middleware-sentinel文档中可以看到还支持熔断降级、并发隔离、热点参数等等规则,不过目前测试过发现仅有服务限流规则拒绝类型的限流对dapr有效,其他规则暂时没有效果,不知道是不是dapr1.2的bug还是什么情况,已经github提了issuesl...

  下面简单讲讲如何实现热更新的。首先我们需要在apigateway注入一个空的sentinel config component:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: sentinelnamespace: dapreshop
spec:type: middleware.http.sentinelversion: v1metadata:- name: appNamevalue: "rules"- name: logDirvalue: "/tmp"- name: flowRulesvalue: >-[]- name: circuitbreakerRulesvalue: >-[]

  接着我在publicservice实现了热更新相关代码,具体代码在PublicService\Infrastructure\Common\AliSentinel中。通过引入了KubernetesClient的方式通过sdk操作component的读写以及deployment的更新。核心代码如下:

static Kubernetes kubernetes = new Kubernetes(KubernetesClientConfiguration.BuildConfigFromConfigFile(SentinelComponentBaseConfig.kubeconfig));/// <summary>/// 注册规则/// </summary>/// <param name="aliSentinelConfig"></param>public static async Task RegisterSentinelConfig(SentinelConfigList aliSentinelConfigList){await GetAndSaveSentinelComponent(component =>{component.FlowRules = aliSentinelConfigList.FlowRules.GetDistinct();component.BreakingRules = aliSentinelConfigList.BreakingRules.GetDistinct();});}/// <summary>/// 获取所有注册规则/// </summary>/// <returns></returns>public static async Task<SentinelConfigList> GetAll(){var component = await GetDefaultSentinelComponent();return new SentinelConfigList(){FlowRules = component.FlowRules,BreakingRules = component.BreakingRules};}#region 本地方法/// <summary>/// 获取默认的SentinelComponent/// </summary>/// <returns></returns>static async Task<SentinelComponent> GetDefaultSentinelComponent(){var component = new SentinelComponent();await component.Create(kubernetes);return component;}/// <summary>/// 传递委托变更默认SentinelComponent/// </summary>/// <param name="operatorComponent"></param>static async Task GetAndSaveSentinelComponent(Action<SentinelComponent> operatorComponent){var component = await GetDefaultSentinelComponent();operatorComponent(component);component.SetMetaData();Patch(component);ReloadDeploy();}/// <summary>/// Patch SentinelComponent到k8s环境/// </summary>/// <param name="component"></param>static void Patch(SentinelComponent component){var patch = new JsonPatchDocument<SentinelComponent>();patch.Replace(x => x.spec.metadata, component.spec.metadata);kubernetes.PatchNamespacedCustomObject(new V1Patch(patch, V1Patch.PatchType.JsonPatch), SentinelComponentBaseConfig.Group, SentinelComponentBaseConfig.Version, SentinelComponentBaseConfig.NamespaceParameter, SentinelComponentBaseConfig.Plural, SentinelComponentBaseConfig.ComponentName);}/// <summary>/// 重启相关deploy更新SentinelComponent/// </summary>static void ReloadDeploy(){var deploy = kubernetes.ReadNamespacedDeployment(SentinelComponentBaseConfig.DeploymentName, SentinelComponentBaseConfig.NamespaceParameter);deploy.Spec.Template.Metadata.Annotations[SentinelComponentBaseConfig.restart] = DateTime.UtcNow.ToString("s");var patch = new JsonPatchDocument<V1Deployment>();patch.Replace(e => e.Spec.Template.Metadata.Annotations, deploy.Spec.Template.Metadata.Annotations);kubernetes.PatchNamespacedDeployment(new V1Patch(patch, V1Patch.PatchType.JsonPatch), SentinelComponentBaseConfig.DeploymentName, SentinelComponentBaseConfig.NamespaceParameter);}

  接着我们在application暴露两个接口用于get component和save component。在页面上接入相关接口后即可正确的读取和写入component并滚动更新相关k8s资源从而实现热更新。整个限流流程大致如下:

a2675da76331d24a17929b41946a26e5.png

   好了,今天的分享就到这里,照例欢迎fork+star~

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

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

相关文章

geotif 添加坐标_python – 如何获取geotif中单元格的坐标?

使用仿射变换矩阵,将像素坐标映射到世界坐标.例如,使用affine包. (还有其他方法可以使用简单的数学方法.)from affine import Affinefname /path/to/raster.tif以下是获得仿射变换矩阵T0的两种方法.例如,使用GDAL / Python&#xff1a;from osgeo import gdalds gdal.Open(pa…

年纪都这么大了,还在倒班工作......

1 这么大年纪都在倒班工作&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 原来&#xff0c;这就是命啊&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 天啊&#xff0c;都是什么狗血剧情&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xf…

VB中使用GDI+进行图像缩放的实例

VISUAL BASIC&#xff08;VB&#xff09;对图形图像的处理一直以来是弱项&#xff0c;并受到很多人的垢病。关于图形图像的放大缩小&#xff0c;一般使用PICTUREBOX的PAINTPICTURE方法来处理。但这个处理方法最大的问题就是图像的失真。比方说图像中原来有网格线的&#xff0c;…

javascript的关于刷新页面给出提示框的代码

// 页面刷新事件 ,或者关闭事件的3中方法&#xff01;测试都可以&#xff01;参考官方文档&#xff1a; https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers.onbeforeunloadhttps://developer.mozilla.org/en-US/docs/Web/API 方法1&#xff1a;window.onb…

JavaScript格式化数字显示格式

为什么80%的码农都做不了架构师&#xff1f;>>> JavaScript格式化数字显示格式 /** * 格式化数字显示方式 * 用法 * formatNumber(12345.999,#,##0.00); * formatNumber(12345.999,#,##0.##); * formatNumber(123,000000); * param num * param pattern */ func…

linux c之使用#define定义多行函数总结

1、用 define的特点 函数&#xff1a;会带来额外的开销&#xff0c;开辟一片栈空间&#xff0c;记录返回地址&#xff0c;将形参压栈&#xff0c;从函数返回还要释放堆栈&#xff0c;这种开销大&#xff0c;函数的参数必须被声明为一种特定的类型。 宏定义&#xff1a;代…

tensorflow去掉某一维度_在Python中解压缩(取消堆栈)一个输入(占位符),在tensorflow中有一个None维度...

我正在尝试使用具有不同时间步长(不同帧数)的输入的LSTM. rnn.static_rnn的输入应该是tf(不是tf&#xff01;)的序列.所以,我应该将输入转换为序列.我试图使用tf.unstack和tf.split,但是他们都需要知道输入的确切大小,而我的输入的一个维度(时间步长)正在通过不同的输入改变.以…

js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小

方法一&#xff1a;此方法在页面没有滚动条时无法缩放 JQuery function hideMax(){$(".MAX_div").remove();$("#Cover_Div").hide();}function showMax(url){$("#Cover_Div").show();var Imagefunction(){return document.createElement("i…

太努力工作的年轻人,都有病吧!?

全世界只有3.14 % 的人关注了爆炸吧知识前段时间&#xff0c;有人这样问超模君&#xff1a;为什么年轻人明明没有老一辈辛苦&#xff0c;病却反而更多了&#xff1f;在这个物质丰富的年代&#xff0c;如果你退出这场无限内卷的社畜游戏&#xff0c;选择躺平就会活得很轻松&…

lsattr/chattr

lsattr/chattr主要用于特殊权限可以用lsattr直接查看当前目录下所有文件和目录的特殊属性 默认只有一个e &#xff08;ext4 /ext3&#xff09;chattr a 111.txtlsattr 111.txt就会发现多了一个a 那么这个a权限有什么意义呢&#xff1f;我们来编辑一下111.txt 随便输入一些&…

linux之学习之路

很多同学接触Linux不多&#xff0c;对Linux平台的开发更是一无所知。 而现在的趋势越来越表明&#xff0c;作为一个优秀的软件开发人员&#xff0c;或计算机IT行业从业人员&#xff0c; 掌握Linux是一种很重要的谋生资源与手段。 下来我将会结合自己的几年的个人开发经验&…

xshell中重启指令_Xshell命令大全

(1)命令ls-----列出文件ls -la给出当前目录下所有文件的一个长列表&#xff0c;包括以句点开头的“隐藏”文件ls a*列出当前目录下以字母a开头的所有文件la -l *.doc 给出当前目录下以.doc结尾的所有文件(2)命令cp——复制文件cp afile afile.bak 把文件复制为新文件afile.bakc…

在线自动下载最新版本jquery

<script src"http://code.jquery.com/jquery-latest.js"> 转载于:https://www.cnblogs.com/IcanFixIt/p/4253279.html

高考成绩接近满分,却被清华北大拒绝,被称“中国最帅科学家”

全世界只有3.14 % 的人关注了爆炸吧知识有一段时间&#xff0c;超模君刷微博的时候&#xff0c;发现微博热搜第一是“我国又发现10亿吨级大油田”这个话题&#xff0c;不愧是硬核礼物——“真我为祖国献石油”&#xff01;微博热搜第一话题作为一名热爱祖国的十八线网红&#x…

自古以来,JSON序列化就是兵家必争之地

上文讲到使用ioutil.ReadAll读取大的Response Body&#xff0c;出现读取Body超时的问题。01前人引路Stackoverflow[1]的morganbaz的看法是&#xff1a;使用iotil.ReadAll去读取go语言里大的Response Body&#xff0c;是非常低效的; 另外如果Response Body足够大&#xff0c;还有…

实验三《实时系统的移植》 20145222黄亚奇 20145213祁玮

北京电子科技学院&#xff08;BESTI&#xff09; 实 验 报 告 封 面 课程&#xff1a;信息安全系统设计基础 班级&#xff1a;1452 姓名&#xff1a; 黄亚奇 祁玮 学号&#xff1a; 20145222 20145213 成绩&#xff1a; 指导教师&#xff1a;娄嘉鹏 实验日期&#xff1a;2016.1…

linux c之通过popen和pclose函数创建管道执行shell 运行命令使用总结

1、函数介绍 popen 和 pclose 函数 操作是创建一个管道链接到另一个进程,然后读其输出或向其输入端发送数据。标准 I/O 库提供了两个函数 popen 和 pclose 函数,这两个函数实现的操作是:创建一个管道,调用 fork 创建一个子进程,关闭管道的不使用端,执行一个 shell 以运行…

python内置函数 pdf_关于Python巧妙而强大的内置函数

python内置了一些非常巧妙而且强大的内置函数&#xff0c;对初学者来说&#xff0c;一般不怎么用到&#xff0c;我也是用了一段时间python之后才发现&#xff0c;哇还有这么好的函数&#xff0c;这个函数都是经典的而且经过严格测试的,可以一下子省了你原来很多事情&#xff0c…

nginx获得response自定义的header

Response header send by upstream is $upstream_http_x_uuid http://wiki.nginx.org/HttpUpstreamModule#.24upstream_http_.24HEADER $upstream_http_$HEADER Arbitrary HTTP protocol headers, for example: $upstream_http_host$http_x_* is header sent by client. 转载于…

欢迎来到元宇宙的虚拟世界

众所周知&#xff0c;由于这次疫情&#xff0c;给我们的生活造成了很多不便。现在&#xff0c;让我们进入未来科技世界, 我想很多人都听说过 元宇宙 这个词&#xff0c;大家可能对这个新的概念有很多疑问, 什么是元宇宙? 这是什么新技术? 在即将到来的未来会带来怎样的变化&a…