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

状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理。

目录:

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

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

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

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

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

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

  什么是状态?简单来讲就是数据状态。比如我访问/api/user/1,返回{userid:1,name:xiaoming},无论我的实例有多少个,我通过接口访问这个url都能够得到该条信息。一般的设计中我们的应用是无状态的,所谓无状态就是每一个实例并不握持状态(排除缓存的情况),而是通过第三方组件可能是缓存组件也可能是数据库来维持状态。数据库维持状态这个大家都比较熟悉了毕竟都是靠CRUD起家的。另外一种则就是缓存状态,缓存状态有多种方式,最简单以及最熟悉的就是我们asp.net的session以及system.cache。到了.netcore时代,微软给我们很贴心的提供了Extensions.Caching.xxx来对我们的缓存提供一些外部支持(虽然在fx时代也有,不过相对比较麻烦)。而到了dapr,则对其提供了更进一步的支持包括更广泛的组件支持列表、非介入性SDK集成(可直接通过http访问)。通过这样的方式让我们的服务很容易对外提供并发安全的、一致性的状态体验。

  状态管理和上一章讲到的订阅发布一样,主要是依赖于Dapr强大的Component来连接Dapr适配的各种各样的缓存中间件,同时对上层(应用)抽象为一组rest api作为读/写操作入口,它的读写操作格式如下(仅列出部分,完整的API参考这里):

GET http://localhost:<daprPort>/v1.0/state/<storename>/<key>
POST http://localhost:<daprPort>/v1.0/state/<storename>
DELETE http://localhost:<daprPort>/v1.0/state/<storename>/<key>

  state代表我们将调用dapr的状态服务,storename则是我们申明的类型为state的component,key则是我们需要存取到redis的kv键值对(值在post body中以json格式发送)

  一份标准的状态component如下(此处依然以redis为例,查看这里是所有支持列表):

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: statestore
spec:type: state.redisversion: v1metadata:- name: redisHostvalue: redis.infrastructure.svc.cluster.local:6379- name: keyPrefixvalue: none

  选择Dapr为我们托管状态管理的好处是什么呢?1、我们屏蔽了技术复杂性,避免了在基础设施层去集成各种类型的状态中间件SDK,2、Dapr为我们实现了分布式并发和数据一致性,具体来讲在并发控制方面Dapr提供了一套OCC乐观并发控制机制,通过附加的etag来做版本校验确保用户回写过程和服务器端的版本一致才能操作。3、dapr为我们提供了bulk批处理,可以批量插入/删除数据,这部分demo没有涉及,大家可以看看这里

  同样的我们来看看代码,状态管理相较比较简单,首先我们还是打开之前的解决方案,在RPC项目里创建一个model,该model继承一个StateStore,主要是强制规范统一命名必须包含key,data。

public class TestState : Oxygen.Client.ServerSymbol.Store.StateStore{public TestState(){Key = "TestState";}public override string Key { get; set; }public override object Data { get; set; }}

 接着我们再在ClientCallService的构造函数引入IStateManager依赖,同时在Call方法中我们写入一个状态(其他代码随上一章内容不变)

private readonly IServiceProxyFactory serviceProxyFactory;private readonly IStateManager stateManager;public ClientCallService(IServiceProxyFactory serviceProxyFactory, IStateManager stateManager) {this.serviceProxyFactory = serviceProxyFactory;this.stateManager = stateManager;}public async Task<dynamic> Call(){var result1 = new OutDto();var result2 = new OutDto();var remoteService = serviceProxyFactory.CreateProxy<IHelloService>();await stateManager.SetState(new TestState() { Data = new OutDto() { Word = "123" } });try{result1 = await remoteService.HelloWorld();result2 = await remoteService.HelloWorldByName(new InputDto() { Name = "xiaoming" });}catch(Exception e){}return new { result1, result2 };}

 接着我们在servicesample打印出来:

 var result = await stateManager.GetState<OutDto>(new TestState());Console.WriteLine(result.Word);

 启动项目,打开postman访问并打印控制台,可以看到状态被正确的从clientsaample写入,并从servicesample读取打印到了控制台上(这里注意如果不想状态被其他服务读写也就是仅能在当前服务的scope内被读写可以在设置component时删除keyPrefix节即可)

 

   状态管理就讲到这里,整体使用上比较简单,开发者只需要考虑持久化设备的可用性以及可扩展性,其他都可以交给Dapr即可。

  今天补一个小的功能点,在oxygen框架中我为AOP提供了一个入口,可以在ConfigureServices时通过LocalMethodAopProvider这个静态类的RegisterPipelineHandler方法注册请求前、方法前、方法后、方法异常四个匿名委托。请求前主要是注入了一个OxygenHttpContextWapper的包装器类,该类包含了原始请求中的path/header/cookie等等原始data,并提供了一个当前请求的ILifetimeScope用于用户进行对象注入。在方法前则提供了一个object类型的入参,方便用户做方法前校验。方法后则是拦截的方法体返回的result。而异常则是方法内抛出的所有unhandle异常都会被这个委托捕获,方便用户统一处理。

  今天的分享就到这里,欢迎大家评论区留言交流,欢迎对github上star+fork~

