在上一篇文章里,我们通过注入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授权 && 百度版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地址

二、通讯框架地址

  首先我们看看最终效果如何,重新拉取代码并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: sentinel
namespace: dapreshop
spec:
type: middleware.http.sentinel
version: v1
metadata:
- name: appName
value: "rules"
- name: logDir
value: "/tmp"
- name: flowRules
value: >-
[]
- name: circuitbreakerRules
value: >-
[]

  接着我在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实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载的更多相关文章

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式

    在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...

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

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

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享

    今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...

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

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

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

    本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...

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

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

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

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

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

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

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

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...

随机推荐

  1. (Py练习)判断101-200之间的素数个数并输出

    判断素数的方法之一:用一个数分别去除以2到squrt(这个数),如果能被整除,则不是素数. import math h = 0 leap = 1 for m in range(101, 201): k ...

  2. web技术培训(二)-Flask后端框架初识

    web网站发展至今,特别是服务器端,涉及到的知识.内容,非常广泛.这对程序员的要求会越来越高.如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人 ...

  3. MySQL模糊查询,查询语句是对的。但是就是没有查询结果

    问题 解决 当我用其他非中文的值去查询,发现可以查询到结果 所以问题就出现在数据库的配置中 spring.datasource.url=jdbc:mysql://localhost:3306/data ...

  4. 浅谈持续集成(CI)、持续交付(CD)、持续部署(CD)

    CI/CD是实现敏捷和Devops理念的一种方法,具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的 整个生命周期(从集成和测试阶段,到交付和部署).这些关联的事务通常被统称为"CI ...

  5. aspnetcore 应用 接入Keycloak快速上手指南

    登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...

  6. ConcurrentHashMap源码解读三

    今天首先讲解helpTransfer方法 final Node<K,V>[] helpTransfer(Node<K,V>[] tab, Node<K,V> f) ...

  7. C异常处理和C++异常处理的对比

    每一种编译器实现异常处理的方式会有所不同,但是都是基于Windows的SEH异常处理.这里以MSC编译器为例. C异常处理 #include <Windows.h> int main(in ...

  8. MySQL DDL详情揭露

    前言: MySQL中DDL语句,即数据定义语言,用于创建.删除.修改.库或表结构,对数据库或表的结构操作.常见的有create,alter,drop等.这类语句通常会耗费很大代价,特别是对于大表做表结 ...

  9. SprintBoot使用Validation

    1.为什么要使用Validation 在开发过程中有没有使用一堆的if来判断字段是否为空.电话号码是否正确.某个输入是否符合长度等对字段的判断.这样的代码可读性差,而且还不美观,那么使用Validat ...

  10. ES6学习-3 const

    const声明一个只读的常量.一旦声明,常量的值就不能改变,所以在声名时就进行赋值. const的作用域与let命令相同,只在声明所在的块级作用域内有效. const命令声明的常量,同样存在暂时性死区 ...