Dapr 服务概述
了解构成 Dapr 运行时的服务
Dapr 是一个开源项目,旨在简化微服务应用程序的构建过程。它提供了一系列构建模块,这些模块通过标准化的 API 进行访问,使开发人员能够轻松实现常见的分布式系统模式。
Dapr 的核心服务包括:
- Actor:Dapr 支持 actor 模型,方便开发人员实现有状态的 actor。
- Secret:Dapr 提供与机密信息存储的集成,帮助开发人员安全管理应用程序的敏感信息。
- Configuration:Dapr 提供配置管理功能,允许应用程序动态获取和更新配置。
- Service Invocation:Dapr 支持服务调用,使服务之间可以通过 HTTP 或 gRPC 进行通信。
- Pub/Sub:Dapr 支持发布/订阅模式,简化事件驱动的应用程序开发。
- Workflow:Dapr 提供工作流支持,帮助开发人员编排复杂的业务流程。
- Cryptography:Dapr 提供加密功能,帮助开发人员实现数据加密和解密。
- Bindings:Dapr 提供与外部系统的绑定集成,简化与外部服务的交互。
- Timer 和 Reminder:Dapr 提供定时器和提醒功能,帮助开发人员实现定时任务和提醒。
- Job:Dapr 支持任务调度,帮助开发人员管理和执行后台任务。
- Conversation:Dapr 提供对话支持,帮助开发人员实现对话式应用程序。
- State:Dapr 提供状态管理功能,帮助开发人员管理应用程序的状态。
通过这些服务,Dapr 使开发人员能够专注于业务逻辑,而不必担心底层基础设施的细节。
1 - Dapr sidecar (daprd) 概述
Dapr sidecar 进程概述
Dapr 采用 sidecar 模式,这意味着 Dapr API 运行在一个独立的进程中,即 Dapr sidecar,并与您的应用程序一起运行。Dapr sidecar 进程命名为 daprd
,并根据托管环境以不同的方式启动。
Dapr sidecar 提供以下功能:
当应用程序在其配置的端口上可访问时,Dapr sidecar 即达到准备状态。在应用程序启动或初始化期间,应用程序暂时无法访问 Dapr 组件。

应用程序通过本地 http 或 gRPC 端点调用 sidecar API。

