Dapr微服务应用开发系列2:Hello World与SDK初接触
题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发
Hello World
Dapr应用的Hello World其实和其他的Hello World一样简单:
- 首先用你喜欢的语言和框架创建一个Hello World程序。比如在.NET 5下,就可以简单的这样实现
dotnet new console -o dapr-hello-world - 只是运行这个Hello World不是直接启动程序,而是通过Dapr来启动:
dapr run --app-id hello-dotnet-dapr -- dotnet run - 上面这个命令,通过传入一个app-id参数来指明这个Dapr应用的名称为“hello-dotnet-dapr”,当然你也可以忽略这个参数,那么Dapr会自动分配一个(如docker运行容器实例那样)
- 而“--”之后就是应用程序本身的启动命令行
PS:对于dapr run更多的帮助信息,可以通过 dapr run --help 来查看
服务调用的Hello World
接下来,我们来做一个服务调用的Hello World。我还是基于.NET 5中的ASP.NET Core来作为开发框架:
- 在命令行中输入如下命令来创建一个ASP.NET Core的Web API项目:
dotnet new webapi -o dapr-service-invocation --no-https --no-openapi - 然后就可以使用Dapr CLI来运行这个服务了:
dapr run --app-id dotnetapp --app-port 5000 --dapr-http-port 13501 -- dotnet run - 其中通过app-port参数指明了这个Web API服务的侦听端口为5000,让Dapr知道如何和你的应用进行配对;使用dapr-http-port参数指明了Dapr边车暴露的http端口为13501,方便外部或者其他Dapr边车知道如何和你的应用边车进行交互。
- Dapr应用起来之后,就可以使用VS Code的REST Client插件来访问其中的地址了:
GET http://localhost:13501/v1.0/invoke/dotnetapp/method/WeatherForecast
示例代码可以参见这里:https://github.com/heavenwing/dapr-dotnet-quickstarts/tree/main/ServiceInvocation
状态管理的Hello World
状态管理的Hello World稍微复杂一点。你可以把对Dapr状态管理接口的访问代码添加到第一个示例当中(控制台程序)也可以添加到第二个示例当中(Web应用程序)。我们来基于控制台程序访问状态管理接口:
1,新建或者打开现有的一个dotnet控制台程序,首先创建如下实体类:
publicclassOrder
{
publicint Id { get; set; }
publicint Amount { get; set; }
}
2,在Program中添加如下常量或静态字段:
staticstring daprPort = Environment.GetEnvironmentVariable("DAPR_HTTP_PORT") ?? "3500";
conststring stateStoreName = "statestore";//default state store name
conststring stateKey = "order-17";
staticstring stateUrl = $"http://localhost:{daprPort}/v1.0/state/{stateStoreName}";
其中第1句,从环境变量中得到Dapr边车暴露的http端口;第2句设置状态存储空间名称,Dapr本地开发环境会提供一个默认的statestore给你;第4句定义了Dapr状态管理的访问地址
3,为了保存状态值,需要先定义状态内容:
var state = new List<object>
{
new
{
key = stateKey,
value = new Order
{
Id = 17,
Amount = 1
}
}
};
4,通过Post方法把序列化后的状态值提交到Dapr的接口上:
var request = new HttpRequestMessage(HttpMethod.Post, stateUrl);
request.Content = new StringContent(JsonSerializer.Serialize(state));
var response = await httpClient.SendAsync(request);
5,使用Get方法从Dapr中获取状态值,需要传入你需要获取的状态key:
request = new HttpRequestMessage(HttpMethod.Get, $"{stateUrl}/{stateKey}");
response = await httpClient.SendAsync(request);
Console.WriteLine($"Respone content: {await response.Content?.ReadAsStringAsync()}");
6,使用Delete方法从Dapr中输出状态值,需要传入你需要输出的状态key:
request = new HttpRequestMessage(HttpMethod.Delete, $"{stateUrl}/{stateKey}");
response = await httpClient.SendAsync(request);
7,最后使用如下命令来运行这个Dapr应用:dapr run --app-id dotnetapp --dapr-http-port 13502 -- dotnet run
我们可以在控制台中看到状态值被保存、获取和删除的提示信息。
完整的示例代码可以在这里查看:https://github.com/heavenwing/dapr-dotnet-quickstarts/tree/main/StateManagement
dotnet SDK初接触
上面在应用代码当中直接使用rest api去访问Dapr的状态管理接口,肯定显得稍微复杂。其实我们可以直接通过Dapr提供的dotnet SDK来方便的开发Dapr应用。
dotnet SDK的源代码地址在:https://github.com/dapr/dotnet-sdk
在dotnet SDK中,我最近还合并进去了一个pr,提供如何通过gRPC来包含服务调用接口的示例。大家可以查看这里:https://github.com/dapr/dotnet-sdk/tree/master/samples/AspNetCore/GrpcServiceSample
当然也可以通过Nuget来引用:https://www.nuget.org/packages?q=Tags%3A"Dapr"
通过sdk,我们要访问状态管理就非常简单了,比如如下的示例代码实现一个简单的deposit操作:
var state = await _daprClient.GetStateEntryAsync<Account>(StoreName, transaction.Id);
state.Value ??= new Account() { Id = transaction.Id, };
state.Value.Balance += transaction.Amount;
await state.SaveAsync();
后续与.NET Conf 2020
接下来的文章我将会开始逐一介绍Dapr中的各个构件块。如果对Dapr感兴趣,又希望快点跟着我深入了解的。可以参加本周末12月19日在苏州举行的2020中国.NET开发者峰会,我在这个会议上会分享一个关于Dapr的主题:《Dapr开启微服务应用开发新世界》,欢迎到现场或者线上和我交流讨论。
关于2020中国.NET开发者峰会的信息可以看这里:https://www.cnblogs.com/shanyou/p/14118444.html
另外,我这里送现场票5张,先到先得: dotNETZHYGXH dotNETZHYGCZ dotNETZHYGcU dotNETZHYGas dotNETZHYGVJ
PS:请通过以下链接报名:http://hdxu.cn/yzcnG操作步骤为:
- 注登录活动行;
- 先点击【我有优惠码】并输入;
- 兑换成功,【合作伙伴票】变为 0 后 ,再进行购买。
Dapr微服务应用开发系列2:Hello World与SDK初接触的更多相关文章
- Dapr微服务应用开发系列0:概述
题记:Dapr是什么,Dapr包含什么,为什么要用Dapr. Dapr是什么 Dapr(Distributed Application Runtime),是微软Azure内部创新孵化团队的一个开源项目 ...
- Dapr微服务应用开发系列3:服务调用构件块
题记:这篇开始逐一深入介绍各个构件块,从服务调用开始 原理 所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的. ...
- Dapr微服务应用开发系列1:环境配置
题记:上篇Dapr系列文章简要介绍了Dapr,这篇来谈一下开发和运行环境配置 本机开发环境配置 安装Docker 为了方便进行Dapr开发,最好(其实不一定必须)首先在本机(开发机器)上安装Docke ...
- Blazor+Dapr+K8s微服务之开发环境调试
1 安装Dapr开发调试环境 1.1 Dapr 完整安装模式不支持开发调试 在上一篇随笔<Blazor+Dapr+K8s微服务之服务调用>中,我们通过为每个 ...
- CODING DevOps 微服务项目实战系列第一课,明天等你
CODING DevOps 微服务项目实战系列第一课<DevOps 微服务项目实战:DevOps 初体验>将由 CODING DevOps 开发工程师 王宽老师 向大家介绍 DevOps ...
- CODING DevOps 微服务项目实战系列最后一课,周四开讲!
随着软件工程越来越复杂化,如何在 Kubernetes 集群进行灰度发布成为了生产部署的"必修课",而如何实现安全可控.自动化的灰度发布也成为了持续部署重点关注的问题.CODING ...
- 一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装(转载 https://www.cnblogs.com/alangur/p/8339905.html)
(一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装 (1)下载erlang: http://www.erlang.org/download/otp_win64 ...
- 转载 (三)surging 微服务框架使用系列之我的第一个服务(审计日志)
(三)surging 微服务框架使用系列之我的第一个服务(审计日志) 前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志 ...
- Apollo-open-capacity-platform 微服务能力开发平台 (转)
来自大佬的apollo整合微服务的教程:欢迎大家点评和star,链接如下:https://gitee.com/owenwangwen/open-capacity-platform 官方demo链接:h ...
随机推荐
- 【MySQL】DDL数据定义语言的基本用法create、drop和alter(增删改)
DDL 的基础语法 文章目录 DDL 的基础语法 对数据库进行定义 对数据表进行定义 创建表结构(数据表) 设计工具 修改表结构 小结 参考资料 简单复习一波 SQL必知必会 DDL 的英文全称是 D ...
- 【MySQL】使用WHERE子句 - 过滤数据
第6章 过滤数据 文章目录 第6章 过滤数据 1.使用WHERE子句 2.WHERE子句操作符 2.1.检查单个值 2.2.不匹配检查 2.3.范围值检查 2.4.空值检查 3.小结 简单记录 - M ...
- pycharm工具的使用
一.Pycharm常用快捷键 快捷键 作用 备注 ctrl + win + 空格 自动提示并导包 连按两次 ctrl + alt + 空格 自动提示并导包 连按两次 Alt + Ente ...
- Python Debug工具
最近在github上冒出了一个python的debug神器PySnooper,号称在debug时可以消灭print.那么该工具有哪些优点呢,如何使用该工具呢.本文就介绍该工具的优缺点和使用方式. 前言 ...
- Flask扩展点总结(信号)
信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 根据flask项目的请求流程来进行设置扩展点 1.中间件 from ...
- Py变量,递归,作用域,匿名函数
局部变量与全局变量 全局变量:全局生效的变量,在顶头的,无缩进的定义的变量. 局部变量:函数内生效的变量,在函数内定义的变量. name='1fh' def changename(): name='s ...
- Linux定时任务crontab通俗易懂简单扼要地解析
1.安装crontab 在配置好yum源的情况下,直接执行如下命令即可: yum install crontab 2.查看当前环境上已经有的定时任务有哪些? 执行如下命令即可 crontab -l 如 ...
- CSS奇思妙想 -- 使用 CSS 创造艺术
本文属于 CSS 绘图技巧其中一篇.之前有过一篇:在 CSS 中使用三角函数绘制曲线图形及展示动画 想写一篇关于 CSS 创造艺术的文章已久,本文主要介绍如何借助 CSS-doodle ,利用 CSS ...
- Spring之 IOC&依赖注入
0x01.Spring 1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦). 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组 ...
- 用动图讲解分布式 Raft
一.Raft 概述 Raft 算法是分布式系统开发首选的共识算法.比如现在流行 Etcd.Consul. 如果掌握了这个算法,就可以较容易地处理绝大部分场景的容错和一致性需求.比如分布式配置系统.分布 ...