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" ` |
该脚本有两个作用:
- 安装最新的 Windows Dapr CLI程序
dapr.exe到C:\dapr路径下 - 将此目录(
C:\dapr)添加到用户PATH 环境变量

2.初始化Dapr
1 | `dapr init ` |

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

在C:\Users\{用户名}\.dapr路径下,可以看到存在bin和components两个文件夹。bin目录下是daprd和dashboard的二进制文件;components是默认的组件配置信息,包括pubsub和statestore两块。默认是使用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进程的相关信息:
同时,应用日志,也会输出在控制台上:

通过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接口,可以观察到程序正常输出:

现在,我们已经启动了两个服务:
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服务,那么整个数据流动的过程大致如下:

整个过程,只需要在调用方通过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 的的整个链路状况。

7.dapr dashboard
1 | `dapr dashboard -p 9999 ` |
允许dapr dashboard指令,可以打开dapr的dashboard。在dashboard中,可以看到当前允许的应用、组件等信息。

