Blazor+Dapr+K8s微服务之状态管理
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微服务之状态管理的更多相关文章
- Blazor+Dapr+K8s微服务之开发环境调试
1 安装Dapr开发调试环境 1.1 Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...
- Blazor+Dapr+K8s微服务之服务调用
1.1 Dapr环境配置 1.1.1 在开发机安装Docker Desktop并启用Kubernetes 安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和 ...
- Blazor+Dapr+K8s微服务之事件发布订阅
我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1 在blazo ...
- Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务
前面文章已经演示过,将我们的示例微服务程序DaprTest1部署到k8s上并运行.当时用的k8s是Docker for desktop 自带的k8s,只要在Docker for deskto ...
- 【性能测试实战】jmeter + k8s + 微服务 + skywalking + efk,测试都在学的热门技术
原文持续更新完善:https://www.cnblogs.com/uncleyong/p/15475614.html 前言:当前的热门主流技术是哪些?测开为啥那么火?90%以上的测试对测开认识不准确 ...
- 【性能测试实战:jmeter+k8s+微服务+skywalking+efk】系列之:性能测试场景设计
说明: 本文是基于虚拟机环境配置设计的 性能测试需求 总tps≥100 每个业务的rt<500ms 持续稳定跑50万业务量 单场景 目的:找到单场景的性能问题,为容量场景提供参考,如果低于容量场 ...
- 【性能测试实战:jmeter+k8s+微服务+skywalking+efk】系列之:性能监控、分析、调优等
说明: 本文是基于虚拟机演示的,资源有限 skywalking中拓扑图 kubectl get po -A -owide 测试执行:单场景 查询礼品 jmeter -n -t gift.jmx -l ...
- 从零开始,使用Dapr简化微服务
序言 现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系统过于臃肿重量级. Dapr作为新一代微服务模式,使用sidecar ...
- Dapr实战(三)状态管理
状态管理解决了什么 分布式应用程序中的状态可能很有挑战性. 例如: 应用程序可能需要不同类型的数据存储. 访问和更新数据可能需要不同的一致性级别. 多个用户可以同时更新数据,这需要解决冲突. 服务必须 ...
随机推荐
- java基础---类和对象(1)
一. 类和对象 面向对象:以属性和行为的观点去分析现实生活中的事物,将功能封装进对象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做 ...
- QT从入门到入土(三)——文件的读写操作
引言 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能. Qt 提供了两种读写纯文本文件的基本方法: 用 QFi ...
- luogu2594 [ZJOI2009]染色游戏
做法其他题解已经说得很清楚了,但似乎没有对于本题 SG 函数正确性的证明,我来口胡一下( 证明: 猜想: \[\operatorname{SG}(i,j)=\begin{cases}\operator ...
- python删除文件中某一行
将文本中的 tasting123删除 with open("fileread.txt","r",encoding="utf-8") as f ...
- Python之抖音快手代码舞--字符舞
先上效果,视频敬上: 字符舞: 代码舞 源代码: video_2_code_video.py 1 import argparse 2 import os 3 import cv2 4 import s ...
- SpringBoot配置Https
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认 ...
- Day12 抽象类、接口、内部类-面向对象编程(3)
抽象类 abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类: 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类. ...
- 前端开发入门到进阶附录一【JQuery中parent(),parents(),parentsUntil()区别和使用技巧】
JQuery中parent(),parents(),parentsUntil()区别和使用技巧:https://blog.csdn.net/china1223/article/details/5193 ...
- 公有云上构建云原生 AI 平台的探索与实践 - GOTC 技术论坛分享回顾
7 月 9 日,GOTC 2021 全球开源技术峰会上海站与 WAIC 世界人工智能大会共同举办,峰会聚焦 AI 与云原生两大以开源驱动的前沿技术领域,邀请国家级研究机构与顶级互联网公司的一线技术专家 ...
- C语言学习之基本数据类型【一】
近期学习鸿蒙硬件物联网开发,用到的开发语言是C: 一.基础语法:第一个案例: 命令 gcc hello.c #include <stdio.h> //stdio.h 是一个头文件 , #i ...