zoukankan      html  css  js  c++  java
  • Dapr在VS2019 + .Net Core 3.1环境的试用

    上一篇文章《国内环境下 Windows 10 安装 Dapr》,我们已经成功在电脑上安装了Dapr CLI,那么接下来,我们试用一下Dapr。

    开发环境:Visual Studio 2019 Comunity / .Net Core 3.1 / Dapr CLI 1.5 / Windows 10 企业版 19043.1415

    Zipkin 与 Dapr Dashboard

    首先介绍这两个DaprCLI安装后自带的两个辅助工具。

    Zipkin是一个链路跟踪系统,我们在Dapr中的调用都会显示在里,方便我们测试调试Dapr。默认情况下,可以在浏览器输入http://localhost:9411打开它的页面。

    Dapr Dashboard需要开启才能运行

    dapr dashboard

    如果显示 Dapr Dashboard running on http://localhost:8080 则代表成功启用。然后就可以在对应的网页看到当前运行了哪些的Dapr app

     

    Dapr CLI 命令

     在CMD输入dapr,就能看到Dapr CLI的命令列表:

     我们可以查阅官方的Dapr 文档库来查看各个命令的详细说明。

    其中,init命令用于初始化CLI环境,uninstall命令用于卸载,upgrade命令用于升级。这三个命令都很重要,但配置完毕后使用的频率反而较低。

    在这片文章,重点介绍run命令,以及invoke命令,它们一个负责运行,一个负责调用,都是开发中常用的命令。

    Asp.Net Core Web API应用集成Dapr SDK

     我们需要为项目添加Dapr SDK的nuget包,对于Asp.Net Core Web API,只需要添加Dapr.AspNetCore组件

     然后,在项目的Startup类,对Dapr Client注册(给IOC容器注入一个单例的DaprClient对象)

            public void ConfigureServices(IServiceCollection services)
            {
    
                services.AddControllers().AddDapr();
    
            }

    Dapr试用: 手打命令调用Dapr

    我们新建一个 Asp .Net Core Web API 项目。需要注意的时候,如果在创建中勾选了Configure for HTTPS,那么在之后运行run命令时就要指定 -app-ssl 参数为true,否则就会出现 the server closed connection before returning the first response byte 错误。

    项目新建后,修改Startup.cs的ConfigureServices方法如下:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddDapr();
    }

    再新建一个MemberController:

    [Route("api/[controller]")]
        [ApiController]
        public class MemberController : ControllerBase
        {
            private readonly ILogger<MemberController> _logger;
            private readonly DaprClient _daprClient;
    
            public MemberController(ILogger<MemberController> logger, DaprClient daprClient)
            {
                _logger = logger;
                _daprClient = daprClient;
            }
    
            [HttpGet]
            [Route("Get")]
            public int Get()
            {
                return new Random().Next(10000, 10086);
            }
        }

    这个示例程序很简单,当有"Get"请求时,返回一个10000~10086之间的随机整数。

    编译通过后,打开编译后文件所在的文件夹,输入如下类似命令:

    Dapr run -a MemberService -G 50004 -H 30004 -p 5004 -- dotnet Services.Member.dll --urls "http://*:5004"

    在这里,Dapr run命令的参数我用了缩写,各个参数的意义如下:

    -a: --app-id, 用于服务发现的应用程序 Id,在Dapr SideCar中应是唯一的

    -G: --dapr-grpc-port, Dapr 要监听的 gRPC 端口

    -H: --dapr-http-port, Dapr 要监听的 HTTP 端口

    -p: --app-port, 应用程序正在侦听的端口

    -- dotnet: 启动对应的.Net程序,后面的.Net程序的路径

    --urls: 配置应用监听的URLs,详见 ASP.NET Core中配置监听URLs的五种方式

    这样通过dapr来部署,让.net application和dapr sidecar形成一体,就能测试应用了。

    dapr启动之后,我们就能在任务管理器看到两个相关的进程:

     其中,dapr是由刚才的命令直接启动的,而daprd是被dapr带动,是真正干活的进程。实际上,我们可以直接运行daprd来达到相同的效果。但这样的话,在dapr dashboard就看不见当前dapr运行的app,所以,就这样吧……

    我们打开另外一个CMD或者Powershell,输入如下命令:

    dapr invoke --app-id MemberService --method api/Member/Get --verb GET

    这个命令,就会自动帮我们找到刚才run命令启动的MemberService SideCar,然后找到一体的dotnet app,然后再根据 method参数 “api/Member/Get”,沿着路由一路找到MemberController里面的“Get”方法,最后调用它并且得到返回值。

    Dapr试用: .Net程序调用Dapr

    再准备一个Asp.Net core Web API应用程序,就叫Admin,类似上述的Member项目。

    新增一个AdminController:

    [Route("api/[controller]")]
        [ApiController]
        public class AdminController : ControllerBase
        {
            private readonly ILogger<AdminController> _logger;
            private readonly DaprClient _daprClient;
    
            public AdminController(ILogger<AdminController> logger, DaprClient daprClient)
            {
                _logger = logger;
                _daprClient = daprClient;
            }
    
            [HttpGet]
            [Route("GetMemberCount")]
            public async Task<int> GetMemberCount()
            {
                _logger.LogInformation("[Begin] Query data from Member Service");
    
                var memberCount = await _daprClient.InvokeMethodAsync<int>
                    (HttpMethod.Get, "MemberService", "api/Member/Get");
    
                _logger.LogInformation($"[End] Query data from Member Service, data : {memberCount}");
    
                return memberCount;
            }
    
    
            [HttpGet]
            [Route("GetHello")]

          public string GetHello(Person p)
          {
            return $"Hello! {p.Name}!";
          }

    
        }

    public class Person
    {
    public string Name { get; set; }
    }

     

    其中,GetMemberCount方法即会通过DaprClient去调用MemberService的对应方法。

    在编译通过后,我们在对应的文件夹打开CMD或Poweshell,输入如下命令:

    Dapr run -a AdminService -G 50001 -H 30001 -p 5001 -- dotnet WesoftPlus.Services.Admin.dll --urls "http://*:5001"

    然后再在另外一个终端输入如下命令:

    dapr invoke --app-id AdminService --method api/Admin/GetMemberCount --verb GET

    成功让AdminService从MemberService得到需要的随机整数:

    当然,作为Asp.Net Core Web API应用程序,我们也可以通过Http访问其方法。

    在浏览器或者Postman输入如下路径:

    http://localhost:5001/api/Admin/GetMemberCount

     Dapr CLI传递参数

     dapr invoke --app-id AdminService --method api/Admin/GetHello --verb GET --data '{\"name\":\"Alvin\"}'

    在AdminController里有一个GetHello的带参数的方法。Dapr Invoke当然支持参数传递。但貌似只支持对象形式的参数,所以我定义了一个Person类。而在参数传递的时候,是传递一个Person类的序列化字符串。

    参考文章:

    .NET 5 with Dapr 初体验

  • 相关阅读:
    在C#中子线程如何操作主窗口线程上的控件
    创建数据透视表数据包含合并单元格
    sql,nosql
    Enthought科学计算,数据分析
    程序员常去的14个顶级开发社区
    Windows查看进程taskList,终止进程tskill
    Pandas库之DataFrame
    centos下chm阅读器
    c++回调函数
    __NSAutoreleaseNoPool(): ... utoreleased with no pool in place
  • 原文地址:https://www.cnblogs.com/AlvinLiang/p/15781080.html
Copyright © 2011-2022 走看看