相关文章:

  • 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之订阅发布

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

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

相关文章

过Div将页面分三块(上,中,下),然后通过Ext来改变Content的内容(三)--终结版

2019独角兽企业重金招聘Python工程师标准>>> 这几天的页面重构终于快要结束了。 最终页面架构选择了Sitemesh&#xff0c;经过昨天下午及今天上午的调试终于把Sitemesh下css、js问题解决了。 使用Sitemesh总结以下几点&#xff1a; 1、<decorator:head />放在…

Python+人工智能的超强组合,再不学就跟不上时代啦!

《Python人工智能》原价 899.00 现超 410 人参团仅售 199.00 点击文末阅读原文立即参团参团&#xff0c;咨询&#xff0c;查看课程&#xff0c;请点击【阅读原文】↓↓↓

如何证明服从卡方分布_谈谈抽样分布定理

各位阿娜答&#xff0c;这个月就更新了一篇文章&#xff0c;这都月底了&#xff0c;还有两次自荐机会没用&#xff0c;所以最后这几天要更两篇文章&#xff0c;大家敬请期待&#xff01;明明是夏天&#xff0c;但却是个多事之秋啊~(ง •_•)ง2020年注定是不平凡的一年&#x…

C#中ManualResetEvent用法简介

简单介绍多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态。当控制线程调用Set()方法&#xff0c;所有等待线程将恢复并继续执行。ManualResetEvent是如何工作的在内存中保持着一个bool值&#xff0c;如果bool值为False&#xff0c;则使所有线程阻塞&…

anaconda和python有什么不一样_黄山毛峰的味道为什么会不一样?

黄山毛峰&#xff0c;最早为人所熟知的黄山名茶&#xff0c;最经典的绿茶&#xff0c;特别是那种清香清爽的味道&#xff0c;很受茶友的喜爱。这两年经常接到茶友的电话问&#xff0c;为什么之次每次买的黄山毛峰都不一样&#xff0c;在不同的茶叶店&#xff0c;买的味道都不一…

Newbe.Claptrap 0.10.2 发布,Blazor 演示

Newbe.Claptrap 0.10.2 发布&#xff0c;我们为项目模板引入了 Minion 以及 Blazor 制作的交互界面。更新内容 类库常规升级升级了相关的所有类库至最新版本。包括 Dapr SDK 1.1 等等。项目模板增强现在&#xff0c;我们为最新的项目模板引入了 Minion 以演示如何使用 Minion 处…

Linux资料分享,强势来袭!

小编从大学开始&#xff0c;便开启资料收集功能。随着大数据时代的来临&#xff0c;计算机发展进入新的阶段&#xff0c;再加上日常的深入研究&#xff0c;小编收集整理了丰富的Linux资料&#xff0c;内容涵盖“集群类”&#xff0c;“监控类”、“编程类”“系统类”等。这次小…

es6 ie不兼容 函数_ES6:什么是块级作用域?

在 ES5 只有全局作用域和函数作用域&#xff0c;没有块级作用域&#xff0c;这带来很多不合理的场景。我们先来看一下下面这种情况&#xff1a;内层变量可能会覆盖外层变量。var txt 外层变量-->你好呀;function fn() {console.log(txt);if (false) {var txt 内层变量--&g…

一个简单的规则引擎例子

本例使用的规则引擎包是RulesEngine&#xff0c;关于RulesEngine的介绍&#xff0c;请自行补充&#xff0c;这里只是一个极简单使用场景。例子大体就是用户有一些优惠券&#xff0c;系统会根据用户订单情况&#xff0c;筛选可以使用的优惠券供用户选择&#xff0c;用户选择后会…

程序员面试必备的20条Python经典面试题

