题记:上篇介绍了Dapr的环境配置,这次我们来动手尝试一下Dapr应用的开发

Hello World

Dapr应用的Hello World其实和其他的Hello World一样简单:

  1. 首先用你喜欢的语言和框架创建一个Hello World程序。比如在.NET 5下,就可以简单的这样实现 dotnet new console -o dapr-hello-world

  2. 只是运行这个Hello World不是直接启动程序,而是通过Dapr来启动:dapr run --app-id hello-dotnet-dapr -- dotnet run

  3. 上面这个命令,通过传入一个app-id参数来指明这个Dapr应用的名称为“hello-dotnet-dapr”,当然你也可以忽略这个参数,那么Dapr会自动分配一个(如docker运行容器实例那样)

  4. 而“--”之后就是应用程序本身的启动命令行

PS:对于dapr run更多的帮助信息,可以通过 dapr run --help 来查看

服务调用的Hello World

接下来,我们来做一个服务调用的Hello World。我还是基于.NET 5中的ASP.NET Core来作为开发框架:

  1. 在命令行中输入如下命令来创建一个ASP.NET Core的Web API项目:dotnet new webapi -o dapr-service-invocation --no-https --no-openapi

  2. 然后就可以使用Dapr CLI来运行这个服务了:dapr run --app-id dotnetapp --app-port 5000 --dapr-http-port 13501 -- dotnet run

  3. 其中通过app-port参数指明了这个Web API服务的侦听端口为5000,让Dapr知道如何和你的应用进行配对;使用dapr-http-port参数指明了Dapr边车暴露的http端口为13501,方便外部或者其他Dapr边车知道如何和你的应用边车进行交互。

  4. 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控制台程序,首先创建如下实体类:

public class Order
{public int Id { get; set; }public int Amount { get; set; }
}

2,在Program中添加如下常量或静态字段:

static string daprPort = Environment.GetEnvironmentVariable("DAPR_HTTP_PORT") ?? "3500";
const string stateStoreName = "statestore";//default state store name
const string stateKey = "order-17";
static string 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开发者峰会的信息可以看这里:2020 . NET大会日程公布!行程亮点全曝光

另外,我这里送现场票5张,先到先得: dotNETZHYGXH dotNETZHYGCZ dotNETZHYGcU dotNETZHYGas dotNETZHYGVJ PS:请通过以下链接报名:http://hdxu.cn/yzcnG操作步骤为:

  1. 注登录活动行;

  2. 先点击【我有优惠码】并输入;

  3. 兑换成功,【合作伙伴票】变为 0 后  ,再进行购买。

Dapr微服务应用开发系列2:Hello World与SDK初接触相关推荐

  1. Dapr微服务应用开发系列5:发布订阅构建块

    题记:这篇介绍发布订阅构建块,这是对事件驱动架构设计的一种实现落地. 注:对于"Building Blocks"这个词组的翻译,我之前使用了"构件块",现在和官 ...

  2. Dapr微服务应用开发系列4:状态管理构件块

    Dapr微服务应用开发系列0:概述 Dapr微服务应用开发系列1:环境配置 Dapr微服务应用开发系列2:Hello World与SDK初接触 Dapr微服务应用开发系列3:服务调用构件块 题记:这篇 ...

  3. Dapr微服务应用开发系列3:服务调用构件块

    题记:这篇开始逐一深入介绍各个构件块,从服务调用开始 原理 所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的. ...

  4. Dapr微服务应用开发系列0:概述

    题记:Dapr是什么,Dapr包含什么,为什么要用Dapr. Dapr是什么 Dapr(Distributed Application Runtime),是微软Azure内部创新孵化团队的一个开源项目 ...

  5. Dapr微服务应用开发系列1:环境配置

    题记:上篇Dapr系列文章简要介绍了Dapr,这篇来谈一下开发和运行环境配置 本机开发环境配置 安装Docker 为了方便进行Dapr开发,最好(其实不一定必须)首先在本机(开发机器)上安装Docke ...

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

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

  7. (二)surging 微服务框架使用系列之surging 的准备工作consul安装(转载 https://www.cnblogs.com/alangur/p/8377977.html)...

    (二)surging 微服务框架使用系列之surging 的准备工作consul安装 suging 的注册中心支持consul跟zookeeper.因为consul跟zookeeper的配置都差不多, ...

  8. gradle 指定springcloud 版本_SpringCloud微服务架构开发实战:实现服务注册与发现

    实现服务的注册与发现 在前面分别用Eureka Server和Eureka Client来搭建了一台注册服务器,以及多个Eureka Client客户端.Eureka Client在启动后,就会将自己 ...

  9. Aooms_基于SpringCloud的微服务基础开发平台实战_002_工程构建

    为什么80%的码农都做不了架构师?>>>    一.关于框架更名的一点说明 最近在做年终总结.明年规划.还有几个项目需要了结.出解决方案,事情还比较多,死了不少脑细胞,距离上一篇文章 ...

最新文章

  1. php redis 安装和使用
  2. python中使用html前端页面显示图像预测结果(改进)
  3. 团队-象棋游戏-模块测试过程
  4. 重磅!Nature盘点年度十佳论文,生命科学占据半壁江山,中国学者表现亮眼
  5. 滑动拼图验证码操作步骤:_拼图项目:一个不完整的难题
  6. Python基础(六)--类与对象
  7. mysql 的命令行操作
  8. HTML5之语义化标签
  9. (C语言)用C语言编写小游戏——扫雷
  10. 第 1 章 程序员考试简介
  11. 谷歌翻译退出中国市场?我们还有这个!
  12. 利用iTunes传输大型文件电脑--ipad
  13. 计算机网络由通讯子网和什么组成,计算机网络由通信子网和什么子网组成
  14. Flutter的生命周期
  15. 怎样在服务器找回网站后台密码,宝塔面板忘记后台账号密码怎么找回 一条命令轻松搞定...
  16. red5 1.0.7 集成tomcat 并且 进行整合 官方例子oflaDemo
  17. 程序员,你的身体还健康吗?
  18. 提高工作效率的15个技巧
  19. 函数对称性常见公式_求一些函数对称性,周期性的常见结论及其证明方法
  20. 带宽、数据率(比特率)、吞吐量的理解

热门文章

  1. C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
  2. UIView中常用的方法
  3. 10进制转化为16进制以内的转化
  4. 设计模式建议学习顺序
  5. 【转】sqlserver游标概念与实例全面解说
  6. 开源播放器 Banshee 发布 1.0 beta 2
  7. 记事本状态栏不会自动_如何在记事本中同时启用状态栏和自动换行
  8. phpstorm config include paths for swoole
  9. ffmpeg speex转换为mp3或者aac
  10. T-SQL利用Row_Number函数实现分页