1 - IDE 支持

支持常见的集成开发环境 (IDEs)

1.1 - Dapr 与 Visual Studio Code 的集成

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

1.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.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.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 开发容器。

1.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配置目录位置

2 - 多应用同时运行

支持使用单个命令同时运行多个 Dapr 应用

2.1 - 多应用运行概述

使用一个CLI命令运行多个应用程序

如果您想在本地运行多个应用程序进行联合测试,类似于生产环境,多应用运行功能可以帮助您同时启动和停止一组应用程序。这些应用程序可以是:

  • 本地/自托管的进程,或
  • 通过构建容器镜像并部署到Kubernetes集群
    • 您可以使用本地Kubernetes集群(如KiND)或将其部署到云(如AKS、EKS和GKE)。

多应用运行模板文件描述了如何启动多个应用程序,类似于您运行多个单独的CLI run命令。默认情况下,此模板文件名为dapr.yaml

多应用运行模板文件

执行dapr run -f .时,它会启动当前目录中的多应用模板文件(名为dapr.yaml)以运行所有应用程序。

您可以使用自己喜欢的名称命名模板文件,而不是默认名称。例如dapr run -f ./<your-preferred-file-name>.yaml

以下示例展示了一些您可以为应用程序自定义的模板属性。在示例中,您可以同时启动2个应用程序,应用程序ID分别为processoremit-metrics

version: 1
apps:
  - appID: processor
    appDirPath: ../apps/processor/
    appPort: 9081
    daprHTTPPort: 3510
    command: ["go","run", "app.go"]
  - appID: emit-metrics
    appDirPath: ../apps/emit-metrics/
    daprHTTPPort: 3511
    env:
      DAPR_HOST_ADD: localhost
    command: ["go","run", "app.go"]

有关模板属性的更深入示例和解释,请参见多应用模板

资源和配置文件的位置

使用多应用运行时,您可以选择将应用程序的资源和配置文件放置在哪里。

单一文件位置(遵循约定)

您可以将所有应用程序的资源和配置放在~/.dapr根目录下。当所有应用程序共享相同的资源路径时,这种方式很有帮助,比如在本地机器上测试时。

独立文件位置(遵循约定)

使用多应用运行时,每个应用程序目录可以有一个.dapr文件夹,其中包含一个config.yaml文件和一个resources目录。如果应用程序目录中不存在.dapr目录,则使用默认的~/.dapr/resources/~/.dapr/config.yaml位置。

如果您决定在每个应用程序目录中添加一个.dapr目录,其中包含一个/resources目录和config.yaml文件,您可以为每个应用程序指定不同的资源路径。这种方法仍然遵循默认的~/.dapr约定。

自定义位置

您还可以将每个应用程序目录的.dapr目录命名为其他名称,例如webappbackend。如果您希望明确资源或应用程序目录路径,这将有所帮助。

日志

运行模板为每个应用程序及其关联的daprd进程提供了两个日志目标字段:

  1. appLogDestination:此字段配置应用程序的日志目标。可能的值是consolefilefileAndConsole。默认值是fileAndConsole,应用程序日志默认写入控制台和文件。

  2. daprdLogDestination:此字段配置daprd进程的日志目标。可能的值是consolefilefileAndConsole。默认值是filedaprd日志默认写入文件。

日志文件格式

应用程序和daprd的日志分别捕获在不同的文件中。这些日志文件会自动创建在每个应用程序目录(模板中的appDirPath)下的.dapr/logs目录中。这些日志文件名遵循以下模式:

  • <appID>_app_<timestamp>.logapp日志的文件名格式)
  • <appID>_daprd_<timestamp>.logdaprd日志的文件名格式)

即使您决定将资源文件夹重命名为其他名称,日志文件也只会写入应用程序目录中创建的.dapr/logs文件夹。

观看演示

观看此视频以了解多应用运行的概述

多应用运行模板文件

执行dapr run -k -f .dapr run -k -f dapr.yaml时,dapr.yaml多应用运行模板文件中定义的应用程序将在Kubernetes默认命名空间中启动。

注意: 目前,多应用运行模板只能在默认的Kubernetes命名空间中启动应用程序。

Kubernetes所需的默认服务和部署定义会在dapr.yaml模板中为每个应用程序生成在.dapr/deploy文件夹中。

