1         状态管理服务器端接口

1.1         添加Dapr.AspNetCore包

在DaprTest1.Server项目中添加Dapr.AspNetCore包,该包实现了ASP.NET Core与Dapr的集成,例如自动依赖注入DaprClient对象,将状态管理功能直接集成到 ASP.NET Core 模型绑定功能中等。

修改DaprTest1.Server项目的Startup.cs文件,将Dapr对象依赖注入到ASP.NET Core。

 public void ConfigureServices(IServiceCollection services)
{ services.AddControllersWithViews().AddDapr();
services.AddRazorPages();
services.AddScoped<InvocationHandler>(); // 注入httpClient
services.AddHttpClient("HttpClient").AddHttpMessageHandler<InvocationHandler>()
.AddTypedClient(client =>
{
client.BaseAddress = new Uri("http://serviceapi1");
return RestService.For<ICallServiceApi1>(client);
});
}

在DaprTest1.Server项目的WeatherForecastController.cs文件中注入DaprClient对象

  private readonly DaprClient _daprClient;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, ICallServiceApi1 callServiceApi1, DaprClient daprClient)
{
_logger = logger;
_callServiceApi1 = callServiceApi1;
_daprClient = daprClient;
}

1.2         状态保存接口

在DaprTest1.Server项目的WeatherForecastController.cs文件中增加状态保存接口。

  [HttpPost(nameof(SaveStateValue))]
public async Task SaveStateValue(StateModel stateModel)
{
await _daprClient.SaveStateAsync("statestore", stateModel.Key, stateModel.Value);
}

其中 StateModel  为自定义的状态模型对象。

1.3         状态删除接口

在DaprTest1.Server项目的WeatherForecastController.cs文件中增加状态删除接口。

 [HttpDelete(nameof(DeleteStateValue) + "/{stateKey}")]
public async Task DeleteStateValue(string stateKey)
{
await _daprClient.DeleteStateAsync("statestore", stateKey);
}

1.4         状态获取接口

在DaprTest1.Server项目的WeatherForecastController.cs文件中增加两个状态获取接口。

 [HttpGet("GetStateValue/{stateKey}")]
public async Task<string> GetStateValue(string stateKey)
{
return await _daprClient.GetStateAsync<string>("statestore", stateKey);
} [HttpGet(nameof(GetStateValueFromState) + "/{stateKey}")]
public async Task<string> GetStateValueFromState([FromState("statestore", "stateKey")] StateEntry<string> stateEntry)
{
return await Task.FromResult(stateEntry.Value);
}

注意,第二个状态获取接口是通过ASP.NET Core 模型绑定实现的。

2         状态管理菜单和页面

在DaprTest1.Server项目的NavMenu.razor文件新增状态管理菜单。

 <li class="nav-item px-3">
<NavLink class="nav-link" href="statemanage">
<span class="oi oi-list-rich" aria-hidden="true"></span> 状态管理
</NavLink>
</li>

在DaprTest1.Server项目新增状态管理页面

@page "/statemanage"
@using DaprTest1.Shared
@using System.Text.Json
@inject HttpClient Http <h1>状态存储</h1> <p>This component demonstrates storing state.</p> <p>状态键: TestStateKey, 状态值:<input type="text" @bind="stateModel.Value" /></p> <button class="btn btn-primary" @onclick="SaveStateValue">保存状态</button>
<button class="btn btn-primary" @onclick="DeleteStateValue">删除状态</button>
<button class="btn btn-primary" @onclick="GetStateValue">获取状态</button>
<button class="btn btn-primary" @onclick="GetStateValueFromState">获取状态[FromState]</button> <p>获取到的状态值: @stateValue</p> @code {
private StateModel stateModel = new StateModel() { Key = "TestStateKey" };
private string stateValue = ""; private async Task SaveStateValue()
{
await Http.PostAsJsonAsync<StateModel>("WeatherForecast/SaveStateValue", stateModel);
}
private async Task DeleteStateValue()
{
await Http.DeleteAsync("WeatherForecast/DeleteStateValue/" + stateModel.Key);
}
private async Task GetStateValue()
{
stateValue = await Http.GetStringAsync("WeatherForecast/GetStateValue/" + stateModel.Key);
}
private async Task GetStateValueFromState()
{
stateValue = await Http.GetStringAsync("WeatherForecast/GetStateValueFromState/" + stateModel.Key);
}
}

3         状态管理测试

