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控制台程序,首先創建如下實體類:

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 后  ,再進行購買。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM