1 - Visual Studio Code 与 Dapr 集成
1.1 - Dapr Visual Studio Code 扩展概述
弃用通知
该扩展先前由 Microsoft 支持,但现在已被弃用。该扩展将在 Visual Studio Code marketplace 中保持可用,但将不再接收更新或支持。用于本地开发的已弃用 Dapr Visual Studio Code 扩展 为用户提供了多种功能,以更好地管理其 Dapr 应用程序,并对所有支持的 Dapr 语言(包括 .NET、Go、PHP、Python 和 Java)的应用程序进行调试。
功能
脚手架 Dapr 调试任务
Dapr 扩展帮助你使用 Visual Studio Code 的内置调试功能通过 Dapr 调试应用程序。
使用 Dapr: Scaffold Dapr Tasks 命令面板操作,你可以更新现有的 task.json 和 launch.json 文件,以便在开始调试时启动和配置 Dapr 边车。
- 确保已为你的应用设置了启动配置。(了解更多)
- 使用
Ctrl+Shift+P打开命令面板 - 选择
Dapr: Scaffold Dapr Tasks - 使用
F5或通过运行视图运行你的应用和 Dapr 边车。
脚手架 Dapr 组件
将 Dapr 添加到应用程序时,你可能需要一个专用的组件目录,与作为 dapr init 一部分初始化的默认组件分离。
要创建包含默认 statestore、pubsub 和 zipkin 组件的专用组件文件夹,请使用 Dapr: Scaffold Dapr Components 命令面板操作。
- 在 Visual Studio Code 中打开应用程序目录
- 使用
Ctrl+Shift+P打开命令面板 - 选择
Dapr: Scaffold Dapr Components - 使用
dapr run --resources-path ./components -- ...运行应用程序
查看正在运行的 Dapr 应用程序
应用程序视图显示在本地机器上运行的 Dapr 应用程序。

调用 Dapr 应用程序
在应用程序视图中,用户可以右键单击并通过 GET 或 POST 方法调用 Dapr 应用程序,可选择指定有效负载。

向 Dapr 应用程序发布事件
在应用程序视图中,用户可以右键单击并向正在运行的 Dapr 应用程序发布消息,指定主题和有效负载。
用户还可以向所有正在运行的应用程序发布消息。

