This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

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 注释的关系。

示例

  1. 通过指定其唯一 ID 启动与应用程序一起的 sidecar。

    注意: --app-id 是必填字段,且不能包含点。

    daprd --app-id myapp
    
  2. 指定您的应用程序正在监听的端口

    daprd --app-id myapp --app-port 5000
    
  3. 如果您使用了多个自定义资源并希望指定资源定义文件的位置,请使用 --resources-path 参数:

    daprd --app-id myapp --resources-path <PATH-TO-RESOURCES-FILES>
    
  4. 如果您已将组件和其他资源(例如,弹性策略、订阅或配置)组织到单独的文件夹或共享文件夹中,您可以指定多个资源路径:

    daprd --app-id myapp --resources-path <PATH-1-TO-RESOURCES-FILES> --resources-path <PATH-2-TO-RESOURCES-FILES>
    
  5. 在运行应用程序时启用 Prometheus 指标收集

    daprd --app-id myapp --enable-metrics
    
  6. 仅监听 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 的问题。

注入器监控功能在以下情况下可能会很有帮助:

  • 从完全停止的 Kubernetes 集群中恢复。当集群完全停止后再启动时(包括在集群完全故障的情况下),pod 会以随机顺序重启。如果您的应用程序在 Dapr 控制平面(特别是注入器服务)准备好之前重启,Dapr sidecar 可能不会注入到您的应用程序的 pod 中,导致应用程序行为异常。

  • 解决 sidecar 注入器可能出现的随机故障,例如注入器服务中的瞬时故障。

如果监控功能发现某个 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。

用例:

placement表API可用于检索当前的placement表,其中包含所有命名空间中注册的actor信息。这对于调试和工具提取、呈现actor信息非常有帮助。

HTTP请求

GET http://localhost:<healthzPort>/placement/state

HTTP响应代码

代码描述
200返回placement表信息
500Placement无法返回placement表信息

HTTP响应体

Placement表API响应对象

名称类型描述
tableVersionintplacement表版本
hostListActor Host Info[]注册的actor主机信息的json数组。

Actor主机信息

名称类型描述
namestringactor的主机:端口地址。
appIdstring应用程序ID。
actorTypesjson string array它托管的actor类型列表。
updatedAttimestampactor注册/更新的时间戳。

示例

 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 数据库中。

展示 Scheduler 控制平面服务和作业 API 的图示

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 托管页面