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实战(三)状态管理
状态管理解决了什么 分布式应用程序中的状态可能很有挑战性. 例如: 应用程序可能需要不同类型的数据存储. 访问和更新数据可能需要不同的一致性级别. 多个用户可以同时更新数据,这需要解决冲突. 服务必须 ...
随机推荐
- Flask(11)- 操作 Cookie
前言 Cookie 详解:https://www.cnblogs.com/poloyy/p/12513247.html 这一节来瞧一瞧如何用 Flask 操作 Cookie 接下来就是 实战栗子!!! ...
- IO编程之NIO
从jdk1.4开始,java提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),这些类都被放在java.nio包以及子包中,并且对原java.io包中的很多类 ...
- 解析ArrayList的底层实现(上)
private static final long serialVersionUID = 8683452581122892189L;//唯一序列号ID private static final int ...
- vue tab实现右定位
呈现效果 利用v-if进行判断,登页面完全加载完毕后,显示tab页, 利用name标签,实现选择哪个tab <template> <el-tabs v-if="displa ...
- Axure RP 9 Enterprise/Pro/Team for Mac/Windows安装破解版激活教程
Axure RP 9.0 是一款功能强大的.操作方便.专业可靠的快速原型设计工具.一款能够在这里体验最简单的设计方式,这里有着全新的升级的软件界面,更加的时尚,更加的丰富,专为每一个用户提供了便捷的设 ...
- (Opencv4)二值化图像
(Opencv4)二值化图像 ret, dst = cv2.threshold(src, thresh, maxval, type) threshold : 极限,临界值,阈值 ret: 一个数 s ...
- 【阅读笔记】Java核心技术卷一 #6.Chapter8
8 泛型程序设计 8.1 为什么要使用泛型程序设计 类型参数(type parameters)(E.T.S...) 通配符类型(wildcard type)(?) 注意这两者用法用处并不同. 8.2 ...
- <textarea></textarea>标签的placeholder属性不生效问题
<textarea></textarea>标签的placeholder属性不生效问题 1.在用到<textarea></textarea>标签时,设 ...
- npm命令,nrm命令,n命令, nvm命令
npm命令 npm/yarn config set registry https://registry.npm.taobao.org 设置淘宝镜像npm/yarn config get registr ...
- java构造器级简单内存分析
java构造器的使用(基础篇) 构造方法也叫构造器,是创建对象时执行的特殊方法,一般用于初始化新对象的属性. 基本定义语法: 访问控制符 构造方法名([参数列表]){ 方法体 } 注:"访问 ...