通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...
在上一篇文章里,我们通过注入sentinel component到apigateway实现了对下游服务的保护,不过受限于目前变更component需要人工的重新注入配置以及重启应用更新component等等原因,对于真实的环境运维稍有难度,最近我根据sentinel-golang相关文档重新编写了一个动态配置的功能并集成到了我们的电商demo管理端,今天就讲解并演示一下它是如何工作的。
目录:
一、通过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中间件实现服务保护
附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample
二、通讯框架地址:https://github.com/sd797994/Oxygen-Dapr
首先我们看看最终效果如何,重新拉取代码并rebuild之后,登录admin.dapreshop.com:30882在基础配置新增了两个模块,其中swagger文档只是简单的对系列15文章中创建的集中式文档的简易集成。服务保护配置就是本次新增的部分了,其界面如下:
当我们需要保护某个接口时,点击新增限流规则,并通过下拉选择我们的服务+路径即可配置一个规则,点击保存并重启网关会自动调用k8s进行component的重载并重启apigateway。
在稍微等待20秒左右网关重启后(亦可通过使用kubectl get po -n dapreshop | findstr apigateway观察网关重启)即可通过并发测试来看看其效果。可以看到正确的对我们的接口产生了保护,也就是10秒内产生了100次左右的有效访问,剩余的访问被拦截并返回了429请求过多。
在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资源从而实现热更新。整个限流流程大致如下:
好了,今天的分享就到这里,照例欢迎fork+star~
相关文章:
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服务
通过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的微服务电商系统(十五)——集中式接口文档实现
WebAssembly + Dapr = 下一代云原生运行时?
dapr 应用开发 | 环境配置
乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时
Dapr案例之高德 Serverless 平台建设及实践
在非容器(集群)环境下运行dapr
构建属于你自己的dapr服务发现
构建属于你自己的dapr绑定组件
通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...相关推荐
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...
目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...
很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录: 一.通过Dapr实 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护...
dapr目前更新到了1.2版本,在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案,很快被社区加入到了1.2的里程碑中并且在1.2 release 相关 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格...
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...
如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版...
目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权...
Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商 ...
最新文章
- zabbix工作流程(自定义添加监控项目)
- 全球及中国家用除湿机行业消费需求调研及十四五发展趋势研究报告2022-2027年
- 学习busybox源码与移植
- 使用HttpMessageConverter实现HTTP的序列化和反序列化
- 强制卸载软件包linux,强制删除rpm包的方法
- 苹果或在 WWDC 宣布放弃英特尔转向自研 5nm ARM 芯片,这次时机成熟了?
- 无需无线路由,将系统为win7的笔记本变成wifi的方法
- SQL项目实战练习:淘宝用户行为数据分析实战
- Navigation导航系统
- 刨根问底!!到底什么是文件?什么是流
- 浙大计算机学院12月12日毅行,感谢参与lt;2020年秋季浙大飘渺毅行gt;
- no-siteapp 和 no-transform 有什么区别??
- 服务器ldb文件可以删除,Access数据库锁死,出现.ldb文件解决办法
- Scrum 项目6.0-展示Sprint回顾的过程及成果。
- 如何用标准IO逆序输出文件
- 小米7.0系统设备一键激活Xposed框架的教程
- Spyder 中 Reloaded modules错误的解决方法
- 混沌时间序列的几个例子
- python dashboard django_django 12.dashboard仪表盘 - 刘江的django教程
- 小程序---wxParse解决图片大小不适应小程序页面问题