使用 dapr run
的自托管
在 自托管模式 下安装 Dapr 时,daprd
二进制文件会被下载并放置在用户主目录下(Linux/macOS 为 $HOME/.dapr/bin
,Windows 为 %USERPROFILE%\.dapr\bin\
)。
在自托管模式下,使用 Dapr CLI 的 run
命令 会启动 daprd
可执行文件,并运行您提供的应用程序可执行文件。这是在本地进行开发和测试等场景中运行 Dapr sidecar 的推荐方式。
您可以在 Dapr run 命令参考 中找到 CLI 提供的用于配置 sidecar 的各种参数。
在 Kubernetes 中使用 dapr-sidecar-injector
在 Kubernetes 上,Dapr 控制平面包括 dapr-sidecar-injector 服务,它监视带有 dapr.io/enabled
注释的新 pod,并在 pod 内注入一个包含 daprd
进程的容器。在这种情况下,可以通过注释传递 sidecar 参数,如 此表 中的 Kubernetes 注释 列所述。
直接运行 sidecar
在大多数情况下,您不需要显式运行 daprd
,因为 sidecar 要么由 CLI(自托管模式)启动,要么由 dapr-sidecar-injector 服务(Kubernetes)启动。对于高级用例(如调试、脚本化部署等),可以直接启动 daprd
进程。
要获取所有可用参数的详细列表,请运行 daprd --help
或查看 此表,该表概述了 daprd
参数与 CLI 参数和 Kubernetes 注释的关系。
示例
通过指定其唯一 ID 启动与应用程序一起的 sidecar。
注意: --app-id
是必填字段,且不能包含点。
指定您的应用程序正在监听的端口
daprd --app-id myapp --app-port 5000
如果您使用了多个自定义资源并希望指定资源定义文件的位置,请使用 --resources-path
参数:
daprd --app-id myapp --resources-path <PATH-TO-RESOURCES-FILES>
如果您已将组件和其他资源(例如,弹性策略、订阅或配置)组织到单独的文件夹或共享文件夹中,您可以指定多个资源路径:
daprd --app-id myapp --resources-path <PATH-1-TO-RESOURCES-FILES> --resources-path <PATH-2-TO-RESOURCES-FILES>
在运行应用程序时启用 Prometheus 指标收集
daprd --app-id myapp --enable-metrics
仅监听 IPv4 和 IPv6 回环
daprd --app-id myapp --dapr-listen-addresses '127.0.0.1,[::1]'
2 - Dapr Operator 控制平面服务概述
Dapr Operator 服务概述
在 Kubernetes 模式下运行 Dapr 时,一个运行 Dapr Operator 服务的 pod 负责管理 Dapr 组件的更新,并为 Dapr 提供 Kubernetes 服务端点。
运行 Operator 服务
Operator 服务是 dapr init -k
部署过程的一部分,或者可以通过 Dapr Helm charts 部署。有关在 Kubernetes 上运行 Dapr 的更多信息,请访问 Kubernetes 托管页面。
其他配置选项
Operator 服务提供了一些额外的配置选项。
注入器监控功能
Operator 服务包含一个 注入器监控功能,它会定期检查 Kubernetes 集群中所有运行的 pod,确保那些标记了 dapr.io/enabled=true
的 pod 中正确注入了 Dapr sidecar。这个功能主要用于解决 注入器服务未能成功将 sidecar(daprd
容器)注入 pod 的问题。
注入器监控功能在以下情况下可能会很有帮助:
如果监控功能发现某个 pod 缺少 sidecar,而它本应该有一个,它会删除该 pod。然后 Kubernetes 会重新创建该 pod,并再次调用 Dapr sidecar 注入器。
注入器监控功能默认是禁用的。
您可以通过向 operator
命令传递 --watch-interval
标志来启用它,该标志可以取以下值之一:
--watch-interval=0
:禁用注入器监控功能(如果省略该标志,则为默认值)。--watch-interval=<interval>
:启用注入器监控功能,并在给定的间隔检查所有 pod;间隔的值是一个包含单位的字符串。例如:--watch-interval=10s
(每 10 秒)或 --watch-interval=2m
(每 2 分钟)。--watch-interval=once
:注入器监控功能仅在 Operator 服务启动时运行一次。
如果您使用 Helm,可以使用 dapr_operator.watchInterval
选项配置注入器监控功能,该选项的值与命令行标志相同。
当 Operator 服务以 HA(高可用性)模式运行且有多个副本时,注入器监控功能是安全的。在这种情况下,Kubernetes 会自动选举一个“领导”实例,该实例是唯一运行注入器监控服务的实例。
然而,在 HA 模式下,如果您将注入器监控功能配置为“once”运行,则每次 Operator 服务的一个实例被选为领导时,监控功能都会启动。这意味着,如果 Operator 服务的领导崩溃并选出新的领导,这将再次触发注入器监控功能。
观看此视频以了解注入器监控功能的概述:
3 - Dapr Placement 控制平面服务概述
Dapr Placement 服务概述
Dapr Placement 服务用于计算和分发用于定位的分布式哈希表,以便在自托管模式或Kubernetes上运行的Dapr actor能够被正确定位。哈希表按命名空间分组,将actor类型映射到相应的pod或进程,以便Dapr应用程序可以与actor进行通信。每当Dapr应用程序激活一个Dapr actor时,Placement服务会更新哈希表以反映最新的actor位置。
自托管模式
在自托管模式下,Placement服务的Docker容器会在执行dapr init
时自动启动。如果您使用slim-init模式,也可以手动将其作为进程运行。
Kubernetes模式
在Kubernetes模式下,Placement服务可以通过执行dapr init -k
或使用Dapr Helm图表进行部署。您可以选择在高可用性(HA)模式下运行Placement服务。了解更多关于在Kubernetes中设置HA模式的信息。
有关在Kubernetes上运行Dapr的更多信息,请访问Kubernetes托管页面。
Placement表
Placement服务提供了一个HTTP API /placement/state
,用于公开placement表的信息。该API与sidecar的healthz端口相同。这个端点默认是禁用的且不需要身份验证。要启用它,您需要将DAPR_PLACEMENT_METADATA_ENABLED
环境变量或metadata-enabled
命令行参数设置为true。如果您使用helm,只需将dapr_placement.metadataEnabled
设置为true。
重要
当actor被部署到不同的命名空间时,如果您希望防止从所有命名空间检索actor信息,建议禁用metadata-enabled
。元数据端点的范围覆盖所有命名空间。用例:
placement表API可用于检索当前的placement表,其中包含所有命名空间中注册的actor信息。这对于调试和工具提取、呈现actor信息非常有帮助。
HTTP请求
GET http://localhost:<healthzPort>/placement/state
HTTP响应代码
代码 | 描述 |
---|
200 | 返回placement表信息 |
500 | Placement无法返回placement表信息 |
HTTP响应体
Placement表API响应对象
名称 | 类型 | 描述 |
---|
tableVersion | int | placement表版本 |
hostList | Actor Host Info[] | 注册的actor主机信息的json数组。 |
Actor主机信息
名称 | 类型 | 描述 |
---|
name | string | actor的主机:端口地址。 |
appId | string | 应用程序ID。 |
actorTypes | json string array | 它托管的actor类型列表。 |
updatedAt | timestamp | actor注册/更新的时间戳。 |
示例
curl localhost:8080/placement/state
{
"hostList": [{
"name": "198.18.0.1:49347",
"namespace": "ns1",
"appId": "actor1",
"actorTypes": ["testActorType1", "testActorType3"],
"updatedAt": 1690274322325260000
},
{
"name": "198.18.0.2:49347",
"namespace": "ns2",
"appId": "actor2",
"actorTypes": ["testActorType2"],
"updatedAt": 1690274322325260000
},
{
"name": "198.18.0.3:49347",
"namespace": "ns2",
"appId": "actor2",
"actorTypes": ["testActorType2"],
"updatedAt": 1690274322325260000
}
],
"tableVersion": 1
}
相关链接
了解更多关于Placement API的信息。
4 - Dapr Scheduler 控制平面服务概述
Dapr Scheduler 服务概述
Dapr Scheduler 服务用于作业调度,可以在自托管模式或Kubernetes上运行。
下图展示了如何通过作业 API 从您的应用程序调用 Scheduler 服务。Scheduler 服务跟踪的所有作业都存储在嵌入式 Etcd 数据库中。

