.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基础知识,人工智能教程,不是一堆数学公式和算法的那种,用各种举例子来学习,读起来比较轻松,有兴趣可以看一下。
人工智能教程

相关推荐
小安运维日记30 分钟前
CKS认证 | Day4 最小化微服务漏洞
安全·docker·微服务·云原生·容器·kubernetes
绝无仅有2 小时前
企微审批对接错误与解决方案
后端·算法·架构
Code季风2 小时前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul
写不出来就跑路3 小时前
Spring Security架构与实战全解析
java·spring·架构
Patrick_Wilson4 小时前
青苔漫染待客迟
前端·设计模式·架构
Kotlin上海用户组4 小时前
Koin vs. Hilt——最流行的 Android DI 框架全方位对比
android·架构·kotlin
掘金安东尼6 小时前
把复杂留给架构,把简单留给开发 —— Amazon Aurora DSQL 宣布:全面可用
面试·架构·github
Code季风7 小时前
微服务分布式配置中心:Gin Web 服务层与 gRPC 服务层集成 Nacos 实战
分布式·微服务·rpc·架构·go·gin·consul
赋范大模型技术社区8 小时前
【LangChain 实战】多智能体协作实现浏览器自动化丨Agents 运行流程丨多工具串&并联调用
架构·github·代码规范