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 初体验

  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/AlvinLiang/p/15781080.html
Copyright © 2011-2022 走看看