首页 > 其他分享 >Dapr微服务应用开发系列2:Hello World与SDK初接触

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

时间:2024-03-27 09:13:49浏览次数:28  
标签:-- Dapr dapr dotnet World Hello

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

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操作步骤为:

  1. 注登录活动行;
  2. 先点击【我有优惠码】并输入;
  3. 兑换成功,【合作伙伴票】变为 0 后  ,再进行购买。  
    转自 https://www.cnblogs.com/redmoon/p/14141624.html

标签:--,Dapr,dapr,dotnet,World,Hello
From: https://www.cnblogs.com/siyunianhua/p/18098137

相关文章

  • Dapr微服务应用开发系列3:服务调用构件块
    原理所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的。而方便的含义在于,你无需担心如下问题:如何发现其他服务,不用关心调用的链路以及负载均衡调用过程中如何保证安全性在遇到瞬态错误或中断的时候......
  • Dapr微服务应用开发系列4:状态管理构件块
    原理要用好这个构件块,首先需要正确理解状态管理的概念。大部分微服务开发框架或者说指导,都提倡微服务以无状态类型的方式来运行,这种无状态微服务当然更容易进行伸缩,但是在遇到需要处理一些类似Session这样的数据的时候,为了应对分布式的环境往往要借助于外部存储(一般是数据库或者......
  • Dapr微服务应用开发系列5:发布订阅构建块
    题记:这篇介绍发布订阅构建块,这是对事件驱动架构设计的一种实现落地。注:对于“BuildingBlocks”这个词组的翻译,我之前使用了“构件块”,现在和官方文档(Dapr中文社区的贡献)保持一致,采用“构建块”。原理发布订阅的概念来自于事件驱动架构(EDA)的设计思想,这是一种让程序(应用、服务)之......
  • Dapr云原生应用开发系列7:工作流集成
    题记:这篇介绍一个很有意思的东西,Dapr和LogicApps这样的工作流引擎集成。 Dapr工作流 在1年多前,Dapr的孵化团队搞了一个很有意思的东西:把Dapr和LogicApps集成起来,实现Dapr内置的工作流引擎。 官方文档:https://docs.dapr.io/developing-applications/integrations/azure......
  • Dapr云原生应用开发系列6:绑定构建块
    题记:这篇介绍绑定构建块,这是一个极度简化应用程序本身代码的特性。本文在GitHubCopilot的帮助下书写。原理由于Dapr由微软Azure团队孵化,所以绑定这一概念也是来源于微软的开源Serverless项目AzureFunctions。所以我们理解Dapr的绑定构建块,可以参考AzureFunctions绑定的概念。......
  • Dapr - 基本概念 【深入官网】
    Dapr使用sidecar架构,与应用程序一起作为单独的流程运行,包括服务调用、网络安全和分布式跟踪等功能1共同点:基于mTLS加密的服务到服务安全通信服务到服务的度量指标收集服务到服务分布式跟踪故障重试恢复能力2不同点:Dapr以开发人员为中心,提供了通过名称进行服务发......
  • Hello World!
    HelloWorldC++#include<iostream>usingnamespacestd;intmain(void){cout<<"hello,world!"<<endl;return0;}PythonRprint('hello,world!')Matlabdisp('hello,world!');Linuxecho"hello......
  • 汇编语言——实现用多种寻址方式在屏幕上显示“hello world !“
    ;数据段定义datasegment stringdb"helloworld!",0dh,0ah,'$' ;想要显示的字符个数,不显示$ countdw$-string-1dataends;堆栈段定义stacksegmentstack toplabelword dw30hdup(?)stackends;代码段定义codesegment ;assum伪指令,不执行 ass......
  • Code Block下载安装-运行Hello world!
     一、官网下载Code::Blocksdownload|SourceForge.net直接点击Download二、安装1.Next2.IAgree3.Next4.选择安装位置三、新建一个模版1.New->Newfromtemplate2.我这里新建一个C++项目3.Finish4.运行不成功5.可能是编译器路径不对,查看一下  Set......
  • AP World History复习提纲(unit 3~uint4)
    theme1Humansandtheenvironmenttheme2culturaldevelopmentsandinteractions(important)theme3governancetheme4economicsystemstheme5socialinteractionsandorganization(important)Europe:Theyear1450hastraditionallysignifiedtheendingof......