上一篇文章《国内环境下 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命令,它们一个负责运行,一个负责调用,都是开发中常用的命令。
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类的序列化字符串。