微軟文檔:https://docs.microsoft.com/zh-cn/dotnet/architecture/dapr-for-net-developers/getting-started
官方文檔:https://docs.dapr.io/zh-hans/getting-started/install-dapr-cli/
==================
接下來用CentOS7演示
==================
一、安裝 Dapr CLI
1、進入官網快速入門,找到壓縮包來安裝(前面的命令我沒成功過-.-//)
2、在github中找到最新穩定版,展開“Assets”,下載名為“dapr_linux_amd64.tar.gz”的壓縮包
3、打開CentOS系統,並安裝Docker環境,參考安裝:https://www.cnblogs.com/shousiji/p/14918631.html
4、可以通過FTP工具,將dapr壓縮包上傳到CentOS的“/usr/local/bin”目錄中,並且cd到這個目錄,再執行解壓命令
(先解壓再上傳,和先上傳再解壓,會導致這個文件的權限不一樣,前者就可能會出現“權限不足的情況”)
tar -zvxf dapr_linux_amd64.tar.gz
5、驗證是否成功,執行命令
dapr
出現如圖表示成功
二、本地初始化 Dapr
1、運行init CLI 命令
dapr init
#或者安裝指定版本
dapr init --runtime-version 1.4.0
安裝需要幾分鍾,如果這里一直在打轉,取消后再搭個梯子重新來吧
2、驗證Dapr 版本
dapr --version
像這樣:
3、驗證容器
docker ps
默認會裝上這幾個鏡像:
三、安裝.NET5 SDK
1、回到根目錄
cd ~
2、將 Microsoft 包簽名密鑰添加到受信任密鑰列表
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
3、安裝SDK
sudo yum install dotnet-sdk-5.0
4、驗證SDK
dotnet --info
四、.NET5程序
1、創建一個.NET5 Web項目,命名為“SGZ.DepartmentService”,安裝Nuget包“Dapr.AspNetCore”
2、創建控制器如下
[Route("[controller]/[action]")] [ApiController] public class DepartmentController : ControllerBase { private static readonly List<DepartmentDto> _departments = new() { new DepartmentDto{ ID = "D001", Name = "部門1" }, new DepartmentDto{ ID = "D002", Name = "部門2" }, new DepartmentDto{ ID = "D003", Name = "部門3" }, new DepartmentDto{ ID = "D004", Name = "部門4" }, new DepartmentDto{ ID = "D005", Name = "部門5" } }; [HttpGet] public IActionResult GetList() { return Ok(_departments); } }
3、服務注冊到Dapr,需Startup類加入
4、發布站點到CentOS的“/usr/web/DepartmentService”目錄,並且cd到這個目錄,執行命令
dapr run --app-id DepartmentService --app-port 680 --dapr-http-port 681 -- dotnet SGZ.DepartmentService.dll --urls "http://*:680"
出現如圖即為成功
5、新開一個窗口,進行服務訪問
格式: curl http://localhost:<dapr-port>/v1.0/invoke/<application-id>/method/<method-name>
示例:
curl http://localhost:681/v1.0/invoke/DepartmentService/method/Department/GetList
成功返回結果
五、服務間的訪問
1、整體結構
2、部門服務不變,就步驟四那樣;這里設計人員服務訪問部門服務,故控制器如下
[Route("[controller]/[action]")] [ApiController] public class PersonnelController : ControllerBase { private readonly Dapr.Client.DaprClient _daprClient; private static readonly List<PersonnelDto> _personnels = new() { new PersonnelDto{ ID = "S001", Name = "人員1" }, new PersonnelDto{ ID = "S002", Name = "人員2" }, new PersonnelDto{ ID = "S003", Name = "人員3" } }; public PersonnelController(Dapr.Client.DaprClient daprClient) { _daprClient = daprClient; } [HttpGet] public IActionResult GetList() { //var client = new Dapr.Client.DaprClientBuilder().Build(); //參數二:要訪問的服務(步驟四第4點,命令中配置的app-id名稱) //參數三:要訪問的action地址,根據你配置的路由格式來填寫 var dlist = _daprClient .InvokeMethodAsync<List<DepartmentDto>>(HttpMethod.Get, "DepartmentService", "Department/GetList"); object obj = new { DepartmentList = dlist, PersonnelList = _personnels }; return Ok(obj); } }
3、服務注冊到Dapr,需Startup類加入
4、新開一個窗口連接到CentOS,將部門服務發布到“/usr/web/DepartmentService”目錄,並cd到這個目錄,執行命令
dapr run --app-id DepartmentService --app-port 680 --dapr-http-port 681 -- dotnet SGZ.DepartmentService.dll --urls "http://*:680"
5、新開一個窗口連接到CentOS,將人員服務發布到“/usr/web/PersonnelService”目錄,並cd到這個目錄,執行命令
dapr run --app-id PersonnelService --app-port 690 --dapr-http-port 691 -- dotnet SGZ.PersonnelService.dll --urls "http://*:690"
6、新開一個窗口連接到CentOS,訪問人員服務
curl http://localhost:691/v1.0/invoke/PersonnelService/method/Personnel/GetList
可以看到,連同部門信息也查詢到了
六、發布訂閱
默認使用的組件是Redis,可以改為其它組件,像Kafka、RabbitMQ等等,感興趣的去查看文檔,這里就不在敘述了
1、人員服務添加函數和特性,並部署到“/usr/web/PersonnelService”目錄
[Route("[controller]/[action]")] [ApiController] public class PersonnelController : ControllerBase { private readonly Dapr.Client.DaprClient _daprClient; private static readonly List<PersonnelDto> _personnels = new() { new PersonnelDto{ ID = "S001", Name = "人員1" }, new PersonnelDto{ ID = "S002", Name = "人員2" }, new PersonnelDto{ ID = "S003", Name = "人員3" } }; public PersonnelController(Dapr.Client.DaprClient daprClient) { _daprClient = daprClient; } //參數一取值固定pubsub,參數二自定義 [Topic("pubsub", "PersonnelAdd")] [HttpPost] public IActionResult Add(PersonnelDto dto) { Console.WriteLine("進行了人員添加操作"); _personnels.Add(dto); return Ok(dto); } [HttpGet] public IActionResult GetList() { return Ok(_personnels); } }
2、部門服務如法炮制,並部署到“/usr/web/DepartmentService”目錄
[Route("[controller]/[action]")] [ApiController] public class DepartmentController : ControllerBase { private static readonly List<DepartmentDto> _departments = new() { new DepartmentDto { ID = "D001", Name = "部門1" }, new DepartmentDto { ID = "D002", Name = "部門2" }, new DepartmentDto { ID = "D003", Name = "部門3" }, new DepartmentDto { ID = "D004", Name = "部門4" }, new DepartmentDto { ID = "D005", Name = "部門5" } }; [Topic("pubsub", "DepartmentAdd")] [HttpPost] public IActionResult Add(DepartmentDto dto) { Console.WriteLine("進行了部門添加操作"); Console.WriteLine($"ID:{dto.ID};Name:{dto.Name};aaa:{dto.aaa};BBB:{dto.BBB};"); _departments.Add(dto); return Ok(dto); } [HttpGet] public IActionResult GetList() { return Ok(_departments); } }
3、部門服務和人員服務是訂閱者,需要各自加入:endpoints.MapSubscribeHandler();
4、創建一個聚合服務Web項目,命令為“SGZ.AggregationService”,需要注冊到Dapr,Startup類加入
5、添加控制器,完后部署到“/usr/web/AggregationService”目錄
[Route("[controller]/[action]")] [ApiController] public class AggregationController : ControllerBase { private readonly Dapr.Client.DaprClient _daprClient; public AggregationController(Dapr.Client.DaprClient daprClient) { _daprClient = daprClient; } [HttpPost] public async Task<IActionResult> Add() { var dDto = new DepartmentDto { ID = Guid.NewGuid().ToString(), Name = "baoanke", aaa = "aaa", BBB = "bbb" }; await _daprClient.PublishEventAsync("pubsub", "DepartmentAdd", dDto); var pDto = new PersonnelDto { ID = Guid.NewGuid().ToString(), Name = "zhangsan" }; await _daprClient.PublishEventAsync("pubsub", "PersonnelAdd", pDto); return Content("OK"); } [HttpGet] public async Task<IActionResult> GetList() { //var client = new Dapr.Client.DaprClientBuilder().Build(); //參數二:要訪問的服務(步驟四第4點,命令中配置的app-id名稱) //參數三:要訪問的action地址,根據你配置的路由格式來填寫 var dlist = await _daprClient .InvokeMethodAsync<List<DepartmentDto>>(HttpMethod.Get, "DepartmentService", "Department/GetList"); var plist = await _daprClient .InvokeMethodAsync<List<PersonnelDto>>(HttpMethod.Get, "PersonnelService", "Personnel/GetList"); object obj = new { DepartmentList = dlist, PersonnelList = plist }; return Ok(obj); } }
6、開啟3個窗口,cd到各個服務的目錄下,依次執行命令
#運行部門服務 dapr run --app-id DepartmentService --app-port 680 --dapr-http-port 681 -- dotnet SGZ.DepartmentService.dll --urls "http://*:680" #運行人員服務 dapr run --app-id PersonnelService --app-port 690 --dapr-http-port 691 -- dotnet SGZ.PersonnelService.dll --urls "http://*:690" #運行聚合服務 dapr run --app-id AggregationService --app-port 670 --dapr-http-port 671 -- dotnet SGZ.AggregationService.dll --urls "http://*:670"
7、打開postman,訪問聚合服務的添加接口:http://192.168.134.130:670/Aggregation/Add,並成功返回OK信息(端口需要防火牆開啟)
部門服務和人員服務窗口也打印出了相關信息
8、訪問聚合服務的列表接口:http://192.168.134.130:670/Aggregation/GetList,可以看到返回的結果有新的數據
不過奇怪的是只有id添加成功,其它字段都不行!
控制台打印也確實只有ID有值。后面試了多種方式都不行,等下個版本再看看了,本文Dapr版本是1.4.0
本文發布訂閱版代碼:https://files.cnblogs.com/files/shousiji/net5_dapr.rar