1、Python如何实现单例模式&#xff1f;Python有两种方式可以实现单例模式&#xff0c;下面两个例子使用了不同的方式实现单例模式&#xff1a;1.class Singleton(type):def __init__(cls, name, bases, dict):super(Singleton, cls).__init__(name, bases, dict)cls.instance …

Active Directory系列之十七:实战详解域信任关系

实战详解域信任关系上篇博文中我们对域信任关系作了一下概述&#xff0c;本文中我们将通过一个实例为大家介绍如何创建域信任关系。拓扑如下图所示&#xff0c;当前网络中有两个域&#xff0c;一个域是ITET.COM&#xff0c;另一个域是HOMEWAY.COM。两个域内各有一个域控制器&am…

vim 寄存器 操作_vim指令

vim 是一个基于【动词】 【名词】 建立的语法表。Vim 中常用的名词方位名词表基于字符的移动&#xff1a;h&#xff1a;左j&#xff1a;下k&#xff1a;上l&#xff1a;右 ^ | k 提示&#xff1a; h 的键位于左边&#xff0c;每次按下就会向…

35岁老程序员因身体原因没加班,老板:不想干就滚蛋

近日&#xff0c;某论坛上一名 35 岁老程序员说出了他最近的遭遇&#xff0c;高强度的工作本来就让他感觉越来越劳累&#xff0c;加上又在医院做了一个小手术&#xff0c;于是就按照公司的正常上下班时间下了班&#xff0c;但是领导却说了一句让他难以接受的话&#xff0c;都三…

客制化键盘编程_指尖运动会,谁是打字冠军,双十一机械键盘推荐

机械键盘就只能玩游戏吗&#xff1f;当然不是&#xff0c;其实机械键盘出现还远远早于薄膜键盘&#xff0c;早期类似IBM、AST、HP、康柏一类的品牌机都是标配机械键盘的。早期的机械键盘确实有点笨重&#xff0c;尤其是白轴的机械键盘&#xff0c;让你毕生难忘。比黑轴更加坚硬…

分布式数据库一定会替代Oracle吗?

在传统数据库领域&#xff0c;Oracle一直占据了很大的市场份额&#xff0c;很多企业的业务系统基于此实现OLTP交易场景。近年来&#xff0c;随着分布式技术的发展&#xff0c;分布式数据库逐渐占据了OLTP领域较大的市场&#xff0c;尤其在互联网领域&#xff0c;MYSQL、PG等分布…

数模国赛要点与注意事项全分享!

暑假咻地一下就过去了&#xff0c;转眼数学建模国赛快到了。为了给大家最最直接的帮助&#xff0c;超模君特邀请到周老师为参加国赛的模友们准备了一场干货满满的赛前冲刺直播课。全天候直播&#xff0c;助大家一臂之力&#xff0c;全力冲刺数模国赛&#xff01;周老师拥有多年…

android byte[] 转string 好多问号_#WIPI# Android使用HID设备

哈罗大家好。生活总是这样计划赶不上变化&#xff0c;今天为大家分享一下新加的小功能--使用Android设备连接HID设备。安卓内部已经内置了丰富的驱动&#xff0c;所以一般的设备我们只需要简单是设置就可灵活使用。首先对清单文件做简单修改<?xml version"1.0" e…

【Redis】有序集合的交集与并集

Redis支持多种类型的数据结构&#xff0c;最简单的字符串(strings)&#xff0c;适合存储对象的哈希(hash)&#xff0c;简单的字符串列表(list)&#xff0c;无序集合(set)&#xff0c;有序集合(sorted set)&#xff0c;以及用于做基数统计的HyperLogLog&#xff0c;其中使用频率…

从小害怕数学的他,却成为了科普数学教育的数学家

谈到数学&#xff0c;你们会想到什么&#xff1f;也许部分模友们会想到数学上的公式、定理、几何图形、微积分等等&#xff0c;也许会有模友们想到高数&#xff0c;&#xff08;多数大学生的痛&#xff09;也许大家还会想起高中数学老师课堂上的“循循教诲”——看书干嘛&#…

工作原理是什么_磁翻板液位计工作原理是什么?

液位计​大家都知道&#xff0c;是用来测量介质液位的仪表​&#xff0c;但是说到磁翻板液位计​这个概念可能大家都比较陌生&#xff0c;​磁翻板液位计​是根据浮力原理(阿基米德定律)结合磁性耦合作用研制而成&#xff0c;当被测量容器中的液位升降时&#xff0c;液位计主导…