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在VS2019 + .Net Core 3.1环境的试用

 

 

 

Dapr Dashboard需要开启才能运行

dapr dashboard

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

 Dapr在VS2019 + .Net Core 3.1环境的试用

 

 

 

Dapr CLI 命令

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

Dapr在VS2019 + .Net Core 3.1环境的试用

 

 

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

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

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

 

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在VS2019 + .Net Core 3.1环境的试用

 

 

 其中,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在VS2019 + .Net Core 3.1环境的试用

 

 

 

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得到需要的随机整数:

Dapr在VS2019 + .Net Core 3.1环境的试用

 

 

 

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

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

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

Dapr在VS2019 + .Net Core 3.1环境的试用

 

 Dapr CLI传递参数

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

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

Dapr在VS2019 + .Net Core 3.1环境的试用

 

上一篇:Dapr在VS2019 + .Net Core 3.1环境的调试


下一篇:openpyxl模块