.net微服务框架dapr保存和获取状态

.NET微服务框架Dapr:状态保存与获取全解析

在微服务架构的世界里,状态管理是一个至关重要的环节。Dapr(Distributed Application Runtime)作为一个强大的开源分布式应用运行时,为.NET微服务开发者提供了便捷的状态管理解决方案。本文将深入探讨Dapr在.NET微服务中保存和获取状态的相关技术。

一、Dapr状态存储基础

当我们在自托管模式下运行 dapr init 时,Dapr会自动创建一个默认的Redis状态存储。这个存储配置文件 statestore.yaml 会被放置在不同操作系统的特定路径下:

  • Windows%UserProfile%\.dapr\components\statestore.yaml
  • Linux/MacOS~/.dapr/components/statestore.yaml

通过这个 statestore.yaml 组件,我们可以轻松地更换底层的状态存储组件,而无需对应用程序代码进行修改。这体现了Dapr的灵活性和可扩展性,让开发者可以根据实际需求选择最适合的状态存储方案。

二、保存和检索单个状态

Dapr提供了简单易用的状态管理API,方便我们保存和检索单个键/值对。以下是一个示例代码:

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Dapr.Client;
using System.Threading;
using System.Text.Json;

namespace EventService
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string DAPR_STORE_NAME = "statestore";
            Thread.Sleep(5000);
            using var client = new DaprClientBuilder().Build();
            Random random = new Random();
            int orderId = random.Next(1, 1000);

            // 使用Dapr SDK保存状态
            await client.SaveStateAsync(DAPR_STORE_NAME, "order_1", orderId.ToString());
            await client.SaveStateAsync(DAPR_STORE_NAME, "order_2", orderId.ToString());

            // 使用Dapr SDK获取状态
            var result = await client.GetStateAsync<string>(DAPR_STORE_NAME, "order_1");
            Console.WriteLine("Result after get: " + result);
        }
    }
}

在这段代码中,我们首先创建了一个 DaprClient 实例,然后使用 SaveStateAsync 方法将随机生成的 orderId 保存到状态存储中。接着,使用 GetStateAsync 方法获取指定键的值并输出。这种方式简单直接,大大降低了状态管理的复杂度。

三、删除状态

除了保存和获取状态,我们还可能需要删除状态。Dapr SDK同样提供了方便的方法来实现这一功能。以下是一个删除状态的示例代码:

csharp 复制代码
using Dapr.Client;

namespace EventService
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string DAPR_STORE_NAME = "statestore";
            using var client = new DaprClientBuilder().Build();

            // 使用Dapr SDK删除状态
            await client.DeleteStateAsync(DAPR_STORE_NAME, "order_1");
        }
    }
}

通过调用 DeleteStateAsync 方法,我们可以轻松地从状态存储中删除指定的键/值对。这在清理不再需要的数据时非常有用。

四、保存和检索多个状态

在实际应用中,我们可能需要一次性保存或检索多个状态。Dapr SDK提供了相应的方法来满足这一需求。以下是一个保存和检索多个状态的示例代码:

csharp 复制代码
using Dapr.Client;

namespace EventService
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string DAPR_STORE_NAME = "statestore";
            using var client = new DaprClientBuilder().Build();

            // 使用Dapr SDK检索多个状态
            IReadOnlyList<BulkStateItem<Widget>> mulitpleStateResult = await client.GetBulkStateAsync<Widget>(DAPR_STORE_NAME, new List<string> { "widget_1", "widget_2" }, parallelism: 1);
        }
    }

    class Widget
    {
        string Size { get; set; }
        string Color { get; set; }
    }
}

在这个示例中,我们使用 GetBulkStateAsync 方法一次性检索多个键的值。这种批量操作可以提高性能,减少与状态存储的交互次数。

五、执行状态事务性操作

