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

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

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

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

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

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

附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址

二、通讯框架地址

  状态管理和上一章讲到的订阅发布一样,主要是依赖于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.redis
version: v1
metadata:
- name: redisHost
value: redis.infrastructure.svc.cluster.local:6379
- name: keyPrefix
value: 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实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理的更多相关文章

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

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

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

    在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

    Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系 ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

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

    如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署

    之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧

    之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s ...

随机推荐

  1. webpack + ts 配置路径别名无死角方法总结

    webpack + ts 配置路径别名总结 自我体验加总结:在配置脚手架时,定制别名很有必要,可以使得代码更优雅,可读性更强.但在使用ts的时候,即便项目能够运行,vscode 确时长会提示 can' ...

  2. C++算法代码——纪念品分组[NOIP2007 普及组]

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1099 https://www.luogu.com.cn/problem/P1094 ...

  3. JVM 字节码之 int 入栈指令

    本文转载自JVM 字节码之 int 入栈指令(iconst.bipush.sipush.ldc) 前言 本文介绍 int 入栈指令 iconst.bipush.sipubh.Idc. 当 int 取值 ...

  4. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

  5. spring中的依赖注入(DI)笔记

    使用xml bean依赖注入有set注入和构造器注入 set注入用的比较多 <bean id="a" class="com.A"> <prop ...

  6. 基于【腾讯云函数】/【GitHub Actions】/【Docker】的每日签到脚本(支持多账号使用)

    每日签到集合 基于[腾讯云函数]/[GitHub Actions]/[Docker]的每日签到脚本 支持多账号使用 特别声明: 本仓库发布的脚本及其中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究 ...

  7. 【HTB系列】靶机Teacher的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Kali: 10.10.14.50 靶机地址:10.10.10.153 先用nmap 对 ...

  8. 2021-2-28:调用 System.gc() 后究竟发生了什么?

    首先,根据 DisableExplicitGC 这个 JVM 启动参数的状态,确定是否会 GC,如果需要 GC,不同 GC 会有不同的处理. 1. G1 GC 的处理 如果是 System.gc() ...

  9. `vi`——终端中的编辑器

    `vi`--终端中的编辑器 目标* `vi` 简介* 打开和新建文件* 三种工作模式* 常用命令* 分屏命令* 常用命令速查图 01. `vi` 简介 1.1 学习 `vi` 的目的 * 在工作中,要 ...

  10. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...