actor 提醒
在 Dapr v1.15 之前,actor 提醒是通过 Placement 服务运行的。现在,默认情况下,SchedulerReminders
功能标志被设置为 true
,您创建的所有新 actor 提醒都通过 Scheduler 服务运行,以提高其可扩展性。
当您部署 Dapr v1.15 时,所有现有的 actor 提醒会从 Placement 服务迁移到 Scheduler 服务。这是针对每种 actor 类型的一次性迁移操作。您可以通过在 actor 类型的应用程序配置文件中将 SchedulerReminders
标志设置为 false
来阻止此迁移。
自托管模式
Scheduler 服务的 Docker 容器作为 dapr init
的一部分自动启动。如果您在精简初始化模式下运行,也可以手动作为进程运行。
Kubernetes 模式
Scheduler 服务作为 dapr init -k
的一部分或通过 Dapr Helm 图表部署。您可以在高可用性模式下运行 Scheduler。了解更多关于在 Kubernetes 服务中设置高可用性模式的信息。
有关在 Kubernetes 上运行 Dapr 的更多信息,请访问Kubernetes 托管页面。
相关链接
了解更多关于作业 API 的信息。
5 - Dapr Sentry 控制平面服务概述
Dapr Sentry 服务概述
Dapr Sentry 服务负责管理服务之间的 mTLS,并作为证书颁发机构。它生成 mTLS 证书并将其分发给所有正在运行的 sidecar。这样,sidecar 可以通过加密的 mTLS 流量进行通信。有关更多信息,请阅读 sidecar-to-sidecar 通信概述。
自托管模式
Sentry 服务的 Docker 容器不会作为 dapr init
的一部分自动启动。不过,您可以按照 mutual TLS 的设置说明手动启动。
如果您在 slim-init 模式 下运行,也可以手动以进程的方式启动。

Kubernetes 模式
Sentry 服务可以通过 dapr init -k
或使用 Dapr Helm Chart 部署。有关在 Kubernetes 上运行 Dapr 的更多信息,请访问 Kubernetes 托管页面。

进一步阅读
6 - Dapr Sidecar Injector 控制平面服务概述
Dapr Sidecar 注入器过程概述
在 Kubernetes 模式 下运行 Dapr 时,会创建一个运行 Dapr Sidecar Injector 服务的 pod。该服务会识别那些使用 Dapr 注解 初始化的 pod,并为这些 pod 中的 daprd 服务 创建额外的容器。
运行 Sidecar 注入器
Sidecar 注入器服务可以通过执行 dapr init -k
部署,或者通过 Dapr 的 Helm chart 进行部署。有关在 Kubernetes 上运行 Dapr 的更多信息,请访问 Kubernetes 托管页面。