如何:使用 Visual Studio Code 调试 Dapr 应用程序

学习如何配置 VSCode 以调试 Dapr 应用程序

手动调试

在开发 Dapr 应用程序时,通常使用 Dapr CLI 启动服务,命令如下:

dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 app.js

一种将调试器附加到服务的方法是先在命令行中使用正确的参数运行 daprd,然后启动代码并附加调试器。虽然这种方法可行,但需要额外的步骤,并且需要为那些可能克隆您的仓库并希望直接点击“播放”按钮开始调试的开发人员提供一些指导。

如果您的应用程序由多个微服务组成,并且每个微服务都有一个 Dapr 辅助进程,那么在 Visual Studio Code 中同时调试它们会非常有帮助。本页面将使用 hello world 快速入门 来展示如何配置 VSCode 以使用 VSCode 调试 调试多个 Dapr 应用程序。

先决条件

步骤 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_PORTDAPR_GRPC_PORT 环境变量。确保与 tasks.json 中的 httpPortgrpcPort 相匹配。例如,launch.json

{
  // 设置非默认的 HTTP 和 gRPC 端口
  "env": {
      "DAPR_HTTP_PORT": "3502",
      "DAPR_GRPC_PORT": "50002"
  },
}

tasks.json

{
  // 与 launch.json 中设置的端口匹配
  "httpPort": 3502,
  "grpcPort": 50002
}

每个配置都需要一个 requesttypename。这些参数帮助 VSCode 识别 .vscode/tasks.json 文件中的任务配置。

  • type 定义使用的语言。根据语言,可能需要在市场中找到的扩展,例如 Python 扩展
  • name 是配置的唯一名称。这用于在项目中调用多个配置时的复合配置。
  • ${workspaceFolder} 是一个 VS Code 变量引用。这是 VS Code 中打开的工作区的路径。
  • preLaunchTaskpostDebugTask 参数指的是在启动应用程序之前和之后运行的程序配置。请参阅步骤 2 了解如何配置这些。

有关 VSCode 调试参数的更多信息,请参阅 VS Code 启动属性

步骤 2:配置 tasks.json

对于 .vscode/launch.json 中定义的每个 任务,必须在 .vscode/tasks.json 中存在相应的任务定义。

对于快速入门,每个服务都需要一个任务来启动带有 daprd 类型的 Dapr 辅助进程,以及一个带有 daprd-down 的任务来停止辅助进程。参数 appIdhttpPortmetricsPortlabeltype 是必需的。还有其他可选参数可用,请参阅 参考表

{
    "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。用于服务发现、状态封装和 pub/sub 消费者 ID "appId": "divideapp"
appMaxConcurrency 限制应用程序的并发性。有效值是大于 0 的任何数字 "appMaxConcurrency": -1
appPort 此参数告诉 Dapr 您的应用程序正在监听哪个端口 "appPort": 4000
appProtocol 告诉 Dapr 您的应用程序正在使用的协议。有效选项是 httpgrpchttpsgrpcsh2c。默认是 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 sidecar 的日志级别。允许的值是 debug、info、warn、error。默认是 info "logLevel": "debug"
metricsPort 设置 sidecar 指标服务器的端口。默认是 9090 是,如果有多个应用 "metricsPort": 9093
mode Dapr 的运行模式(默认 “standalone”) "mode": "standalone"
placementHostAddress Dapr actor 放置服务器的地址 "placementHostAddress": "http://localhost:1313/"
profilePort 配置文件服务器的端口(默认 “7777”) "profilePort": 7777
sentryAddress Sentry CA 服务的地址 "sentryAddress": "http://localhost:1345/"
type 告诉 VS Code 它将是一个 daprd 任务类型 "type": "daprd"

相关链接