和上一节一样,我们先开启每个微服务的SideCar,然后启动两个微服务,访问状态管理页面:

相关代码:iamxiaozhuang/dapr-test (github.com)

Blazor+Dapr+K8s微服务之状态管理的更多相关文章

  1. Blazor+Dapr+K8s微服务之开发环境调试

    1         安装Dapr开发调试环境 1.1         Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...

  2. Blazor+Dapr+K8s微服务之服务调用

    1.1         Dapr环境配置 1.1.1        在开发机安装Docker Desktop并启用Kubernetes 安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和 ...

  3. Blazor+Dapr+K8s微服务之事件发布订阅

    我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1         在blazo ...

  4. Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

         前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...

  5. 【性能测试实战】jmeter + k8s + 微服务 + skywalking + efk,测试都在学的热门技术

    原文持续更新完善:https://www.cnblogs.com/uncleyong/p/15475614.html 前言:当前的热门主流技术是哪些?测开为啥那么火?90%以上的测试对测开认识不准确 ...

  6. 【性能测试实战:jmeter+k8s+微服务+skywalking+efk】系列之:性能测试场景设计

    说明: 本文是基于虚拟机环境配置设计的 性能测试需求 总tps≥100 每个业务的rt<500ms 持续稳定跑50万业务量 单场景 目的:找到单场景的性能问题,为容量场景提供参考,如果低于容量场 ...

  7. 【性能测试实战:jmeter+k8s+微服务+skywalking+efk】系列之:性能监控、分析、调优等

    说明: 本文是基于虚拟机演示的,资源有限 skywalking中拓扑图 kubectl get po -A -owide 测试执行:单场景 查询礼品 jmeter -n -t gift.jmx -l ...

  8. 从零开始,使用Dapr简化微服务

    序言 现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系统过于臃肿重量级. Dapr作为新一代微服务模式,使用sidecar ...

  9. Dapr实战(三)状态管理

    状态管理解决了什么 分布式应用程序中的状态可能很有挑战性. 例如: 应用程序可能需要不同类型的数据存储. 访问和更新数据可能需要不同的一致性级别. 多个用户可以同时更新数据,这需要解决冲突. 服务必须 ...

随机推荐

  1. 浅谈C++11中的多线程(三)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  2. 使用oss来存取及优化图片资源

    目录 1. 开通阿里云OSS,并创建存储空间 2. 图片上传及处理 2.1 图片上传 2.2 图片处理 前言: 在日常开发中,不免会遇到需要实现图片上传与展示的需求.比如一个文章发布系统,我们通常会开 ...

  3. java基础---集合(1)

    一. 基本概念 集合.数组都是对多个数据进行存储操作的结构,简称Java容器 数组:长度确定,类型确定,对于添加.删除.插入等操作效率不高,元素有序可重复 Java中集合框架顶层框架是:java.ut ...

  4. Blazor 数据绑定开发指南

    翻译自 Waqas Anwar 2021年3月21日的文章 <A Developer's Guide to Blazor Data Binding> [1] 现如今,大多数 Web 应用程 ...

  5. PYTHON 错误提示:ModuleNotFoundError: No module named 'cv2'

    ModuleNotFoundError: No module named 'cv2' 解决方法: pip install -i https://pypi.tuna.tsinghua.edu.cn/si ...

  6. C语言:预处理 自定义头文件

    DEV-C++包含文件搜索路径C:\Program Files\Dev-Cpp\MinGW64\x86_64-w64-mingw32\includeC:\Program Files\Dev-Cpp\M ...

  7. 详解Lombok中的@Builder用法

    Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder注释为你的类生成相对略微复杂 ...

  8. java并发编程基础——线程通信

    线程通信 当线程在系统内运行时,程序通常无法准确的控制线程的轮换执行,但我们可以通过一些机制来保障线程的协调运行 一.传统的线程通信 传统的线程通信主要是通过Object类提供的wait(),noti ...

  9. python基础之os模块操作

    # os模块 目录相关内置库import os# . 当前目录 .. 返回上一级目录# 1. os.path.abspath() --获取当前文件的绝对路径(不包含os模块.py) pwd# path ...

  10. 为了让她学画画——熬夜用canvas实现了一个画板

    前言 大家好,我是Fly, canvas真是个强大的东西,每天沉迷这个无法自拔, 可以做游戏,可以对图片处理,后面会给大家分享一篇,canvas实现两张图片找不同的功能, 听着是不是挺有意思的, 有点 ...