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

题记:上篇介绍了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 后  ,再进行购买。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——最短路径算法之floyd算法

数据结构——最短路径算法之floyd算法 (一) Flody算法 【前言】:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径。那么,如果我们要求图中任意两个结点之间的最短路径,如何用算法来实现呢?如果用Dijkstra来实现,就需要每次改变源…

详解python运行三种方式_详解python调用cmd命令三种方法

目前我使用到的python中执行cmd的方式有三种使用os.system("cmd")该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况…

一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor

项目简介QuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心&#xff0c;实践应用 Ant Design Blazor 和 FreeSql 两个技术&#xff0c; 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦&#xff0c;对有 Quartz 有需求的小伙伴亦可以开箱即用Code First…

如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数&#xff0c;而如何去查看和设置 JVM 的 XX 参数也是调优的基本功&#xff0c;本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version&#xff0c;获取JDK版本…

ASP VNext 开源服务容错处理库Polly

背景Polly是一个.NET弹性和瞬态故障处理库&#xff0c;允许开发人员以流畅和线程安全的方式表达诸如重试&#xff0c;断路器&#xff0c;超时&#xff0c;隔离头和回退之类的策略。Polly面向.NET Standard 1.1&#xff08;覆盖范围&#xff1a;.NET Core 1.0&#xff0c;Mono&a…

python中定制类_python定制类__str__(实例详解)

在接下来的文章中,让我们明白什么是python中的自定义类。学习什么是python的自定义类,python定制类可以扮演何种角色在python编程。当你看到像__xxx__ __slots__变量或函数名,你应该注意他们。这些在Python中有特殊用途。我们已经知道如何使用__slots__,我们也知道__len__()方法…

如何在 C# 中使用 Exceptionless

背景“Exceptionless”一词的定义是&#xff1a;无例外。Exceptionless可为您的JavaScript&#xff0c;Node&#xff0c;.NET Core&#xff0c;ASP.NET&#xff0c;Web API&#xff0c;WebForms&#xff0c;WPF&#xff0c;控制台和MVC应用程序提供实时错误报告。它将收集到的信…

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言&#xff1a;从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用&#xff0c;我们在进行FPGA外设硬件及软件设计时&#xff0c;如ADC、PHY、DDR3等&#xff0c;通常会涉及到该资源。本节我们介绍以下知识点&#xff1a;SelectIO资源概述及结构SelectIO管脚通用设…

IdentityServer4系列 | 混合模式

一、前言在上一篇关于授权码模式中&#xff0c; 已经介绍了关于授权码的基本内容&#xff0c;认识到这是一个拥有更为安全的机制,但这个仍然存在局限&#xff0c;虽然在文中我们说到通过后端的方式去获取token,这种由web服务器和授权服务器直接通信&#xff0c;不需要经过用户的…

3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...

大家都知道&#xff0c;现在不少的大佬比起用Word、Excel等等这些格式文件&#xff0c;它们更喜欢使用PDF文件。而我们不管是将Word、Excel等文件转换成PDF&#xff0c;还是将PDF转换成其他格式文件&#xff0c;都是一件麻烦事&#xff0c;更别说在手机上操作这一切了。别担心&…

如何使用 C# 中的 Tuple

开局一张图&#xff0c;首先声明的是 Tuple 不是什么新鲜概念&#xff0c;在编程语言 F#&#xff0c;Python 中早就有这个了&#xff0c;Tuple 是一种 有序的&#xff0c;有限不可变的&#xff0c;支持混杂类型的固定个数的 一种数据结构&#xff0c;有些朋友可能就想问了&…

中设置colorbar_【值得收藏】如何画出学术论文中需要的各种精美插图,看这一篇就够了!...

本文整理自知乎问答&#xff0c;仅用于学术分享&#xff0c;著作权归作者所有。如有侵权&#xff0c;请联系后台作删文处理。方法一作者&#xff5c;冯昱尧https://www.zhihu.com/question/21664179/answer/18928725强烈推荐 Python 的绘图模块 matplotlib: python plotting 。…

一文说通C#中的异步迭代器

今天来写写C#中的异步迭代器 - 机制、概念和一些好用的特性迭代器的概念迭代器的概念在C#中出现的比较早&#xff0c;很多人可能已经比较熟悉了。通常迭代器会用在一些特定的场景中。举个例子&#xff1a;有一个foreach循环&#xff1a;foreach (var item in Sources) {Console…

GraphQL:Descriptor Attributes

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述&#xff0c;使得客户端能够准确地获得它需要的数据&#xff0c;而且没有任何冗余&#xff0c;也让 API 更容易地随着时间推移而演进&#xff0c…

idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上

在IDEA中如何初始化Git&#xff0c;把项目推送到Git上登录Gitee(码云)账号&#xff0c;新建仓库先按如下步骤简单新建一个仓库&#xff1a;创建成功后&#xff0c;会出现下图中所示的原始文件&#xff1a;在IDEA上的Terminal中进行操作注意&#xff1a;可能有些朋友刚打开Termi…

大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍

紧急提醒&#xff1a;还有1天&#xff01;2020.NET开发者大会就要开幕啦&#xff01;你都做好参会准备没有&#xff1f;特殊时期&#xff0c;为方便小伙伴们顺利参会&#xff0c;小编特意整理了这篇大会参会攻略&#xff0c;大到各种日程安排、小到签到、出行、防疫等&#xff…

大曾幽默打油诗_这才是真正的幽默打油诗,逗人一笑,又引人深思!

阅读本文前&#xff0c;请您先点击上面的蓝色字体“点点星光”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注来源&#xff1a;诗词天地大曾 &#xff0c;曾初良&#xff0c;也乐斋主&#xff0c…

如何使用第三方日志记录提供程序替代.NET Core中的内置程序

背景.NET Core 支持适用于各种内置和第三方日志记录提供程序的日志记录 API。 先来看下如何将日志记录 API 与内置提供程序一起使用。调用 CreateDefaultBuilder&#xff0c;这将添加以下日志记录提供程序&#xff1a;控制台调试EventSourceEventLog&#xff1a;仅限 Windowspu…

mysql新加不了数据库_MySQL数据库之mysql增加新用户无法登陆解决方法

本文主要向大家介绍了MySQL数据库之mysql增加新用户无法登陆解决方法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。今天安装openstack folsom版本&#xff0c;安装完mysql&#xff0c;为各个服务增加对应的数据库和用户后&#xff0c…

编程去除背景绿幕抠图,基于.NET+OpenCVSharp

摘要&#xff1a;本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式&#xff0c;对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatExpr等托管资源释放的方法。本文还介绍了“高效摄像头播放控件”以及和OpenCVSharp的性…