1 - Dapr 与 Visual Studio Code 的集成

在 Visual Studio Code 中如何高效地开发和运行 Dapr 应用程序

1.1 - Dapr Visual Studio Code 扩展概述

如何使用 Dapr 扩展开发和运行 Dapr 应用程序

Dapr 提供了一个预览版Dapr Visual Studio Code 扩展,专为本地开发设计。该扩展为用户提供多种功能,以便更好地管理 Dapr 应用程序,并调试支持的 Dapr 语言的应用程序,包括 .NET、Go、PHP、Python 和 Java。

在 VSCode 中打开

功能

脚手架 Dapr 调试任务

Dapr 扩展利用 Visual Studio Code 的内置调试功能帮助您调试应用程序。

通过 Dapr: Scaffold Dapr Tasks 命令面板操作,您可以更新现有的 task.jsonlaunch.json 文件,以便在开始调试时启动和配置 Dapr sidecar。

  1. 确保为您的应用程序设置了启动配置。(了解更多)
  2. 使用 Ctrl+Shift+P 打开命令面板
  3. 选择 Dapr: Scaffold Dapr Tasks
  4. 使用 F5 或通过运行视图运行您的应用程序和 Dapr sidecar。

脚手架 Dapr 组件

在将 Dapr 添加到应用程序时,您可能希望创建一个独立的组件目录,以区别于 dapr init 初始化的默认组件。

要使用默认的 statestorepubsubzipkin 组件创建一个专用的组件文件夹,请使用 Dapr: Scaffold Dapr Components 命令面板操作。

  1. 在 Visual Studio Code 中打开您的应用程序目录
  2. 使用 Ctrl+Shift+P 打开命令面板
  3. 选择 Dapr: Scaffold Dapr Components
  4. 使用 dapr run --resources-path ./components -- ... 运行您的应用程序

查看正在运行的 Dapr 应用程序

应用程序视图显示在您的机器上本地运行的 Dapr 应用程序。


Dapr VSCode 扩展视图运行应用程序选项的截图

调用 Dapr 应用程序

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


Dapr VSCode 扩展调用选项的截图

向 Dapr 应用程序发布事件

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

用户还可以向所有正在运行的 Dapr 应用程序发布消息。


Dapr VSCode 扩展发布选项的截图

其他资源

同时调试多个 Dapr 应用程序

使用 VS Code 扩展,您可以使用多目标调试同时调试多个 Dapr 应用程序。

社区电话演示

观看此视频,了解如何使用 Dapr VS Code 扩展:

1.2 - 如何:使用 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"
controlPlaneAddressDapr 控制平面的地址"controlPlaneAddress": "http://localhost:1366/"
enableProfiling启用分析"enableProfiling": false
enableMtls为 daprd 到 daprd 通信通道启用自动 mTLS"enableMtls": false
grpcPortDapr API 监听的 gRPC 端口(默认 “50001”)是,如果有多个应用"grpcPort": 50004
httpPortDapr API 的 HTTP 端口"httpPort": 3502
internalGrpcPortDapr 内部 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
modeDapr 的运行模式(默认 “standalone”)"mode": "standalone"
placementHostAddressDapr actor 放置服务器的地址"placementHostAddress": "http://localhost:1313/"
profilePort配置文件服务器的端口(默认 “7777”)"profilePort": 7777
sentryAddressSentry CA 服务的地址"sentryAddress": "http://localhost:1345/"
type告诉 VS Code 它将是一个 daprd 任务类型"type": "daprd"

相关链接

1.3 - 使用开发容器开发Dapr应用

如何使用Dapr设置容器化的开发环境

Visual Studio Code 的 开发容器扩展允许您使用一个自包含的 Docker 容器作为完整的开发环境,而无需在本地文件系统中安装任何额外的软件包、库或工具。

Dapr 提供了预构建的 C# 和 JavaScript/TypeScript 开发容器,您可以选择其中一个来快速搭建开发环境。请注意,这些预构建的容器会自动更新到 Dapr 的最新版本。

我们还发布了一个开发容器功能,可以在任何开发容器中安装 Dapr CLI。

设置开发环境

先决条件

使用开发容器功能添加 Dapr CLI

您可以使用 开发容器功能 在任何开发容器中安装 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 开发容器

以下是一个用于开发 Dapr Java 应用的开发容器示例,基于 官方 Java 17 开发容器镜像

将其放置在项目中的 .devcontainer/devcontainer.json 文件中:

// 有关格式详细信息,请参阅 https://aka.ms/devcontainer.json。有关配置选项,请参阅
// README: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 命令面板(在 Windows 上为 CTRL + SHIFT + P 或在 Mac 上为 CMD + SHIFT + P),选择 Dev Containers: Rebuild and Reopen in Container

使用预构建的开发容器(C# 和 JavaScript/TypeScript)

  1. 在 VS Code 中打开您的应用工作区
  2. 在命令面板中(在 Windows 上为 CTRL + SHIFT + P 或在 Mac 上为 CMD + SHIFT + P)输入并选择 Dev Containers: Add Development Container Configuration Files...
    添加远程容器的截图
  3. 输入 dapr 以过滤可用的 Dapr 远程容器列表,并选择与您的应用匹配的语言容器。请注意,您可能需要选择 Show All Definitions...
    添加 Dapr 容器的截图
  4. 按照提示在容器中重新打开您的工作区。
    在开发容器中重新打开应用的截图

示例

观看此 视频 了解如何在您的应用中使用 Dapr 开发容器。

2 - IntelliJ

在IntelliJ社区版中配置Dapr调试环境

在开发Dapr应用程序时,通常会使用Dapr CLI来启动您的服务,例如:

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>

可选地,您还可以为可以在多个项目中重用的sidecar工具创建一个新条目:

<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次(按顺序):应用程序id、应用程序端口、Dapr的http端口、Dapr的grpc端口。 -->
      <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. 无应用程序端口的可重用条目。 -->
  <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次(按顺序):应用程序id、Dapr的http端口、Dapr的grpc端口。 -->
      <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中的Java应用程序与Dapr需要两个步骤:

  1. 通过IntelliJ中的工具 -> 外部工具启动dapr

将dapr作为“外部工具”运行

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

以调试模式启动应用程序

总结

调试后,请确保在IntelliJ中停止dapr和您的应用程序。

注意:由于您使用dapr run CLI命令启动了服务,dapr list命令将在当前运行的Dapr应用程序列表中显示来自IntelliJ的运行。

祝调试愉快!

相关链接

  • 更改 IntelliJ配置目录位置