Dubbo Mesh 总体技术架构方案
作者: 江河清
Dubbo Mesh 作为 Dubbo 全面拥抱云原生的又一个里程碑项目,将为 Dubbo 用户提供平滑升级到 Service Mesh 架构的解决方案,同时继续基于 Dubbo 强大可扩展性底座提供生产级服务治理、服务管控等能力。
本文将对 Dubbo Mesh 整体设计原则、部署架构与插件管控机制的规划做整体说明。
设计原则
Dubbo Mesh 以插件化的方式接入各生态,除了部分维持基础运行的架构外绝大部分的组件支持热插拔,支持根据不同部署场景动态选择部署方式。
插件化能力的设计延续了 Dubbo 一贯的高可扩展性的特征,基于这样的一个基础能力,开发者可以根据自己所需的真实部署场景进行定制,如接入内部的自建 DevOps 平台等。通过插件化的能力,也使得 Dubbo Mesh 在未来能更容易适配新的基础组件;通过热插拔的设计,绝大部分的新功能将能在生产环境平滑落地,很大程度上隔离由于中间件变更给业务带来的变更协作影响。
部署架构
从架构与部署形态上来说 Dubbo Mesh 明确的区分为控制面与数据面。
其中控制面作为服务治理核心,具有抽象的、统一的模型,负责与底层基础设施的对接,提供从启动配置、服务发现、流量管理到认证鉴权等的统一治理入口。
数据面则专注在业务编程模型与通信能力上,基于多种部署形态(SDK、Sidecar、Agent)接入服务治理能力,基于动态部署能力从业务代码中解耦出来。
从整体组件角色来说,Dubbo Mesh 中有两种角色的组件:基础组件、扩展性组件。
基础组件由 Dubbo 原生提供,用于构建整个体系,如上图中的 Admin 用户管控组件、Dynamic Binary Push 动态分发组件(下文中会展开说明)、Proxy 数据代理组件等。
扩展性组件由 Dubbo 和其他生态共建提供,用于提供特定化能力,如上图中功能的 Test 服务测试组件、Config 配置动态修改组件、Skywalking 全链路追踪组件等。各扩展性组件均设计为可热插,可以可选的动态开关部分能力。
数据流
上图中除了部署架构的描述之外,还标识了在 Dubbo Mesh 这样一个部署架构下的数据流向。
Dubbo Mesh 提供了两种通信模式,分别是 Proxy 模式与直连模式。在基础组件中的 Proxy 提供到达数据面的通路,一个 Any 数据流,不绑定任何上层语义。扩展性组件可选通过 Proxy 进行互通,或者直接和数据面进行互通。
Proxy 模式不需要组件感知集群的连接模式,适用于一些比较简单、无独立服务端的组件实现,基于 Dubbo 的能力能直接实现与数据面的通信,降低管理连接的难度。直连模式用于集成一些复杂、有独立服务端的组件,如全链路追踪组件通常都需要独立部署中心化的收集服务端,如果流量通过 Dubbo Proxy 进行转发在一定程度上会导致部署成本的提高。
数据面架构
Dubbo Mesh 的数据面规划分成 Java Proxyless 和 Sidecar 两种模式。Java Proxyless 模式提供基于 Java ClassLoader 动态加载能力下的高性能部署方案;Sidecar 模式提供基于外置进程替换的跨语言、跨架构的通用部署方案。
Java Proxyless
Java Proxyless 模式是从常规 Dubbo Java 部署模式升级而来的,通过将 Dubbo 内核与实现分离的方式,基于 Java ClassLoader 的动态加载机制避免具体实现能力与业务代码进行耦合,提供中间件热升级能力。
如上图所示,Dubbo SDK 定义 Dubbo 扩展点,如 Router、Registry、LoadBalance 等,扩展点尽可能复用 Dubbo 已有的 SPI 机制。此外,Dubbo SDK 中集成一个统一的 DubboInitializer,运行时从控制面拉取所需运行时代码,组装成为一个完整的 Dubbo SDK。
Sidecar
Sidecar 模式下 Dubbo 作为一个独立进程运行,通过 UDS / TCP 等本地通讯方式或者请求拦截的方式管控流量。通过在 Sidecar 进程中进行数据加工、流量定制化路由等方式达成流量治理的目标。
Sidecar 模式也类似 Proxyless 模式提供扩展点,支持不同场景下自定义组装实现、动态替换升级的能力。由于 Sidecar 是从流量层面直接进行治理,和业务代码本身不耦合,可以提供跨语言、跨架构的通用治理能力。
插件推送模式
在前面的两种数据面架构中都涉及到了扩展实现的动态下发的能力,本节中将对这部分能力做具体阐述说明。
Java Proxyless
Java Proxyless 模式下的扩展是通过 Java ClassLoader 进行动态类加载的,因此只需要拿到对应扩展的实现类既可实现加载。在 Dubbo Mesh 中通过统一的 Dynamic Binary Push 动态分发组件可以实现将每个插件中自带的对应类实现下发到数据面中进行加载。
Sidecar(Preview)
Sidecar 模式下,有多种方式能实现热生效。这里以替换进程的方式为例,在控制面中动态组装 Sidecar 的代码并编译,通过Dynamic Binary Push 动态分发组件动态下发 Sidecar 的二进制包到数据面中的 Dubbo Agent,由 Dubbo Agent 负责拉起新的进程并切换流量到新的进程上。
更多关于 Dubbo Mesh 的动态可以关注 Apache Dubbo 社区官方公众号(ApacheDubbo),及时获取最新的消息。
微信公众号 | ApacheDubbo
钉钉群号 | 21976540
点击“此处”,直达 Dubbo 官网!