This is the multi-page printable view of this section. Click here to print.
本地开发
- 1: IDE 支持
- 1.1: Dapr 与 Visual Studio Code 的集成
- 1.1.1: Dapr Visual Studio Code 扩展概述
- 1.1.2: 如何:使用 Visual Studio Code 调试 Dapr 应用程序
- 1.1.3: 使用开发容器开发Dapr应用
- 1.2: IntelliJ
- 2: 多应用同时运行
- 2.1: 多应用运行概述
- 2.2: 如何使用多应用运行模板文件
1 - IDE 支持
1.1 - Dapr 与 Visual Studio Code 的集成
1.1.1 - Dapr Visual Studio Code 扩展概述
Dapr 提供了一个预览版的 Dapr Visual Studio Code 扩展,专为本地开发设计。该扩展为用户提供多种功能,以便更好地管理 Dapr 应用程序,并调试支持的 Dapr 语言的应用程序,包括 .NET、Go、PHP、Python 和 Java。
功能
脚手架 Dapr 调试任务
Dapr 扩展利用 Visual Studio Code 的内置调试功能帮助您调试应用程序。
通过 Dapr: Scaffold Dapr Tasks
命令面板操作,您可以更新现有的 task.json
和 launch.json
文件,以便在开始调试时启动和配置 Dapr sidecar。
- 确保为您的应用程序设置了启动配置。(了解更多)
- 使用
Ctrl+Shift+P
打开命令面板 - 选择
Dapr: Scaffold Dapr Tasks
- 使用
F5
或通过运行视图运行您的应用程序和 Dapr sidecar。
脚手架 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 应用程序发布消息。
其他资源
同时调试多个 Dapr 应用程序
使用 VS Code 扩展,您可以使用多目标调试同时调试多个 Dapr 应用程序。
社区电话演示
观看此视频,了解如何使用 Dapr VS Code 扩展:
1.1.2 - 如何:使用 Visual Studio Code 调试 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 应用程序。
先决条件
- 安装 Dapr 扩展。您将在后续步骤中使用它提供的 tasks。
- 可选地克隆 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
环境变量。确保与 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
定义使用的语言。根据语言,可能需要在市场中找到的扩展,例如 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。用于服务发现、状态封装和 pub/sub 消费者 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 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" |
相关链接
1.1.3 - 使用开发容器开发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)
- 在 VS Code 中打开您的应用工作区
- 在命令面板中(在 Windows 上为
CTRL + SHIFT + P
或在 Mac 上为CMD + SHIFT + P
)输入并选择Dev Containers: Add Development Container Configuration Files...
- 输入
dapr
以过滤可用的 Dapr 远程容器列表,并选择与您的应用匹配的语言容器。请注意,您可能需要选择Show All Definitions...
- 按照提示在容器中重新打开您的工作区。
示例
观看此 视频 了解如何在您的应用中使用 Dapr 开发容器。
1.2 - IntelliJ
在开发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需要两个步骤:
- 通过IntelliJ中的
工具
->外部工具
启动dapr
。
- 以调试模式启动您的应用程序。
总结
调试后,请确保在IntelliJ中停止dapr
和您的应用程序。
注意:由于您使用dapr run CLI命令启动了服务,dapr list命令将在当前运行的Dapr应用程序列表中显示来自IntelliJ的运行。
祝调试愉快!
相关链接
- 更改 IntelliJ配置目录位置
2 - 多应用同时运行
2.1 - 多应用运行概述
注意
Kubernetes 的多应用运行目前是一个预览功能。如果您想在本地运行多个应用程序进行联合测试,类似于生产环境,多应用运行功能可以帮助您同时启动和停止一组应用程序。这些应用程序可以是:
- 本地/自托管的进程,或
- 通过构建容器镜像并部署到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分别为processor
和emit-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
目录命名为其他名称,例如webapp
或backend
。如果您希望明确资源或应用程序目录路径,这将有所帮助。
日志
运行模板为每个应用程序及其关联的daprd进程提供了两个日志目标字段:
appLogDestination
:此字段配置应用程序的日志目标。可能的值是console
、file
和fileAndConsole
。默认值是fileAndConsole
,应用程序日志默认写入控制台和文件。daprdLogDestination
:此字段配置daprd
进程的日志目标。可能的值是console
、file
和fileAndConsole
。默认值是file
,daprd
日志默认写入文件。
日志文件格式
应用程序和daprd
的日志分别捕获在不同的文件中。这些日志文件会自动创建在每个应用程序目录(模板中的appDirPath
)下的.dapr/logs
目录中。这些日志文件名遵循以下模式:
<appID>_app_<timestamp>.log
(app
日志的文件名格式)<appID>_daprd_<timestamp>.log
(daprd
日志的文件名格式)
即使您决定将资源文件夹重命名为其他名称,日志文件也只会写入应用程序目录中创建的.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.yaml
和deployment.yaml
用于在Kubernetes的default
命名空间中部署应用程序。此功能专门针对在Kubernetes中运行多个应用程序的开发/测试环境。
您可以使用任何首选名称命名模板文件,而不是默认名称。例如:
dapr run -k -f ./<your-preferred-file-name>.yaml
以下示例展示了一些您可以为应用程序自定义的模板属性。在示例中,您可以同时启动2个应用程序,应用程序ID分别为nodeapp
和pythonapp
。
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进程提供了两个日志目标字段:
appLogDestination
:此字段配置应用程序的日志目标。可能的值是console
、file
和fileAndConsole
。默认值是fileAndConsole
,应用程序日志默认写入控制台和文件。daprdLogDestination
:此字段配置daprd
进程的日志目标。可能的值是console
、file
和fileAndConsole
。默认值是file
,daprd
日志默认写入文件。
日志文件格式
应用程序和daprd
的日志分别捕获在不同的文件中。这些日志文件会自动创建在每个应用程序目录(模板中的appDirPath
)下的.dapr/logs
目录中。这些日志文件名遵循以下模式:
<appID>_app_<timestamp>.log
(app
日志的文件名格式)<appID>_daprd_<timestamp>.log
(daprd
日志的文件名格式)
即使您决定将资源文件夹重命名为其他名称,日志文件也只会写入应用程序目录中创建的.dapr/logs
文件夹。
观看演示
下一步
2.2 - 如何使用多应用运行模板文件
注意
目前,多应用运行在 Kubernetes 中是一个预览功能。多应用运行模板文件是一个 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 参考文档中列出。
属性 | 必需 | 详情 | 示例 |
---|---|---|---|
appDirPath | Y | 应用代码的路径 | ./webapp/ , ./backend/ |
appID | N | 应用的 app ID。如果未提供,将从 appDirPath 派生 | webapp , backend |
resourcesPath | N | 已弃用。Dapr 资源的路径。可以按约定为默认值 | ./app/components , ./webapp/components |
resourcesPaths | N | 逗号分隔的 Dapr 资源路径。可以按约定为默认值 | ./app/components , ./webapp/components |
appChannelAddress | N | 应用监听的网络地址。可以按约定保留为默认值。 | 127.0.0.1 |
configFilePath | N | 应用配置文件的路径 | ./webapp/config.yaml |
appProtocol | N | Dapr 用于与应用通信的协议。 | http , grpc |
appPort | N | 应用监听的端口 | 8080 , 3000 |
daprHTTPPort | N | Dapr HTTP 端口 | |
daprGRPCPort | N | Dapr GRPC 端口 | |
daprInternalGRPCPort | N | Dapr 内部 API 监听的 gRPC 端口;用于从本地 DNS 组件解析值时 | |
metricsPort | N | Dapr 发送其指标信息的端口 | |
unixDomainSocket | N | Unix 域套接字目录挂载的路径。如果指定,与 Dapr 边车的通信使用 Unix 域套接字,与使用 TCP 端口相比,具有更低的延迟和更高的吞吐量。在 Windows 上不可用。 | /tmp/test-socket |
profilePort | N | 配置文件服务器监听的端口 | |
enableProfiling | N | 通过 HTTP 端点启用分析 | |
apiListenAddresses | N | Dapr API 监听地址 | |
logLevel | N | 日志详细程度。 | |
appMaxConcurrency | N | 应用的并发级别;默认是无限制 | |
placementHostAddress | N | ||
appSSL | N | 启用 https,当 Dapr 调用应用时 | |
daprHTTPMaxRequestSize | N | 请求体的最大大小(MB)。 | |
daprHTTPReadBufferSize | N | HTTP 读取缓冲区的最大大小(KB)。这也限制了 HTTP 头的最大大小。默认是 4 KB | |
enableAppHealthCheck | N | 启用应用的健康检查 | true , false |
appHealthCheckPath | N | 健康检查文件的路径 | /healthz |
appHealthProbeInterval | N | 应用健康探测的间隔(秒) | |
appHealthProbeTimeout | N | 应用健康探测的超时时间(毫秒) | |
appHealthThreshold | N | 应用被认为不健康的连续失败次数 | |
enableApiLogging | N | 启用从应用到 Dapr 的所有 API 调用的日志记录 | |
runtimePath | N | Dapr 运行时安装路径 | |
env | N | 环境变量的映射;每个应用应用的环境变量将覆盖跨应用共享的环境变量 | DEBUG , DAPR_HOST_ADD |
appLogDestination | N | 输出应用日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 fileAndConsole | file , console , fileAndConsole |
daprdLogDestination | N | 输出 daprd 日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 file | file , console , fileAndConsole |
下一步
多应用运行模板的属性与 dapr run -k
CLI 标志对齐,在 CLI 参考文档中列出。
属性 | 必需 | 详情 | 示例 |
---|---|---|---|
appDirPath | Y | 应用代码的路径 | ./webapp/ , ./backend/ |
appID | N | 应用的 app ID。如果未提供,将从 appDirPath 派生 | webapp , backend |
appChannelAddress | N | 应用监听的网络地址。可以按约定保留为默认值。 | 127.0.0.1 |
appProtocol | N | Dapr 用于与应用通信的协议。 | http , grpc |
appPort | N | 应用监听的端口 | 8080 , 3000 |
daprHTTPPort | N | Dapr HTTP 端口 | |
daprGRPCPort | N | Dapr GRPC 端口 | |
daprInternalGRPCPort | N | Dapr 内部 API 监听的 gRPC 端口;用于从本地 DNS 组件解析值时 | |
metricsPort | N | Dapr 发送其指标信息的端口 | |
unixDomainSocket | N | Unix 域套接字目录挂载的路径。如果指定,与 Dapr 边车的通信使用 Unix 域套接字,与使用 TCP 端口相比,具有更低的延迟和更高的吞吐量。在 Windows 上不可用。 | /tmp/test-socket |
profilePort | N | 配置文件服务器监听的端口 | |
enableProfiling | N | 通过 HTTP 端点启用分析 | |
apiListenAddresses | N | Dapr API 监听地址 | |
logLevel | N | 日志详细程度。 | |
appMaxConcurrency | N | 应用的并发级别;默认是无限制 | |
placementHostAddress | N | ||
appSSL | N | 启用 https,当 Dapr 调用应用时 | |
daprHTTPMaxRequestSize | N | 请求体的最大大小(MB)。 | |
daprHTTPReadBufferSize | N | HTTP 读取缓冲区的最大大小(KB)。这也限制了 HTTP 头的最大大小。默认是 4 KB | |
enableAppHealthCheck | N | 启用应用的健康检查 | true , false |
appHealthCheckPath | N | 健康检查文件的路径 | /healthz |
appHealthProbeInterval | N | 应用健康探测的间隔(秒) | |
appHealthProbeTimeout | N | 应用健康探测的超时时间(毫秒) | |
appHealthThreshold | N | 应用被认为不健康的连续失败次数 | |
enableApiLogging | N | 启用从应用到 Dapr 的所有 API 调用的日志记录 | |
env | N | 环境变量的映射;每个应用应用的环境变量将覆盖跨应用共享的环境变量 | DEBUG , DAPR_HOST_ADD |
appLogDestination | N | 输出应用日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 fileAndConsole | file , console , fileAndConsole |
daprdLogDestination | N | 输出 daprd 日志的日志目标;其值可以是 file, console 或 fileAndConsole。默认是 file | file , console , fileAndConsole |
containerImage | N | 在 Kubernetes 开发/测试环境中部署时使用的容器镜像 URI。 | ghcr.io/dapr/samples/hello-k8s-python:latest |
createService | N | 在开发/测试环境中部署应用时创建 Kubernetes 服务。 | true , false |