如果dapr.yaml模板中应用程序的createService字段设置为true,则会在应用程序的.dapr/deploy文件夹中生成service.yaml文件。

否则,只会为每个设置了containerImage字段的应用程序生成deployment.yaml文件。

文件service.yamldeployment.yaml用于在Kubernetes的default命名空间中部署应用程序。此功能专门针对在Kubernetes中运行多个应用程序的开发/测试环境。

您可以使用任何首选名称命名模板文件,而不是默认名称。例如:

dapr run -k -f ./<your-preferred-file-name>.yaml

以下示例展示了一些您可以为应用程序自定义的模板属性。在示例中,您可以同时启动2个应用程序,应用程序ID分别为nodeapppythonapp

version: 1
common:
apps:
  - appID: nodeapp
    appDirPath: ./nodeapp/
    appPort: 3000
    containerImage: ghcr.io/dapr/samples/hello-k8s-node:latest
    createService: true
    env:
      APP_PORT: 3000
  - appID: pythonapp
    appDirPath: ./pythonapp/
    containerImage: ghcr.io/dapr/samples/hello-k8s-python:latest

注意:

  • 如果未指定containerImage字段,dapr run -k -f会产生错误。
  • createService字段定义了一个基本的Kubernetes服务(ClusterIP或LoadBalancer),目标是模板中指定的--app-port。如果未指定createService,则应用程序无法从集群外部访问。

有关模板属性的更深入示例和解释,请参见多应用模板

日志

运行模板为每个应用程序及其关联的daprd进程提供了两个日志目标字段:

  1. appLogDestination:此字段配置应用程序的日志目标。可能的值是consolefilefileAndConsole。默认值是fileAndConsole,应用程序日志默认写入控制台和文件。

  2. daprdLogDestination:此字段配置daprd进程的日志目标。可能的值是consolefilefileAndConsole。默认值是filedaprd日志默认写入文件。

日志文件格式

应用程序和daprd的日志分别捕获在不同的文件中。这些日志文件会自动创建在每个应用程序目录(模板中的appDirPath)下的.dapr/logs目录中。这些日志文件名遵循以下模式:

  • <appID>_app_<timestamp>.logapp日志的文件名格式)
  • <appID>_daprd_<timestamp>.logdaprd日志的文件名格式)

即使您决定将资源文件夹重命名为其他名称,日志文件也只会写入应用程序目录中创建的.dapr/logs文件夹。

观看演示

观看此视频以了解Kubernetes中的多应用运行概述

下一步

2.2 - 如何使用多应用运行模板文件

解压多应用运行模板文件及其属性

多应用运行模板文件是一个 YAML 文件,您可以使用它一次运行多个应用。在本指南中,您将学习如何:

  • 使用多应用运行模板
  • 查看已启动的应用
  • 停止多应用运行模板
  • 结构化多应用运行模板文件

使用多应用运行模板

您可以通过以下两种方式之一使用多应用运行模板文件:

通过提供目录路径执行

当您提供目录路径时,CLI 会在该目录中寻找名为 dapr.yaml 的多应用运行模板文件。如果找不到该文件,CLI 会返回错误。

执行以下 CLI 命令以读取默认名为 dapr.yaml 的多应用运行模板文件:

# 如果给定目录路径,模板文件需要默认命名为 `dapr.yaml`

dapr run -f <dir_path>
dapr run -f <dir_path> -k 

通过提供文件路径执行

如果多应用运行模板文件的名称不是 dapr.yaml,您可以将相对或绝对文件路径提供给命令:

dapr run -f ./path/to/<your-preferred-file-name>.yaml
dapr run -f ./path/to/<your-preferred-file-name>.yaml -k 

查看已启动的应用

一旦多应用模板正在运行,您可以使用以下命令查看已启动的应用:

dapr list
dapr list -k 

停止多应用运行模板

您可以随时使用以下任一命令停止多应用运行模板:

# 如果给定目录路径,模板文件需要默认命名为 `dapr.yaml`

dapr stop -f <dir_path>

或:

dapr stop -f ./path/to/<your-preferred-file-name>.yaml
# 如果给定目录路径,模板文件需要默认命名为 `dapr.yaml`

dapr stop -f <dir_path> -k

或:

dapr stop -f ./path/to/<your-preferred-file-name>.yaml -k 

