Dapr自托管安装与简单使用
半野

1.安装Dapr CLI

Dapr CLI 是您用于各种 Dapr 相关任务的主要工具。 您可以使用它来运行一个带有Dapr sidecar的应用程序, 以及查看sidecar日志、列出运行中的服务、运行 Dapr 仪表板。在自托管和k8s环境下均可使用。

1
`powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex" `

该脚本有两个作用:

  1. 安装最新的 Windows Dapr CLI程序dapr.exeC:\dapr 路径下
  2. 将此目录(C:\dapr )添加到用户PATH 环境变量

image

2.初始化Dapr

1
`dapr init `

image

初始化成功后,可以验证以下三个容器已经处于运行的状态:openzipkin/zipkindaprio/dapr redis

image

C:\Users\{用户名}\.dapr路径下,可以看到存在bincomponents两个文件夹。bin目录下是daprd和dashboard的二进制文件;components是默认的组件配置信息,包括pubsubstatestore两块。默认是使用redis作为组件的。

也可以通过dapr init --slim初始化dapr,这样dapr仅仅具备服务交互的能力,不支持发布订阅和状态存储的功能。

3.运行一个服务

编写一个**c#**服务:

1
`app.MapGet("/weatherforecast/list", () => { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateTime.Now.AddDays(index), // 时间 TemperatureC: Random.Shared.Next(-20, 55), // 温度 summaries[Random.Shared.Next(summaries.Length)]// 天气 )) .ToArray(); return new { AppId = "daprDemo", Data = forecast }; }); app.MapGet("/hello", (string name) => { return new { AppId = "daprDemo", Data = $"{DateTime.Now:G}: Hello {name}" }; });`

注: Http Get 服务,返回值SDK会自动使用json反序列化,可以自己自定义去除这个实现。

通过Dapr启动:

1
`dapr run --app-id daprDemo --dapr-http-port 5001 --dapr-grpc-port 5002 --app-port 5240 dotnet run `

--app-id:指定应用名(服务名)

--dapr-http-port:指定dapr边车暴露都http端口,SDK中默认3500。不指定,dpar-cli启动时会随机分配一个端口

--dapr-grpc-port:指定dapr边车暴露都grpc端口,SDK中默认50001。不指定,dpar-cli启动时会随机分配一个端口

--app-protocol:指定应用是http服务还是grpc服务,默认http

dotnet run:应用程序启动指令,对于部分应用,需要在前面添加-- ,可以见下面Java应用启动的指令。

在服务启动后,可以在控制台看到Dapr进程的相关信息:

image同时,应用日志,也会输出在控制台上:

image

通过dapr list命令,可以观察到所有的dapr边车信息:

1
`PS C:\Users\xyz> dapr list APP ID HTTP PORT GRPC PORT APP PORT COMMAND AGE CREATED PID daprDemo 5001 5002 5240 dotnet run 2m 2022-02-27 17:57.02 33584 `

如果想要在控制台访问服务,有两种方式:

方法1,通过Dapr的 invoke指令:

1
`dapr invoke --app-id daprDemo --method weatherforecast/list --verb GET `

方法2,通过curl:

1
`# curl http://localhost:[dapr-http-port]/v1.0/invoke/[app-id]/method/[method name] curl http://localhost:5001/v1.0/invoke/daprDemo/method/weatherforecast/list `

4.运行一个服务调用方

编写一个 Spring Boot服务,通过Dapr调用 C# 的HTTP服务:

1
`@GetMapping("/daprDemo/test") public HelloVm testControl(){ // 要调用的appid,对于本例而言,就是C#程序的应用名 String appId = "daprDemo"; // 本app sidecar 端口,可以见下面 javaDemo dapr启动命令 int sidecarPort = 5010; // SDK 是通过环境变量读取端口号的,本实例抽取了 DaprClientBuilder 源码,使得可以指定端口 try (DaprClient client = (new CustomDaprClientBuilder()) .buildDaprClientHttp(sidecarPort)) { Map<string, list<string="">> params = new HashMap<>(); params.put("name", Arrays.asList("张三")); HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, params, null); InvokeMethodRequest request = new InvokeMethodRequest(appId, "hello"); request.setHttpExtension(httpExtension); HelloVm reply = client.invokeMethod(request, TypeRef.get(HelloVm.class)) .block(); reply.setData("java demo handled:" + reply.getData()); return reply; } catch (Exception e) { e.printStackTrace(); HelloVm res = new HelloVm(); res.setData(e.getMessage()); return res; } }`

通过Dapr运行

1
`dapr run --app-id javaDemo --dapr-http-port 5010 --dapr-grpc-port 5011 --app-port 8080 -- java -jar target/dapr-demo-0.0.1-SNAPSHOT.jar `

访问Spring Boot的/daprDemo/test接口,可以观察到程序正常输出:

image

现在,我们已经启动了两个服务:

1
`PS C:\Users\xyz> dapr list APP ID HTTP PORT GRPC PORT APP PORT COMMAND AGE CREATED PID daprDemo 5001 5002 5240 dotnet run 1h 2022-02-27 21:57.46 9880 javaDemo 5010 5011 8080 java -jar target/... 9m 2022-02-27 23:15.29 40092 `

在javaDemo中,我们调用C#提供的HTTP服务,那么整个数据流动的过程大致如下:

image

整个过程,只需要在调用方通过dapr边车来完成服务的调用,完全可以省去RPC的编写过程,并且实现在不同编程语言、不同框架之间的服务调用。相较于两个应用直接通过RPC调用,尽管应用和sidecar之间通过http调用,有一部分性能的损耗,但是可以使得开发人员更加关注于业务逻辑的编写。对于旧服务的改造,也变得更加简单,无需再通过提供RPC的形式,来实现微服务。

在这个示例中,如果ASPNET Core提供是gRPC服务,整个数据流动过程中,完全是通过gRPC协议来进行通信的。

5.Pub/Sub

Dapr使用sub功能的时候,只需要定义一个POST接口即可,当接收到消息的时候,Dapr会自动调用这个接口。

1
`// mini api 模式 app.MapPost("/dsstatus", ([FromBody] string word) => { Console.WriteLine($"Hello {word}!"); }).WithTopic("pubsub", "topicName"); // controller 模式 [Topic("pubsub", "topicName")] [HttpPost("dsstatus")] public void DsStatus([FromBody] string word) { Console.WriteLine($"Hello {word}!"); } `

pub一条消息:

1
`await client.PublishEventAsync("pubsub", "topicName", "message"); `

在上面有两个string,含义如下:

pubsub:pubsub的组件名,”pubsub“是使用Dapr init是默认创建的组件名,在"c:\Users\[user name]\.dapr\components\pubsub.yaml"可以找到配置。

topicName :消息主题名

Dapr支持也支持在直接在yaml文件中,声明式地配置pubsub信息。

6.链路追踪:Zipkin

打开 http://localhost:9411,可以看到刚刚在 JavaDemo 中调用 daprDemo 的的整个链路状况。

image

7.dapr dashboard

1
`dapr dashboard -p 9999 `

允许dapr dashboard指令,可以打开dapr的dashboard。在dashboard中,可以看到当前允许的应用、组件等信息。

image

image

由 Hexo 驱动 & 主题 Keep
总字数 105.7k 访客数 访问量