四、 服务网格
1. 基于Istio的Dubbo Mesh总体架构
Dubbo Mesh是Dubbo在云原生背景的微服务整体解决方案,它帮助开发者实现Dubbo服务与标准的Kubernetes Native Service体系的打通,让Dubbo应用能够无缝接入Istio等业界主流服务网格产品。
以下是Dubbo Mesh的部署架构图。
• 控制面。Istio作为统一控制面,为集群提供Kubernetes适配、服务发现、证书管理、可观测性、流量治理等能力。
• 数据面。Dubbo应用实例作为数据面组件,支持两种部署模式
。 Proxy模式。Dubbo进程与Envoy部署在同一pod,进出Dubbo的流量都经Envoy代理拦截,由Envoy执行流量管控。
。 Proxyless模式。Dubbo进程独立部署,进程间直接通信,通过xDS协议与控制面直接交互。
关于服务网格架构以及为何要接入Istio控制面,请参考Istio官网,本文不包含这部分通用内容的讲解,而是会侧重在Dubbo Mesh解决方案本身。
1) Dubbo Mesh
Proxy Mesh
在proxy模式下,Dubbo与Envoy等边车(Proxy or Sidecar)部署在一起
以上是Dubbo Proxy Mesh部署架构图。
• Dubbo与Envoy部署在同一个Pod中,Istio实现对流量和治理的统一管控。
• Dubbo只提供面向业务应用的编程API、RPC通信能力,其余流量管控能力如地址发现、负载均衡、路由寻址等都下沉到Envoy,Envoy拦截所有进出流量并完成路由寻址等服务治理工作。
• 控制面与Envoy之间通过图中虚线所示的xDS协议进行配置分发。
在Proxy模式下,Dubbo3通信层选用Triple、gRPC、REST等基于HTTP的通信协议可以获得更好的网关穿透性与性能体验。
Proxyless Mesh
在Proxyless模式下,没有Envoy等代理组件,Dubbo进程保持独立部署并直接通信,Istio控制面通过xDS与Dubbo进程进行治理能力交互。
Proxyless模式下Dubbo部署与服务网格之前基本一致,通过不同语言版本的Dubbo3 SDK直接实现xDS协议解析。
为什么需要Proxyless Mesh
Proxy模式很好的实现了治理能力与有很多优势,如平滑升级、多语言、业务侵入小等,但也带来了一些额外的问题,比如:
• Sidecar通信带来了额外的性能损耗,这在复杂拓扑的网络调用中将变得尤其明显。
• Sidecar的存在让应用的声明周期管理变得更加复杂。
• 部署环境受限,并不是所有的环境都能满足Sidecar部署与请求拦截要求。
在Proxyless模式下,Dubbo进程之间继续保持直连通信模式:
• 没有额外的Proxy中转损耗,因此更适用于性能敏感应用
• 更有利于遗留系统的平滑迁移
• 架构简单,容易运维部署
• 适用于几乎所有的部署环境
2) 示例任务
了解了足够多的原理知识,我们推荐你访问如下示例进行动手实践。
3) 可视化
推荐使用Dubbo Admin作为您Dubbo集群的可视化控制台,它兼容所有Kubernetes、Mesh和非Mesh架构的部署。
除此之外,你也可以使用Istio官方推荐的可视化工具来管理您的Dubbo Mesh集群。
4) 接入非Istio控制面
Dubbo Mesh本身并不绑定任何控制面产品实现,你可以使用Istio、Linkerd、Kuma或者任一支持xDS协议的控制面产品,对于Sidecar亦是如此。
如果你已经完整的体验了基于Istio的Dubbo Mesh示例任务,并且发现Istio很好的满足了你的Dubbo Mesh治理诉求,那么采用Istio作为你的控制面是首选的解决方案。
如果你发现Istio模式下Dubbo部分能力受限,而这部分能力正好是你需要的,那么你需要考虑接入Dubbo控制面,用Dubbo控制面来替代Istio,以获得更多Dubbo体系原生能力支持、更好的性能体验。具体请参见基于Dubbo定制控制面的Dubbo Mesh示例任务。
注:
简单来讲,这是 Dubbo 社区发布的一款基于 Istio 的定制版本控制面,Dubbo 控制面安装与能力差异请参见上面的示例任务链接。
5) 老系统迁移方案
如何解决注册中心数据同步的问题?
本书写作之时,Dubbo社区正在以Admin项目为基础推进此部分建设。
如何解决Dubbo2协议通信的问题?
目前业界有Aeraki Mesh等相关的解决方案可供参考。
2. 基于Istio&Envoy Mesh示例
遵循以下步骤,可以轻松掌握如何开发符合Service Mesh架构的Dubbo服务,并将其部署到Kubernetes并接入Istio的流量治理体系。在此查看。
1) 总体目标
• 部署Dubbo应用到Kubernetes
• Istio自动注入Envoy并实现流量拦截
• 基于Istio规则进行流量治理
2) 基本流程与工作原理
这个示例演示了如何将Dubbo开发的应用部署在Istio体系下,以实现Envoy对Dubbo服务的自动代理,示例总体架构如下图所示。
完成示例将需要的步骤如下:
• 创建一个Dubbo应用:点击这里。
• 构建容器镜像并推送到镜像仓库(本示例官方镜像点击这里查看)。
• 分别部署Dubbo Provider与Dubbo Consumer到Kubernetes并验证Envoy代理注入成功。
• 验证Envoy发现服务地址、正常拦截RPC流量并实现负载均衡。
• 基于Istio VirtualService实现按比例流量转发。
《Apache Dubbo微服务开发从入门到精通》——服务治理与生态——四、服务网格(2):https://developer.aliyun.com/article/1223950