日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發(fā)布時間:2023/12/4 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

狀態(tài)管理和上一章的訂閱發(fā)布都算是Dapr相較于其他服務(wù)網(wǎng)格框架來講提供的比較特異性的內(nèi)容,今天我們來講講狀態(tài)管理。

目錄:

一、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)

二、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解

三、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr

四、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布

附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample

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

  什么是狀態(tài)?簡單來講就是數(shù)據(jù)狀態(tài)。比如我訪問/api/user/1,返回{userid:1,name:xiaoming},無論我的實例有多少個,我通過接口訪問這個url都能夠得到該條信息。一般的設(shè)計中我們的應(yīng)用是無狀態(tài)的,所謂無狀態(tài)就是每一個實例并不握持狀態(tài)(排除緩存的情況),而是通過第三方組件可能是緩存組件也可能是數(shù)據(jù)庫來維持狀態(tài)。數(shù)據(jù)庫維持狀態(tài)這個大家都比較熟悉了畢竟都是靠CRUD起家的。另外一種則就是緩存狀態(tài),緩存狀態(tài)有多種方式,最簡單以及最熟悉的就是我們asp.net的session以及system.cache。到了.netcore時代,微軟給我們很貼心的提供了Extensions.Caching.xxx來對我們的緩存提供一些外部支持(雖然在fx時代也有,不過相對比較麻煩)。而到了dapr,則對其提供了更進(jìn)一步的支持包括更廣泛的組件支持列表、非介入性SDK集成(可直接通過http訪問)。通過這樣的方式讓我們的服務(wù)很容易對外提供并發(fā)安全的、一致性的狀態(tài)體驗。

  狀態(tài)管理和上一章講到的訂閱發(fā)布一樣,主要是依賴于Dapr強(qiáng)大的Component來連接Dapr適配的各種各樣的緩存中間件,同時對上層(應(yīng)用)抽象為一組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代表我們將調(diào)用dapr的狀態(tài)服務(wù),storename則是我們申明的類型為state的component,key則是我們需要存取到redis的kv鍵值對(值在post body中以json格式發(fā)送)

  一份標(biāo)準(zhǔn)的狀態(tài)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為我們托管狀態(tài)管理的好處是什么呢?1、我們屏蔽了技術(shù)復(fù)雜性,避免了在基礎(chǔ)設(shè)施層去集成各種類型的狀態(tài)中間件SDK,2、Dapr為我們實現(xiàn)了分布式并發(fā)和數(shù)據(jù)一致性,具體來講在并發(fā)控制方面Dapr提供了一套OCC樂觀并發(fā)控制機(jī)制,通過附加的etag來做版本校驗確保用戶回寫過程和服務(wù)器端的版本一致才能操作。3、dapr為我們提供了bulk批處理,可以批量插入/刪除數(shù)據(jù),這部分demo沒有涉及,大家可以看看這里

  同樣的我們來看看代碼,狀態(tài)管理相較比較簡單,首先我們還是打開之前的解決方案,在RPC項目里創(chuàng)建一個model,該model繼承一個StateStore,主要是強(qiáng)制規(guī)范統(tǒng)一命名必須包含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的構(gòu)造函數(shù)引入IStateManager依賴,同時在Call方法中我們寫入一個狀態(tài)(其他代碼隨上一章內(nèi)容不變)

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訪問并打印控制臺,可以看到狀態(tài)被正確的從clientsaample寫入,并從servicesample讀取打印到了控制臺上(這里注意如果不想狀態(tài)被其他服務(wù)讀寫也就是僅能在當(dāng)前服務(wù)的scope內(nèi)被讀寫可以在設(shè)置component時刪除keyPrefix節(jié)即可)

?

?  狀態(tài)管理就講到這里,整體使用上比較簡單,開發(fā)者只需要考慮持久化設(shè)備的可用性以及可擴(kuò)展性,其他都可以交給Dapr即可。

  今天補(bǔ)一個小的功能點,在oxygen框架中我為AOP提供了一個入口,可以在ConfigureServices時通過LocalMethodAopProvider這個靜態(tài)類的RegisterPipelineHandler方法注冊請求前、方法前、方法后、方法異常四個匿名委托。請求前主要是注入了一個OxygenHttpContextWapper的包裝器類,該類包含了原始請求中的path/header/cookie等等原始data,并提供了一個當(dāng)前請求的ILifetimeScope用于用戶進(jìn)行對象注入。在方法前則提供了一個object類型的入?yún)?#xff0c;方便用戶做方法前校驗。方法后則是攔截的方法體返回的result。而異常則是方法內(nèi)拋出的所有unhandle異常都會被這個委托捕獲,方便用戶統(tǒng)一處理。

  今天的分享就到這里,歡迎大家評論區(qū)留言交流,歡迎對github上star+fork~

相關(guān)文章:

  • Dapr能否引領(lǐng)云原生中間件的未來?

  • 云原生 | 阿里巴巴的Dapr實踐與探索

  • Dapr | 云原生的抽象與實現(xiàn)

  • Dapr 可視化指南

  • Dapr 知多少 | 分布式應(yīng)用運行時

  • Dapr 正式發(fā)布 1.0

  • Dapr 交通流量控制示例

  • Dapr是如何簡化微服務(wù)的開發(fā)和部署

  • 微軟開源微服務(wù)運行時Dapr,賦能云原生應(yīng)用開發(fā)

  • YARP實現(xiàn)Dapr服務(wù)調(diào)用的反向代理

  • Dapr微服務(wù)應(yīng)用開發(fā)系列0:概述

  • Dapr微服務(wù)應(yīng)用開發(fā)系列1:環(huán)境配置

  • Dapr微服務(wù)應(yīng)用開發(fā)系列2:Hello World與SDK初接觸

  • Dapr微服務(wù)應(yīng)用開發(fā)系列3:服務(wù)調(diào)用構(gòu)件塊

  • Dapr微服務(wù)應(yīng)用開發(fā)系列4:狀態(tài)管理構(gòu)件塊

  • Dapr微服務(wù)應(yīng)用開發(fā)系列5:發(fā)布訂閱構(gòu)建塊

  • Windows環(huán)境下Dapr入門

  • 云原生 | .NET 5 with Dapr 初體驗

  • 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)

  • 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解

  • 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr

  • 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布

總結(jié)

以上是生活随笔為你收集整理的通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。