通过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: 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资源从而实现热更新。整个限流流程大致如下:

a2675da76331d24a17929b41946a26e5.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EntLib 电子商务(或网店)系统十二大功能介绍: 1、SEO优化--完善的内部链接结构和导航功能,细节到商品页面的头部meta元素中keywords和description的定义,充分进行搜索引擎优化工作,迅速提升网店流量。 具体SEO细节,可以参考EntLib.com 电子商务小组编写了一篇关于SEO的文章《电子商务网站的快速SEO解决方案》。 2、邮件营销--内部集成用户注册、创建订单和审核订单邮件、发货通知、到货通知邮件、邮件群发和邮件订阅功能,精准营销赢得商机。 3、优惠券营销--系统提供了丰富的优惠券功能,可以按特定产品、产品类别、产品品牌、订单总金额等等多方位、多角度设计优惠券应用策略,全面提升优惠券营销效果。 4、多样促销--系统提供了多样的营销功能,如相关商品设置、有奖问答、赠品等等功能,促进用户购买欲望。 5、捆绑销售--灵活的商品捆绑销售折扣,操作简单方便,极大提高用户的购买欲望和购买决策,迅速提升网站的商品销量。 6、系统扩展--后台订单处理系统和采购入库系统可以根据业务的需要,与仓库管理系统(WMS)、RMA系统实现无缝集成,提供仓库的出库、入库的准确率和工作效率,充分适应企业未来的业务发展需要。 7、供应链管理--全面实现供应链管理,包括供应商管理、账期管理、采购(入库)管理、产品成本等等,确保商城的成本优势和商品供应。 8、财务管理--财务管理包括应收款(AR)、应付款(AP)及系统积分帐号预算控制,确保公司的现金流和积分的安全。 9、会员等级--根据消费金额自动判断会员等级体系,并可根据不同的会员级别指定不同的优惠活动,大大提升商城会员忠诚度。 10、积分运营--全商城积分引擎,客户购买商品获取积分、消费积分、评论或注册获取积分等等,系统进行了详细的记录,并自动从各系统积分帐号进行提取,使积分的使用符合预算控制。另外,通过积分促进用户购买欲望,提高用户二次购买率。 11、权限管理--基于角色的访问控制(RBAC)标准,设计权限管理系统,对系统的各项功能进行合理的定义和分配。 12、系统日志--系统的各项业务操作,都有详细的操作日志,包括操作人、操作时间、IP地址等等,确保系统的各项业务数据都有据可查。
在 Dapr pubsub 中,可通过在订阅函数中添加幂等性判断来解决重复消费的问题。以下是一个基于 .NET 6 的幂等性实现示例: ```csharp using Dapr.Client; using Dapr.Client.Autogen.Grpc.v1; using Dapr.Client.Autogen.Protos; using Google.Protobuf; using Grpc.Core; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; namespace DaprPubSubDemo.Controllers { [ApiController] [Route("[controller]")] public class DaprPubSubController : ControllerBase { private readonly DaprClient _daprClient; public DaprPubSubController(DaprClient daprClient) { _daprClient = daprClient; } [HttpPost("subscribe")] public async Task<ActionResult> Subscribe([FromBody] CloudEvent cloudEvent) { // 获取消息 ID string messageId = cloudEvent.Id; // 判断消息是否已处理过 if (await _daprClient.GetStateEntryAsync<bool>("message", messageId) == false) { // 标记消息已处理 await _daprClient.SaveStateAsync("message", messageId, true); // 处理消息 // TODO: 在此处添加具体的消息处理逻辑 } return Ok(); } } } ``` 上述代码中,我们使用 Dapr 的状态管理功能来实现幂等性判断。在订阅函数中,首先获取消息的 ID,然后通过调用 `GetStateEntryAsync` 方法获取该消息的处理状态。如果消息尚未处理,则标记消息已处理,并执行具体的消息处理逻辑;否则,直接返回结果。 需要注意的是,上述代码中的状态存储使用的是 Dapr 默认的状态存储,可以根据实际需求进行修改。同时,还需要注意保证状态存储的可靠性和一致性,以确保幂等性判断的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值