什么是Dapr?Dapr和API有什么关系?

      Dapr的全称是 “Distributed Application Runtime”,即 “分布式应用运行时”。Dapr 是一个开源项目,由微软发起,目前已加入CNCF孵化器项目。

        在ServiceMesh初步成功,Sidecar模式被云原生社区普遍接受之后,效仿ServiceMesh,将应用需要的其他分布式能力外移到各种Runtime变成为一个趋势。这些Runtime会逐渐整合,最后和应用 Runtime 共同组成微服务,形成所谓的“Multi-Runtime”架构,又称Mecha:

图片

Dapr项目是目前业界第一个Multi-Runtime / Mecha实践项目,下图来自Dapr官方,比较完善的概括了 Dapr 的能力和层次架构:

图片

Dapr的愿景:any language, any framework, anywhere

Dapr的本质:面向云原生应用的分布式能力抽象层

图片

可移植性是Dapr的重要目标和核心价值。Dapr 的愿景, “any language, any framework, anywhere",这里的 anywhere 包括:
 

  • 公有云

  • 私有云

  • 混合云

  • 边缘网络

而 Dapr 可移植性的基石在于标准API + 可拔插可替换的组件,下面这张来自 Dapr 官方网站的图片非常形象的展示了Dapr的这一特性:

图片

从架构设计的角度看,Dapr 的精髓在于:通过抽象/隔离/可替换,解耦能力和实现,从而实现可移植性。

图片

在传统的应用开发方式中,应用需要面向具体的实现编程,即当应用需要使用到某个能力时,就需要找到能提供该能力的底层组件,如上图中的 redis / consul / memcached / zookeeper 都可以提供分布式状态的存储能力。应用在选择具体组件之后,就需要针对该组件进行编程开发,典型如引入该组件的客户端SDK,然后基于这些SDK实现需要的分布式能力,如缓存、状态、锁、消息通讯等具体功能。

在 Dapr 中,Dapr 倡导 “面向能力编程",即:

  • Dapr API 提供了对分布式能力的抽象,并提取为标准API

  • Dapr 的 Runtime 隔离 应用和底层组件的具体实现

而这些组件都是可替换的,可以在运行时才进行绑定。

Dapr 通过这样的方式,实现了能力和实现的解耦,并给出了一个美好的愿景:在有一个业界普遍认可并遵循的标准化API的基础上,用户可以自由选择编程语言开发云原生,这些云原生可以在不同的平台上运行,不被厂商和平台限制——终极目标是使得云原生应用真正具备跨云跨平台的可移植性。

理想很美好,但现实依然残酷:和 ServiceMesh 相比,Dapr 在落地时存在一个无可回避的问题——应用改造是有成本的。

图片

从落地的角度来看, ServiceMesh 的低侵入性使得应用在迁移到 ServiceMesh 时无需太大的改动,只需要像往常一样向 sidecar 发出原生协议的请求即可,甚至在流量劫持的帮助下可以做到应用完全无感知。从工作模式上说,基于原生协议转发的 ServiceMesh 天然对旧应用友好。而 Dapr 出于对可移植性目标的追求,需要为应用提供一个标准的分布式能力抽象层来屏蔽底层分布式能力的具体实现方式,应用需要基于这个抽象层进行开发,才能获得跨云跨平台无厂商绑定等可移植性方面的收益。因此,在 Dapr 落地过程中,新应用需要基于 Dapr API 全新开发,老应

