Dapr背后的架构模式是符合未来架构趋势(多运行时架构)和云原生发展趋势的。知乎 iyacontrol 对 Dapr的意义有一个很好的概括:
对于小公司,甚至没有基础架构和中间件团队的公司,Dapr 提供了开箱即用的基础设施功能,可以让小公司轻松构建弹性,分布式应用。
对于中等单位,具备一定的基础架构能力,在使用Dapr的过程中,可能Dapr并不能完全满足需求,那么也可以在Dapr框架体系下,花费较小的成本进行自定义扩展。
对于大公司,Dapr 提供了一种思路。相信基础架构团队会越来越倾向于通过交付Sidecar的形式来提供基础设施。比如蚂蚁集团就自行开发了- 蚂蚁开源多运行时项目 Layotto 。
具体参见: https://www.zhihu.com/question/351298264/answer/1737380230。
看源码就是 先摸清宏观路数(毕竟有些设计思想之类的东西,大概指明代码用力的方向),然后顺着几个功能点深挖下去,一个功能点一条点,辅之以一定的类图序列图。几条线搞清楚之后,宏观也会逐渐清晰。苍然暮色 写了一个系列的Dapr 源码解析:
Dapr 基本介绍
Dapr 是一个可移植的、事件驱动的运行时,使任何开发者都能轻松地建立在云和边缘运行的有弹性、无状态和有状态的应用程序,并拥抱语言和开发者框架的多样性。
Dapr 源码解析 | 项目总览
Dapr 源码解析 | 配置模块
dapr 配置主要分为三部分: 全局配置, 组件配置和运行时配置.全局配置和组件配置是以 yaml 形式定义的, 而且直接使用 k8s crd 类型
Dapr 源码解析 | 组件模块
Components
是 dapr 抽象出来的提供某种特定功能的可插拔组件, 为 dapr 或者 building blocks 所使用。
Dapr 源码解析 | 发布订阅
发布订阅在 dapr 既是一个 component 又是一个 building block. dapr 的 pubsub 构建块可以对外提供一个最少一次送达保证
的发布订阅 API, 可以支持多种软件作为 message broker. 使用这个功能我们的服务就需要引入繁杂的 message broker sdk 和管理消息队列连接.
Dapr 源码解析 | 服务间调用
Service Invocation 是 dapr 对外提供的最基础功能, 也就是服务间调用. 另外别的一些功能也会间接使用它.
Dapr 源码解析 | mTLS
mutual authentication TLS 是 dapr 提供的开箱即用的安全功能, 为 dapr sidecar 之间的流量进行加密。
Dapr 源码解析 | 可观测性
Observability(可观测性)一般指 Logging
, Metrics
和 Tracing
。
Dapr 源码解析 | Operator
dapr operator 是 dapr 的几个独立软件之一.operator 是对 k8s 功能的扩展, 可以用来扩展 CRD 做更精细化的事情, 例如: 自动化运维部署高可用数据库, 因为它是用代码解决问题而不是配置.
Dapr 源码解析 | Sidecar Injector
dapr sidecar injector 是 dapr 几个独立软件之一, 功能是在 k8s 环境为用户服务注入 dapr runtime sidecar 容器.
Dapr 源码解析 | Name Resolution
Name resolution 解决的是微服务中的服务发现问题, dapr 中服务的标识符为 app-id
, 服务间调用是通过 app-id
来确定目标服务的. 所以就需要 app-id
到真实服务地址的映射. dapr 服务发现其实就是单纯的 gRPC 服务发现, 因为服务间调用是通过 dapr sidecar 转发的, 而 sidecar 之间是通过 gRPC 交流的, 所以最终就变成了 gRPC 服务发现了.