模板文件结构

多应用运行模板文件可以包含以下属性。下面是一个示例模板,展示了两个应用及其配置的一些属性。

version: 1
common: # 可选部分,用于跨应用共享变量
  resourcesPath: ./app/components # 任何要跨应用共享的 dapr 资源
  env:  # 任何跨应用共享的环境变量
    DEBUG: true
apps:
  - appID: webapp # 可选
    appDirPath: .dapr/webapp/ # 必需
    resourcesPath: .dapr/resources # 已弃用
    resourcesPaths: .dapr/resources # 逗号分隔的资源路径。(可选)可以按约定保留为默认值。
    appChannelAddress: 127.0.0.1 # 应用监听的网络地址。(可选)可以按约定保留为默认值。
    configFilePath: .dapr/config.yaml # (可选)也可以按约定为默认值,如果未找到文件则忽略。
    appProtocol: http
    appPort: 8080
    appHealthCheckPath: "/healthz"
    command: ["python3", "app.py"]
    appLogDestination: file # (可选),可以是 file, console 或 fileAndConsole。默认是 fileAndConsole。
    daprdLogDestination: file # (可选),可以是 file, console 或 fileAndConsole。默认是 file。
  - appID: backend # 可选
    appDirPath: .dapr/backend/ # 必需
    appProtocol: grpc
    appPort: 3000
    unixDomainSocket: "/tmp/test-socket"
    env:
      DEBUG: false
    command: ["./backend"]

模板文件中所有路径适用以下规则:

  • 如果路径是绝对的,则按原样使用。
  • common 部分下的所有相对路径应相对于模板文件路径提供。
  • apps 部分下的 appDirPath 应相对于模板文件路径提供。
  • apps 部分下的所有其他相对路径应相对于 appDirPath 提供。
version: 1
common: # 可选部分,用于跨应用共享变量
  env:  # 任何跨应用共享的环境变量
    DEBUG: true
apps:
  - appID: webapp # 可选
    appDirPath: .dapr/webapp/ # 必需
    appChannelAddress: 127.0.0.1 # 应用监听的网络地址。(可选)可以按约定保留为默认值。
    appProtocol: http
    appPort: 8080
    appHealthCheckPath: "/healthz"
    appLogDestination: file # (可选),可以是 file, console 或 fileAndConsole。默认是 fileAndConsole。
    daprdLogDestination: file # (可选),可以是 file, console 或 fileAndConsole。默认是 file。
    containerImage: ghcr.io/dapr/samples/hello-k8s-node:latest # (可选)在 Kubernetes 开发/测试环境中部署时使用的容器镜像 URI。
    createService: true # (可选)在开发/测试环境中部署应用时创建 Kubernetes 服务。
  - appID: backend # 可选
    appDirPath: .dapr/backend/ # 必需
    appProtocol: grpc
    appPort: 3000
    unixDomainSocket: "/tmp/test-socket"
    env:
      DEBUG: false

模板文件中所有路径适用以下规则:

  • 如果路径是绝对的,则按原样使用。
  • apps 部分下的 appDirPath 应相对于模板文件路径提供。
  • app 部分下的所有相对路径应相对于 appDirPath 提供。

模板属性

多应用运行模板的属性与 dapr run CLI 标志对齐,在 CLI 参考文档中列出

