• 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

  • 相关阅读:
    Linux开机流程【原创】
    Linux下无需按下回车(无阻塞)读取输入键值
    Sql Server 列转行 Pivot使用
    mysql
    mysql
    mysql
    CI
    mysql
    Snagit: Scrolling is not working
    Something about SnagIt
  • 原文地址:https://www.cnblogs.com/shousiji/p/15309470.html
Copyright © 2020-2023  润新知