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


免責聲明!

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



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