属性必需详情示例
appDirPathY应用代码的路径./webapp/, ./backend/
appIDN应用的 app ID。如果未提供,将从 appDirPath 派生webapp, backend
resourcesPathN已弃用。Dapr 资源的路径。可以按约定为默认值./app/components, ./webapp/components
resourcesPathsN逗号分隔的 Dapr 资源路径。可以按约定为默认值./app/components, ./webapp/components
appChannelAddressN应用监听的网络地址。可以按约定保留为默认值。127.0.0.1
configFilePathN应用配置文件的路径./webapp/config.yaml
appProtocolNDapr 用于与应用通信的协议。http, grpc
appPortN应用监听的端口8080, 3000
daprHTTPPortNDapr HTTP 端口
daprGRPCPortNDapr GRPC 端口
daprInternalGRPCPortNDapr 内部 API 监听的 gRPC 端口;用于从本地 DNS 组件解析值时
metricsPortNDapr 发送其指标信息的端口
unixDomainSocketNUnix 域套接字目录挂载的路径。如果指定,与 Dapr 边车的通信使用 Unix 域套接字,与使用 TCP 端口相比,具有更低的延迟和更高的吞吐量。在 Windows 上不可用。/tmp/test-socket
profilePortN配置文件服务器监听的端口
enableProfilingN通过 HTTP 端点启用分析
apiListenAddressesNDapr API 监听地址
logLevelN日志详细程度。
appMaxConcurrencyN应用的并发级别;默认是无限制
placementHostAddressN
appSSLN启用 https,当 Dapr 调用应用时
daprHTTPMaxRequestSizeN请求体的最大大小(MB)。
daprHTTPReadBufferSizeNHTTP 读取缓冲区的最大大小(KB)。这也限制了 HTTP 头的最大大小。默认是 4 KB
enableAppHealthCheckN启用应用的健康检查true, false
appHealthCheckPathN健康检查文件的路径/healthz
appHealthProbeIntervalN应用健康探测的间隔(秒)
appHealthProbeTimeoutN应用健康探测的超时时间(毫秒)
appHealthThresholdN应用被认为不健康的连续失败次数
enableApiLoggingN启用从应用到 Dapr 的所有 API 调用的日志记录
runtimePathNDapr 运行时安装路径
envN环境变量的映射;每个应用应用的环境变量将覆盖跨应用共享的环境变量DEBUG, DAPR_HOST_ADD
appLogDestinationN输出应用日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 fileAndConsolefile, console, fileAndConsole
daprdLogDestinationN输出 daprd 日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 filefile, console, fileAndConsole

下一步

观看此视频以了解多应用运行的概述

多应用运行模板的属性与 dapr run -k CLI 标志对齐,在 CLI 参考文档中列出

属性必需详情示例
appDirPathY应用代码的路径./webapp/, ./backend/
appIDN应用的 app ID。如果未提供,将从 appDirPath 派生webapp, backend
appChannelAddressN应用监听的网络地址。可以按约定保留为默认值。127.0.0.1
appProtocolNDapr 用于与应用通信的协议。http, grpc
appPortN应用监听的端口8080, 3000
daprHTTPPortNDapr HTTP 端口
daprGRPCPortNDapr GRPC 端口
daprInternalGRPCPortNDapr 内部 API 监听的 gRPC 端口;用于从本地 DNS 组件解析值时
metricsPortNDapr 发送其指标信息的端口
unixDomainSocketNUnix 域套接字目录挂载的路径。如果指定,与 Dapr 边车的通信使用 Unix 域套接字,与使用 TCP 端口相比,具有更低的延迟和更高的吞吐量。在 Windows 上不可用。/tmp/test-socket
profilePortN配置文件服务器监听的端口
enableProfilingN通过 HTTP 端点启用分析
apiListenAddressesNDapr API 监听地址
logLevelN日志详细程度。
appMaxConcurrencyN应用的并发级别;默认是无限制
placementHostAddressN
appSSLN启用 https,当 Dapr 调用应用时
daprHTTPMaxRequestSizeN请求体的最大大小(MB)。
daprHTTPReadBufferSizeNHTTP 读取缓冲区的最大大小(KB)。这也限制了 HTTP 头的最大大小。默认是 4 KB
enableAppHealthCheckN启用应用的健康检查true, false
appHealthCheckPathN健康检查文件的路径/healthz
appHealthProbeIntervalN应用健康探测的间隔(秒)
appHealthProbeTimeoutN应用健康探测的超时时间(毫秒)
appHealthThresholdN应用被认为不健康的连续失败次数
enableApiLoggingN启用从应用到 Dapr 的所有 API 调用的日志记录
envN环境变量的映射;每个应用应用的环境变量将覆盖跨应用共享的环境变量DEBUG, DAPR_HOST_ADD
appLogDestinationN输出应用日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 fileAndConsolefile, console, fileAndConsole
daprdLogDestinationN输出 daprd 日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 filefile, console, fileAndConsole
containerImageN在 Kubernetes 开发/测试环境中部署时使用的容器镜像 URI。ghcr.io/dapr/samples/hello-k8s-python:latest
createServiceN在开发/测试环境中部署应用时创建 Kubernetes 服务。true, false

下一步

观看此视频以了解 Kubernetes 中多应用运行的概述