題記:上篇介紹了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 后 ,再進行購買。