Dapr的安装和配置,以及.NET5与其结合
微软文档: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