状态事务性操作对于保证数据的一致性和完整性非常重要。不过,状态事务性操作需要一个支持多项目事务的状态存储。以下是一个执行状态事务的示例代码:

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Dapr.Client;
using Microsoft.AspNetCore.Mvc;
using System.Threading;
using System.Text.Json;

namespace EventService
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string DAPR_STORE_NAME = "statestore";
            while (true)
            {
                Thread.Sleep(5000);
                Random random = new Random();
                int orderId = random.Next(1, 1000);
                using var client = new DaprClientBuilder().Build();

                var requests = new List<StateTransactionRequest>()
                {
                    new StateTransactionRequest("order_3", JsonSerializer.SerializeToUtf8Bytes(orderId.ToString()), StateOperationType.Upsert),
                    new StateTransactionRequest("order_2", null, StateOperationType.Delete)
                };

                CancellationTokenSource source = new CancellationTokenSource();
                CancellationToken cancellationToken = source.Token;

                // 使用Dapr SDK执行状态事务
                await client.ExecuteStateTransactionAsync(DAPR_STORE_NAME, requests, cancellationToken: cancellationToken);
                Console.WriteLine("Order requested: " + orderId);
            }
        }
    }
}

在这个示例中,我们创建了一个包含插入和删除操作的事务请求列表,然后使用 ExecuteStateTransactionAsync 方法执行事务。这样可以确保这些操作要么全部成功,要么全部失败,从而保证数据的一致性。

六、启动Dapr Sidecar

要启动上述示例应用程序的Dapr Sidecar,可以运行以下命令:

nginx 复制代码
dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 dotnet run

这个命令会启动Dapr Sidecar,并将其与我们的.NET应用程序进行关联,从而实现状态管理等功能。

七、Dapr支持的状态存储数据库

Dapr支持多种状态存储数据库,如Redis、Azure Cosmos DB、MongoDB等。开发者可以根据项目的需求和特点选择合适的状态存储数据库。不同的数据库具有不同的特点和优势,例如Redis具有高性能和低延迟的特点,适合对性能要求较高的场景;Azure Cosmos DB则提供了全球分布式和高可用性的特性,适合需要在全球范围内部署的应用。

总之,Dapr为.NET微服务开发者提供了强大而灵活的状态管理功能。通过使用Dapr的状态管理API,我们可以轻松地实现状态的保存、获取、删除和事务性操作,提高开发效率和应用的可维护性。希望本文能帮助你更好地理解和应用Dapr的状态管理功能。 ======================================================================

前些天发现了一个比较好玩的人工智能学习网站,通俗易懂,风趣幽默,可以了解了解AI基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程

相关推荐
zandy10112 小时前
解构衡石嵌入式BI:统一语义层与API网关的原子化封装架构
架构
SEO-狼术4 小时前
Aspose.Medical for .NET Crack
.net
一包烟电脑面前做一天4 小时前
.Net + Qdrant 使用Microsoft.ML.OnnxRuntime调用本地大模型实现文本向量化,实现简单RAG
.net·onnx·rag·文本向量化·本地大模型·qdrant
你我约定有三7 小时前
分布式微服务--万字详解 微服务的各种负载均衡全场景以注意点
java·开发语言·windows·分布式·微服务·架构·负载均衡
77qqqiqi9 小时前
解决Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required报错问题
java·数据库·微服务·mybatis·mybatisplus
wydxry9 小时前
MOE架构详解:原理、应用与PyTorch实现
人工智能·pytorch·架构
Goboy10 小时前
Java 使用 FileOutputStream 写 Excel 文件不落盘?
后端·面试·架构
Dragon online10 小时前
数据仓库深度探索系列:架构选择与体系构建
大数据·数据仓库·分布式·架构·spark·大数据架构·数仓架构
Goboy10 小时前
讲了八百遍,你还是没有理解CAS
后端·面试·架构
数据要素X10 小时前
【数据架构08】数字化转型架构篇
大数据·数据库·数据仓库·架构·数据库架构