Dapr(Distributed Application Runtime)是一个为简化分布式应用开发而设计的可扩展、独立部署的运行时框架。Dapr 的架构分为 **控制平面**(Control Plane) **数据平面**(Data Plane)两个核心部分。其中,控制平面主要负责管理 Dapr 运行时的生命周期、配置协调服务间的通信。 ### Dapr 控制平面的组成 Dapr 控制平面由一组服务组成,这些服务通常以 Kubernetes 控制器的形式运行,包括以下几个关键组件: 1. **Placement Service** Placement Service 是一个简单的调度服务,用于将 Dapr Sidecar(即 `daprd`)与应用程序 Pod 绑定。它维护了一个服务实例的注册表,并确保每个服务调用能够正确地路由到目标实例。Placement Service 在服务调用时起到协调作用,尤其在 Actor 模式中,它负责分配 Actor 实例到具体的 Sidecar 上运行[^4]。 2. **Sidecar Injector** Sidecar Injector 是一个 Kubernetes 准入控制器(Admission Controller),负责在 Pod 创建时自动注入 Dapr Sidecar 容器。它通过一个 HTTP Webhook 处理程序接收 Pod 创建请求,并根据 Pod 的注解标签决定是否需要注入 Dapr Sidecar。如果需要,它会生成相应的 `patchOps` 操作来修改 Pod 的定义,添加 Sidecar 容器的配置[^3]。 3. **Operator** Operator 是 Dapr 控制平面的核心组件之一,负责管理 Dapr 组件的生命周期。它监听 Kubernetes 中自定义资源定义(CRD)的变化,如 `Component`、`Configuration` 等,并根据这些配置动态地更新 Dapr Sidecar 的行为。例如,当一个新的状态存储组件被定义时,Operator 会通知相关的 Sidecar 加载该组件。 4. **Sentry** Sentry 是 Dapr 的证书管理服务,负责为 Dapr Sidecar 提供 mTLS(双向 TLS)证书,确保服务间的通信是安全的。它与 Kubernetes 的 Secret 存储集成,生成并分发证书,使得 Dapr 可以在服务间启用加密通信。 ### Dapr 控制平面的作用 控制平面在 Dapr 架构中起到了协调管理的作用,主要体现在以下几个方面: - **生命周期管理** 控制平面负责 Dapr Sidecar 的启动、配置更新。通过 Operator,它可以动态地调整 Sidecar 的行为,而无需重新部署应用程序。 - **服务发现与路由** Placement Service 在服务调用时起到关键作用,尤其是在 Actor 模式下,它确保每个 Actor 实例都能正确地被调度到对应的 Sidecar 上运行。 - **安全通信** Sentry 提供了 mTLS 支持,确保服务之间的通信是加密的。它负责生成管理证书,并将其分发给各个 Sidecar。 - **自动化注入** Sidecar Injector 通过 Kubernetes 的准入控制机制,在 Pod 创建时自动注入 Dapr Sidecar,减少了手动配置的复杂性。 - **组件管理** 控制平面通过监听 CRD 来管理 Dapr 组件的配置,如状态存储、消息发布/订阅等。这些组件可以通过配置文件或代码进行自定义,并通过 `httpPipeline` 进行中间件处理[^1]。 ### 控制平面与数据平面的关系 控制平面与数据平面是 Dapr 架构中的两个核心部分。控制平面主要负责管理 Sidecar 的生命周期、配置安全策略,而数据平面则负责实际的服务间通信。数据平面由每个 Pod 中的 Dapr Sidecar(`daprd`)组成,它们处理服务调用、事件发布/订阅、状态管理等任务。控制平面通过与数据平面的协作,确保整个分布式系统的协调一致。 ### 示例:Dapr 控制平面在 Kubernetes 中的部署 在 Kubernetes 中,Dapr 控制平面通常以一组 Deployment Service 的形式部署。以下是控制平面组件的典型部署方式: ```yaml # 示例:Dapr 控制平面组件的 Kubernetes 部署片段 apiVersion: apps/v1 kind: Deployment metadata: name: dapr-operator namespace: dapr-system spec: replicas: 1 selector: matchLabels: app: dapr-operator template: metadata: labels: app: dapr-operator spec: containers: - name: dapr-operator image: docker.io/daprio/dapr:1.8.4 command: ["./operator"] ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: dapr-operator namespace: dapr-system spec: ports: - port: 8080 protocol: TCP selector: app: dapr-operator ``` ### 总结 Dapr 控制平面是 Dapr 分布式运行时的核心管理组件,负责协调 Sidecar 的生命周期、服务发现、安全通信组件管理。它通过 Kubernetes 的 CRD 准入控制器机制,实现了对分布式应用的自动化管理动态配置。控制平面与数据平面的分离设计,使得 Dapr 能够灵活地适应不同的部署环境业务需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值