通过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,一经查实,立即删除!

相关文章

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

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

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;代…

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

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

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

全世界只有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…

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

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

linux c之通过管道父子进程实现同步通信

1、父进程向子进程写数据 进程的概念和父进程向子进程写数据&#xff0c;我们之前有一片博客介绍过 http://blog.csdn.net/u011068702/article/details/54914774 linux c之管道的介绍、创建关闭和简单读写&#xff08;父进程向子进程写入数据&#xff09; 2、父子进程实现同…

11G Oracle RAC添加新表空间时数据文件误放置到本地文件系统的修正

今天看了一篇文章说是误将新创建的表空间的数据文件放置在了本地系统而不是共享存储上。是Oracle的中文技术支持博客题目是&#xff1a;RAC中误将数据文件创建在本地盘时的修正于是我想11G 也兼容这些操作的方法&#xff0c;但是11G的新特性有一点就是可以直接支持ASM文件系统直…

sql练习(针对Mysql)

创建表: 1 DROP TABLE DEPT;2 --部门表3 CREATE TABLE DEPT(4 DEPTNO int PRIMARY KEY,5 DNAME VARCHAR(14) , --部门名称6 LOC VARCHAR(13) ---部门地址7 ) ;8 9 CREATE TABLE DEPT( 10 DEPTNO int PRIMARY KEY, 11 DNAME VARCHAR(14) , 12 …

.NET6之MiniAPI(十二):引入EntityFramewor

说明&#xff1a;本篇重点说明MiniAPI引入EntityFramework&#xff0c;EF的使用不是本篇的重点本篇是在MiniAPI中使用EntityFramework&#xff0c;所以先奉上创建数据的脚本&#xff0c;数据库是SQL Server&#xff0c;可能版本不同&#xff0c;会有一些问题&#xff0c;可以自…

2021 开源社年度报告:开心开源

# 引言 #2020年的开源社年度报告仿佛还在昨天&#xff0c;一转眼&#xff0c;2021年都已经过完了。在去年的年度报告上&#xff0c;我们说2020是动荡不安的一年。结果2021年&#xff0c;简直可以说是动荡加剧&#xff0c;令人应接不暇的一年。迫于疫情的影响&#xff0c;我们一…

luajit日记-FFI库

2019独角兽企业重金招聘Python工程师标准>>> LuaJIT FFI LibraryThe FFI library allows calling external C functions and using C data structures from pure Lua code. The FFI library largely obviates the need to write tedious manual Lua/C bindings in …

C#10 和 .NET6 代码跨平台开发

零、前言有数千页长的编程书籍&#xff0c;旨在成为 C# 语言、.NET 库、网站、服务、桌面和移动应用等应用模型的综合参考。这本书不一样。它简洁明了&#xff0c;旨在成为一本轻快有趣的书&#xff0c;每一个主题都有实用的实践演练。总体叙述的广度是以某种深度为代价的&…

linux之tar命令使用总结

1、使用原因 刚才在linux平台需要安装Clion的时候,下载得到CLion-2016.3.2.tar.gz 这个gz的压缩文件,所以需要解压到当前文件夹 2、简单解压到当前文件 解压当前文件夹命令 tar -zxvf CLion-2016.3.2.tar.gz 效果如下 3、tar命令介绍 -c: 建立压缩档案 -x:解压 -t:…

体验 正式发布 的OSM v1.0.0 版本

2021年10月份发布了OSM 1.0 RC[1]&#xff0c;在过去的几个月里&#xff0c;OSM 的贡献者一直在努力为 v1.0.0 版本的发布做准备。2022年2月1日&#xff0c;OSM 团队正式发布 1.0.0 版本[2]。OSM 从最初的发布到现在已经走了很长的路&#xff0c;团队继续专注于社区需要的关键和…

数据流图的画法

数据流图的画法 数据流图也称为数据流程图date flow diagram , DFD&#xff0c;是一种便于用户理解和分析系统数据流程的图形工具&#xff0c;他摆脱了系统和详细内容&#xff0c;精确的在逻辑上描写叙述系统的功能、输入、输出和数据存储等&#xff0c;是系统逻辑模型的重要组…

MFC继承表

转载于:https://www.cnblogs.com/Lthis/p/4264967.html