其他资源
同时调试多个 Dapr 应用程序
使用 VS Code 扩展,你可以通过多目标调试同时调试多个 Dapr 应用程序。
社区通话演示
观看此视频了解如何使用 Dapr VS Code 扩展:
1.2 - 如何操作:使用 Visual Studio Code 调试 Dapr 应用程序
弃用通知
该扩展此前由 Microsoft 支持,但现已弃用。该扩展在 Visual Studio Code marketplace 中仍然可用,但将不再接收更新或支持。手动调试
开发 Dapr 应用程序时,通常使用 Dapr CLI 启动 daprized 服务,类似这样:
dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 app.js
将调试器附加到服务的一种方法是首先在命令行中使用正确参数运行 daprd,然后启动代码并附加调试器。虽然这是一个完全可接受的解决方案,但它确实需要一些额外的步骤,并且需要向可能想要克隆你的仓库并点击"播放"按钮开始调试的开发者提供一些指导。
如果你的应用程序是一组微服务,每个都有 Dapr 边车,在 Visual Studio Code 中一起调试它们将非常有用。本页面将使用 hello world 快速入门来展示如何配置 VSCode 以使用 VSCode 调试来调试多个 Dapr 应用程序。
前提条件
- 安装 Dapr 扩展。稍后你将使用它提供的 任务。
- 可选:克隆 hello world 快速入门
步骤 1:配置 launch.json
文件 .vscode/launch.json 包含 VS Code 调试运行的 启动配置。该文件定义了当用户开始调试时将启动什么以及如何配置。Visual Studio Code marketplace中提供了每种编程语言的配置。
在 hello world 快速入门的情况下,启动了两个应用程序,每个都有自己的 Dapr 边车。一个用 Node.JS 编写,另一个用 Python 编写。你会注意到每个配置都包含一个 daprd run preLaunchTask 和一个 daprd stop postDebugTask。
{
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "Nodeapp with Dapr",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/node/app.js",
"preLaunchTask": "daprd-debug-node",
"postDebugTask": "daprd-down-node"
},
{
"type": "python",
"request": "launch",
"name": "Pythonapp with Dapr",
"program": "${workspaceFolder}/python/app.py",
"console": "integratedTerminal",
"preLaunchTask": "daprd-debug-python",
"postDebugTask": "daprd-down-python"
}
]
}
如果你使用的端口不是代码中内置的默认端口,请在 launch.json 调试配置中设置 DAPR_HTTP_PORT 和 DAPR_GRPC_PORT 环境变量。与 daprd tasks.json 中的 httpPort 和 grpcPort 匹配。例如,launch.json:
{
// 设置非默认的 HTTP 和 gRPC 端口
"env": {
"DAPR_HTTP_PORT": "3502",
"DAPR_GRPC_PORT": "50002"
},
}
tasks.json:
{
// 与 launch.json 中设置的端口匹配
"httpPort": 3502,
"grpcPort": 50002
}
每个配置都需要 request、type 和 name。这些参数帮助 VSCode 识别 .vscode/tasks.json 文件中的任务配置。
type定义使用的语言。根据语言的不同,它可能需要在 marketplace 中找到的扩展,例如 Python 扩展。name是配置的唯一名称。当在项目中调用多个配置时,这用于复合配置。${workspaceFolder}是 VS Code 变量引用。这是在 VS Code 中打开的工作区路径。preLaunchTask和postDebugTask参数指的是在启动应用程序之前和之后运行的程序配置。有关如何配置这些参数,请参阅步骤 2。
有关 VSCode 调试参数的更多信息,请参阅 VS Code 启动属性。
步骤 2:配置 tasks.json
对于 .vscode/launch.json 中定义的每个任务,在 .vscode/tasks.json 中必须存在相应的任务定义。
对于快速入门,每个服务都需要一个任务来使用 daprd 类型启动 Dapr 边车,以及一个使用 daprd-down 停止边车的任务。参数 appId、httpPort、metricsPort、label 和 type 是必需的。其他可选参数可用,请参阅此处的参考表。
{
"version": "2.0.0",
"tasks": [
{
"label": "daprd-debug-node",
"type": "daprd",
"appId": "nodeapp",
"appPort": 3000,
"httpPort": 3500,
"metricsPort": 9090
},
{
"label": "daprd-down-node",
"type": "daprd-down",
"appId": "nodeapp"
},
{
"label": "daprd-debug-python",
"type": "daprd",
"appId": "pythonapp",
"httpPort": 53109,
"grpcPort": 53317,
"metricsPort": 9091
},
{
"label": "daprd-down-python",
"type": "daprd-down",
"appId": "pythonapp"
}
]
}
步骤 3:在 launch.json 中配置复合启动
复合启动配置可以在 .vscode/launch.json 中定义,它是一组并行启动的两个或多个启动配置。可选地,可以指定 preLaunchTask 并在单独的调试会话开始之前运行。
对于此示例,复合配置是:
{
"version": "2.0.0",
"configurations": [...],
"compounds": [
{
"name": "Node/Python Dapr",
"configurations": ["Nodeapp with Dapr","Pythonapp with Dapr"]
}
]
}
步骤 4:启动调试会话
现在,你可以在 VS Code 调试器中找到在上一步中定义的复合命令名称,以调试模式运行应用程序:

你现在正在使用 Dapr 调试多个应用程序!
Daprd 参数表
以下是 VS Code 任务支持的参数。这些参数等同于 daprd 参数,详见此参考:
| 参数 | 描述 | 必需 | 示例 |
|---|---|---|---|
allowedOrigins | 允许的 HTTP 源(默认为 “*") | 否 | "allowedOrigins": "*" |
appId | 应用程序的唯一 ID。用于服务发现、状态封装和发布订阅消费者 ID | 是 | "appId": "divideapp" |
appMaxConcurrency | 限制应用程序的并发性。有效值是任何大于 0 的数字 | 否 | "appMaxConcurrency": -1 |
appPort | 此参数告诉 Dapr 你的应用程序正在监听哪个端口 | 是 | "appPort": 4000 |
appProtocol | 告诉 Dapr 你的应用程序使用哪个协议。有效选项是 http、grpc、https、grpcs、h2c。默认是 http。 | 否 | "appProtocol": "http" |
args | 设置传递给 Dapr 应用程序的参数列表 | 否 | “args”: [] |
componentsPath | 组件目录的路径。如果为空,则不会加载组件。 | 否 | "componentsPath": "./components" |
config | 告诉 Dapr 使用哪个配置资源 | 否 | "config": "./config" |
controlPlaneAddress | Dapr 控制平面的地址 | 否 | "controlPlaneAddress": "http://localhost:1366/" |
enableProfiling | 启用性能分析 | 否 | "enableProfiling": false |
enableMtls | 为 daprd 到 daprd 通信通道启用自动 mTLS | 否 | "enableMtls": false |
grpcPort | Dapr API 要监听的 gRPC 端口(默认为 “50001”) | 如果有多个应用则为是 | "grpcPort": 50004 |
httpPort | Dapr API 的 HTTP 端口 | 是 | "httpPort": 3502 |
internalGrpcPort | Dapr 内部 API 要监听的 gRPC 端口 | 否 | "internalGrpcPort": 50001 |
logAsJson | 将此参数设置为 true 会以 JSON 格式输出日志。默认为 false | 否 | "logAsJson": false |
logLevel | 设置 Dapr 边车的日志级别。允许的值是 debug、info、warn、error。默认是 info | 否 | "logLevel": "debug" |
metricsPort | 设置边车指标服务器的端口。默认为 9090 | 如果有多个应用则为是 | "metricsPort": 9093 |
mode | Dapr 的运行模式(默认为 “standalone”) | 否 | "mode": "standalone" |
placementHostAddress | Dapr Actor Placement 服务器的地址 | 否 | "placementHostAddress": "http://localhost:1313/" |
profilePort | 分析服务器的端口(默认为 “7777”) | 否 | "profilePort": 7777 |
sentryAddress | Sentry CA 服务的地址 | 否 | "sentryAddress": "http://localhost:1345/" |
type | 告诉 VS Code 这将是一个 daprd 任务类型 | 是 | "type": "daprd" |
相关链接
1.3 - 使用 Dev Containers 开发 Dapr 应用程序
弃用通知
该扩展此前由 Microsoft 支持,但现已弃用。该扩展仍将在 Visual Studio Code marketplace 中提供,但将不再接收更新或支持。Visual Studio Code Dev Containers 扩展允许您使用独立的 Docker 容器作为完整的开发环境,而无需在本地文件系统中安装任何额外的软件包、库或工具。
Dapr 为 C# 和 JavaScript/TypeScript 提供了预构建的 Dev Containers;您可以选择适合您需求的容器,即可获得现成的开发环境。请注意,这些预构建的容器会自动更新到最新的 Dapr 版本。
我们还发布了一个 Dev Container 功能,可在任何 Dev Container 中安装 Dapr CLI。
设置开发环境
前置条件
使用 Dev Container 功能添加 Dapr CLI
您可以使用 Dev Container 功能 在任何 Dev Container 中安装 Dapr CLI。
为此,请编辑您的 devcontainer.json 并在 "features" 部分添加两个对象:
"features": {
// 安装 Dapr CLI
"ghcr.io/dapr/cli/dapr-cli:0": {},
// 启用 Docker(通过 Docker-in-Docker)
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
// 或者,使用 Docker-outside-of-Docker(使用主机上的 Docker)
//"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {},
}
保存 JSON 文件并(重新)构建承载您的开发环境的容器后,您将拥有 Dapr CLI(和 Docker)可用,并且可以通过在容器中运行以下命令来安装 Dapr:
dapr init
示例:为 Dapr 创建 Java Dev Container
这是一个基于官方 Java 17 Dev Container 镜像创建用于开发使用 Dapr 的 Java 应用程序的 Dev Container 示例。
将此内容放在项目中的 .devcontainer/devcontainer.json 文件中:
// 有关格式详细信息,请参阅 https://aka.ms/devcontainer.json。有关配置选项,请参阅
// README at: https://github.com/devcontainers/templates/tree/main/src/java
{
"name": "Java",
// 或使用 Dockerfile 或 Docker Compose 文件。更多信息:https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/java:0-17",
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "false",
"installGradle": "false"
},
// 安装 Dapr CLI
"ghcr.io/dapr/cli/dapr-cli:0": {},
// 启用 Docker(通过 Docker-in-Docker)
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
// 或者,使用 Docker-outside-of-Docker(使用主机上的 Docker)
//"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {},
}
// 使用 'forwardPorts' 使容器内的端口列表在本地可用。
// "forwardPorts": [],
// 使用 'postCreateCommand' 在容器创建后运行命令。
// "postCreateCommand": "java -version",
// 配置特定于工具的属性。
// "customizations": {},
// 取消注释以 root 用户身份连接。更多信息:https://aka.ms/dev-containers-non-root。
// "remoteUser": "root"
}
然后,使用 VS Code 命令面板(CTRL + SHIFT + P 或 Mac 上的 CMD + SHIFT + P),选择 Dev Containers: Rebuild and Reopen in Container。
使用预构建的 Dev Container(C# 和 JavaScript/TypeScript)
- 在 VS Code 中打开您的应用程序工作区
- 在命令面板中(
CTRL + SHIFT + P或 Mac 上的CMD + SHIFT + P)键入并选择Dev Containers: Add Development Container Configuration Files...
- 键入
dapr以过滤列表到可用的 Dapr 远程容器,并选择与您的应用程序匹配的语言容器。请注意,您可能需要选择Show All Definitions...
- 按照提示在容器中重新打开您的工作区。

示例
观看此视频,了解如何将 Dapr Dev Containers 与您的应用程序一起使用。
2 - IntelliJ
在开发 Dapr 应用程序时,通常使用 Dapr CLI 启动您的"Dapr 化"服务,类似这样:
dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 app.js
这会使用默认的组件 yaml 文件(在 dapr init 时创建),以便您的服务可以与本地 Redis 容器交互。这对刚入门来说很好,但如果您想将调试器附加到您的服务并单步调试代码呢?这是您可以不调用应用程序而使用 dapr cli 的地方。
将调试器附加到服务的一种方法是首先从命令行运行 dapr run --,然后启动代码并附加调试器。虽然这是一个完全可以接受的解决方案,但它确实需要一些额外的步骤(比如在终端和 IDE 之间切换),以及一些可能想要克隆您的仓库并点击"播放"按钮开始调试的开发者说明。
本文档解释如何直接从 IntelliJ 使用 dapr。作为先决条件,请确保您已通过 dapr init 初始化了 Dapr 的开发环境。
让我们开始吧!
将 Dapr 添加为"外部工具"
首先,在直接修改配置文件之前退出 IntelliJ。
IntelliJ 配置文件位置
对于 2020.1 及更高版本,工具的配置文件应位于:
%USERPROFILE%\AppData\Roaming\JetBrains\IntelliJIdea2020.1\tools\
$HOME/.config/JetBrains/IntelliJIdea2020.1/tools/
~/Library/Application\ Support/JetBrains/IntelliJIdea2020.1/tools/
对于 2019.3 或更早版本,配置文件位置不同。有关更多详细信息,请参阅此处。
如果需要,请更改路径中 IntelliJ 的版本。
在 <CONFIG PATH>/tools/External\ Tools.xml 中创建或编辑文件(如果需要,更改路径中的 IntelliJ 版本)。<CONFIG PATH> 取决于操作系统,如上所示。
添加新的 <tool></tool> 条目:
<toolSet name="External Tools">
...
<!-- 1. 每个工具都有自己的 app-id,因此为每个要调试的应用程序创建一个 -->
<tool name="dapr for DemoService in examples" description="Dapr sidecar" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
<exec>
<!-- 2. 对于 Linux 或 MacOS 使用:/usr/local/bin/dapr -->
<option name="COMMAND" value="C:\dapr\dapr.exe" />
<!-- 3. 选择不与其他 daprd 命令条目冲突的应用程序、http 和 grpc 端口(placement 地址不应更改)。 -->
<option name="PARAMETERS" value="run -app-id demoservice -app-port 3000 -dapr-http-port 3005 -dapr-grpc-port 52000" />
<!-- 4. 使用 `components` 文件夹所在的文件夹 -->
<option name="WORKING_DIRECTORY" value="C:/Code/dapr/java-sdk/examples" />
</exec>
</tool>
...
</toolSet>
(可选)您还可以为可以在许多项目中重用的边车工具创建新条目:
<toolSet name="External Tools">
...
<!-- 1. 具有应用端口的应用程序的可重用条目。 -->
<tool name="dapr with app-port" description="Dapr sidecar" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
<exec>
<!-- 2. 对于 Linux 或 MacOS 使用:/usr/local/bin/dapr -->
<option name="COMMAND" value="c:\dapr\dapr.exe" />
<!-- 3. 提示用户 4 次(按顺序):app id、app port、Dapr 的 http port、Dapr 的 grpc port。 -->
<option name="PARAMETERS" value="run --app-id $Prompt$ --app-port $Prompt$ --dapr-http-port $Prompt$ --dapr-grpc-port $Prompt$" />
<!-- 4. 使用 `components` 文件夹所在的文件夹 -->
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
</exec>
</tool>
<!-- 1. 没有 app-port 的应用程序的可重用条目。 -->
<tool name="dapr without app-port" description="Dapr sidecar" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true">
<exec>
<!-- 2. 对于 Linux 或 MacOS 使用:/usr/local/bin/dapr -->
<option name="COMMAND" value="c:\dapr\dapr.exe" />
<!-- 3. 提示用户 3 次(按顺序):app id、Dapr 的 http port、Dapr 的 grpc port。 -->
<option name="PARAMETERS" value="run --app-id $Prompt$ --dapr-http-port $Prompt$ --dapr-grpc-port $Prompt$" />
<!-- 4. 使用 `components` 文件夹所在的文件夹 -->
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
</exec>
</tool>
...
</toolSet>
创建或编辑运行配置
现在,为要调试的应用程序创建或编辑运行配置。可以在 main() 函数旁边的菜单中找到它。

现在,添加程序参数和环境变量。这些需要与上面"外部工具"中的条目定义的端口匹配。
- 本示例的命令行参数:
-p 3000 - 本示例的环境变量:
DAPR_HTTP_PORT=3005;DAPR_GRPC_PORT=52000

开始调试
完成上述一次性配置后,在 IntelliJ 中使用 Dapr 调试 Java 应用程序需要两个步骤:
- 通过 IntelliJ 中的
Tools->External Tool启动dapr。

- 以调试模式启动您的应用程序。

总结
调试完成后,请确保在 IntelliJ 中同时停止 dapr 和您的应用程序。
注意:由于您使用 dapr run CLI 命令启动了服务,dapr list 命令将在当前使用 Dapr 运行的应用程序列表中显示来自 IntelliJ 的运行。
祝您调试愉快!
相关链接
- IntelliJ 配置目录位置的更改