开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

2023-11-17

不论您是一名开发者、架构师、CTO, 如果您曾深度参与在微服务开发中,那么相信您一定有过开源微服务框架或体系选型的疑问:Apache Dubbo、Spring Cloud、gRPC 以及 Service Mesh 体系产品如 Istio,到底应该选型哪一个?这篇文章对这几个框架进行了详细的说明,并在选型方面给了一定的指导意见,相信能给微服务开发者带来一定的帮助。

需要注意的是,这篇文章的作者有深度 Apache Dubbo 社区参与经验,因此整篇文章是以 Dubbo 为基础展开的,通过将 Dubbo 与其他组件之间的联系与差异客观、透明的展现出来,来向读者呈现几款开源产品的优势和适用场景。整篇文章中有部分内容突出了 Apache Dubbo 项目的优势,请大家在阅读过程中保持对这点的认识,但它总体上并不影响我们从总体上了解每个产品并获得具有价值的选型指导。

Dubbo 与 Spring Cloud

从上图我们可以看出,Dubbo 和 Spring Cloud 有很多相似之处,它们都在整个架构图的相同位置并提供一些相似的功能。

  • Dubbo 和 Spring Cloud 都侧重在对分布式系统中常见问题模式的抽象(如服务发现、负载均衡、动态配置等),同时对每一个问题都提供了配套组件实现,形成了一套微服务整体解决方案,让使用 Dubbo 及 Spring Cloud 的用户在开发微服务应用时可以专注在业务逻辑开发上。
  • Dubbo 和 Spring Cloud 都完全兼容 Spring 体系的应用开发模式,Dubbo 对 Spring 应用开发框架、Spring Boot 微服务框架都做了很好的适配,由于 Spring Cloud 出自 Spring 体系,在这一点上自然更不必多说。

虽然两者有很多相似之处,但由于它们在诞生背景与架构设计上的巨大差异,两者在性能、适用的微服务集群规模、生产稳定性保障、服务治理等方面都有很大差异。

Spring Cloud 的优势在于:

  • 同样都支持 Spring 开发体系的情况下,Spring Cloud 得到更多的原生支持。
  • 对一些常用的微服务模式做了抽象如服务发现、动态配置、异步消息等,同时包括一些批处理任务、定时任务、持久化数据访问等领域也有涉猎。
  • 基于 HTTP+JSON 的通信模式,对于开发、测试、上下游体系接入等更友好,成本更低。
  • Spring Cloud 官方具有相对完善的入门文档和演示 demo 和 starters,包括书籍资料等,让开发者上更易于上手。

Spring Cloud 的问题有:

  • 只提供抽象模式的定义不提供官方稳定实现,开发者只能寻求类似 Netflix、Alibaba、Azure 等不同厂商的实现套件,而每个厂商支持的完善度、稳定性、活跃度各异。
  • 有微服务全家桶却不是能拿来就用的全家桶,demo 上手容易,但落地推广与长期使用的成本并不低。
  • 欠缺服务治理能力,尤其是流量管控方面如负载均衡、流量路由方面能力都比较弱。
  • 编程模型与通信协议绑定 HTTP,在性能、与其他 RPC 体系互通上存在障碍。
  • 总体架构与实现更适用于小规模微服务集群实践,当集群规模增长后就会遇到地址推送效率、内存占用等各种瓶颈的问题,但此时迁移到其他体系却很难实现。
  • 微服务实践场景的高阶问题需要用户自行解决,比如优雅停机、启动预热、服务测试,再比如双注册、双订阅、延迟注册、服务按分组隔离、集群容错等。

而针对以上这些点,都是 Dubbo 的优势所在

  • 完全支持 Spring & Spring Boot 开发模式,同时在服务发现、动态配置等基础模式上提供与 Spring Cloud 对等的能力。
  • 是企业级微服务实践方案的整体输出,Dubbo 考虑到了企业微服务实践中会遇到的各种问题如优雅上下线、多注册中心、流量管理、异常实例隔离等,因此其在生产环境的长期维护成本更低。
  • 在通信协议和编码上选择更灵活,包括 RPC 通信层协议如 Triple(gRPC、HTTP/1 兼容)、TCP 二进制协议、REST等,序列化编码协议 Protobuf、JSON、Hessian2 等,支持单端口多协议。
  • Dubbo 从设计上突出服务服务治理能力,如权重动态调整、标签路由、条件路由等,支持 Sidecar、Proxyless 等多种模式接入 Service Mesh 体系。
  • 高性能的 RPC 协议编码与实现。
  • Dubbo 是在超大规模微服务集群实践场景下开发的框架,可以做到百万实例规模的集群水平扩容,应对集群增长带来的各种问题。
  • Dubbo 提供 Java 外的多语言实现,使得构建 Java、Go、Node.js、Rust、Web 等多语言异构的微服务体系成为可能。

如果您的目标是构建企业级应用,并期待在未来的持久维护中能够更省心、更稳定,我们建议你能更深入的了解 Dubbo 的使用和其提供的能力。

Dubbo 与 gRPC

关于这两款开源产品之间的差异,我们可以从产品定位和协议对比两个方面来展开:

产品定位上的区别

Dubbo 与 gRPC 最大的差异在于两者的定位上:

  • gRPC 定位为一款 RPC 框架,Google 推出它的核心目标是定义云原生时代的 rpc 通信规范与标准实现;
  • Dubbo 定位是一款微服务开发框架,它侧重解决微服务实践从服务定义、开发、通信到治理的问题,因此 Dubbo 同时提供了 RPC 通信、与应用开发框架的适配、服务治理等能力。

Dubbo 不绑定特定的通信协议,即 Dubbo 服务间可通过多种 RPC 协议通信并支持灵活切换。因此,你可以在 Dubbo 开发的微服务中选用 gRPC 通信,Dubbo 通过 Triple 协议可以做到完全兼容 gRPC,并将 gRPC 通信协议为内置原生支持的协议之一。

协议上的区别

Triple 协议是 Dubbo3 设计的基于 HTTP 的 RPC 通信协议规范,它完全兼容 gRPC 协议,支持 Request-Response、Streaming 流式等通信模型,可同时运行在 HTTP/1 和 HTTP/2 之上。

Dubbo 框架提供了 Triple 协议的多种语言实现,它们可以帮助你构建浏览器、gRPC 兼容的 HTTP API 接口:你只需要定义一个标准的 Protocol Buffer 格式的服务并实现业务逻辑,Dubbo 负责帮助生成语言相关的 Server Stub、Client Stub,并将整个调用流程无缝接入如路由、服务发现等 Dubbo 体系。Go、Java 等语言的 Triple 协议实现原生支持 HTTP/1 传输层通信,相比于 gRPC 官方实现,Dubbo 框架提供的协议实现更简单、更稳定,帮助你更容易的开发和治理微服务应用。

针对某些语言版本,Dubbo 框架还提供了更贴合语言特性的编程模式,即不绑定 IDL 的服务定义与开发模式,比如在 Dubbo Java 中,你可以选择使用 Java Interface 和 Pojo 类定义 Dubbo 服务,并将其发布为基于 Triple 协议通信的微服务。

上面提到 Triple 完全兼容 gRPC 协议,那既然 gRPC 官方已经提供了多语言的框架实现,为什么 Dubbo 还要通过 Triple 重新实现一遍那?核心目标主要有以下两点:

  • 首先,在协议设计上,Dubbo 参考 gRPC 与 gRPC-Web 两个协议设计了自定义的 Triple 协议:Triple 是一个基于 HTTP 传输层协议的 RPC 协议,它完全兼容 gRPC 的同时可运行在 HTTP/1、HTTP/2 之上。
  • 其次,Dubbo 框架在每个语言的实现过程中遵循了符合框架自身定位的设计理念,相比于 grpc-java、grpc-go 等框架库,Dubbo 协议实现更简单、更纯粹,尝试在实现上规避 gRPC 官方库中存在的一系列问题。

使用 Dubbo 框架并开启 Triple 协议,可以底层兼容 gRPC 协议的微服务,开发者基于 Dubbo 提供的 API 和配置开发服务,并基于 dubbo 的服务治理能力治理服务。同时相比于原生 gRPC 协议,Triple 协议通过支持 cURL、浏览器的直接访问让调试、前端接入更简单。

curl \
    --header "Content-Type: application/json" \
    --data '{"sentence": "Hello Dubbo."}' \
    https://host:port/org.apache.dubbo.sample.GreetService/sayHello

Dubbo 与 Istio

Service Mesh 服务网格是近年来在云原生背景下诞生的一种微服务架构,在 Kubernetes 体系下,服务网格让微服务开发中的更多能力如流量拦截、服务治理等下沉并成为基础设施,让微服务开发、升级更轻量。Istio 是 Service Mesh 的开源代表实现,它从部署架构上分为数据面与控制面,从这一点本质上与 Dubbo 总体架构是基本一致的,Istio 带来的主要变化在于:

  • 数据面,Istio 通过引入 Sidecar 实现了对服务流量的透明拦截,Sidecar 通常是与 Dubbo 等开发的传统微服务组件部署在一起。
  • 控制面,将之前抽象的服务治理中心聚合为一个具有统一实现的具体组件,并实现了与底层基础设施如 Kubernetes 无缝适配。

Dubbo 已经实现了对 Istio 体系的全面接入,可以用 Istio 控制面治理 Dubbo 服务,而在数据面部署架构上,针对 Sidecar 引入的复杂性与性能问题,Dubbo 还支持无代理的 Proxyless 模式。除此之外,Dubbo Mesh 体系还解决了 Istio 架构落地过程中的很多问题,包括提供更灵活的数据面部署架构、更低的迁移成本等。

数据面的视角,Dubbo 支持如下两种开发和部署模式,可以通过 Istio 等控制面组件实现对数据面服务的治理。

  • 模式,Dubbo 与 Envoy 一起部署,Dubbo 作为编程框架 & 协议通信组件存在,流量管控由 Envoy 与 Istio 控制面交互实现。
  • Proxyless 模式,Dubbo 进程保持独立部署,Dubbo 通过标准 xDS 协议直接接入 Istio 等控制面组件。

控制面视角,Dubbo 可接入原生 Istio 标准控制面和规则体系,而对于一些 Dubbo 老版本用户,接下来社区会联合企业用户共同推出社区版本平滑迁移方案。

总结

这篇文章以 Dubbo 为出发点,向我们详细介绍了 Spring Cloud、Dubbo、gRPC、Istio 等几个框架产品以及它们各自的优势与差异,相信对我们微服务技术选型能带来一定的帮助。但正如我们开篇提到的,本文是从 Apache Dubbo 摘录的一些核心要点,因此整篇文章是以 Dubbo 为基础展开的,文章中有部分内容突出了 Apache Dubbo 项目的优势。后续我们将陆续以更多的不同维度展开,为大家带来更多维度的产品对比与指导。

作者:刘军

点击立即免费试用云产品 开启云上实践之旅!

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比 的相关文章

  • java怎么把字符串转换成日期类型

    1 java怎么把字符串转换成日期类型 2 Java如何将指定字符串转化为指定日期格式 3 求JAVA高手解答 有关于字符串类型转换成日期型 4 Java中怎么把字符串转换成日期格式啊 5 java中怎样将字符串转换成日期形式存入数据库 j
  • 3分钟即可了解 FHub中转站文件摆渡新技能

    说到文件摆渡的方式 有很多种 比较传统一点的 像U盘拷贝 FTP等 自动化一点的 像网闸 网盘等 还有一些企业会通过一些技术手段进行摆渡 比如防火墙技术等 这些方式都能在一定程度上解决跨隔离网文件摆渡的问题 为什么这么说呢 且听下文分析 1
  • java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)...

    内存分配的策略 按照编译原理的观点 程序运行时的内存分配有三种策略 分别是静态的 栈式的 和堆式的 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求 因而在编 译时就可以给他们分配固定的内存空间 这种分配策略要求程序代码
  • 联想万全服务器告警信息在哪里看,华为网络设备查看告警信息

    检查设备是否出现故障以及近期是否有重要的告警信息 前提条件 已经完成登录设备 操作步骤 执行命令display alarm all 查看所有活动的硬件告警信息 以判断设备是否发生故障 display alarm all Info NO al
  • Python运维开发:基于openstack RestfulAPI上传镜像和创建云主机

    基础环境 python 脚本文件头建议加入 encoding utf 8 避免编码错误 测试脚本代码用python3命令执行与测试 在linux系统中安装Python3 并安装request等依赖包 配置 有一台搭建好的open stack
  • CSS3渐变

    以前我们如果想要做到一个颜色到另一个颜色的渐变 Gradients 效果 需要用ps之类的应用程序做出一张背景图片 然后放到元素上 这样子不仅麻烦 而且不利于代码的维护 当用户界面大小发生改变时 显示效果也不好 CSS3提供给了我们一种渐变

随机推荐

  • 正定Hermiltian矩阵分解的两种方法

    对于正定Hermiltian矩阵 B B B 想要求解 D D D 使其满足
  • 单价数量和总价的公式_小学数量关系计算公式汇总,收藏起来写作业不用翻书了!...

    点击上方蓝字 关注我们 要想数学学得好 就要公式记得牢 公式是为了孩子更好的解题来用的 很多孩子数学学习过程中经常出现 平时不记 考试捉急 的现象 虽然数学是一门非常注重逻辑思维能力的一个学科 但是想要取得好的成绩 离不开基础知识的掌握 只
  • 【经典】SpringBoot 过滤器和拦截器

    过滤器 创建过滤器 MyFilter 实现Filter接口 实现doFilter方法 在SpringbootwebApplication java中添加一个过滤器注册方法 具体实现如下 如果要不拦截静态资源 则可以在Filter中设置 当然
  • 项目架构图

    前言 前段时间一直在找工作 面试过程终于到了不少问题 有些是自己会的 有些是自己看过却无法整理出来的 说到底是理解不够透彻 记忆不够深刻 当然还有些是完全懵逼的 下面就来说下经常被问及 自己却无法当场整理出来的一个问题 那就是让你画出自己做
  • DNS服务-笔记

    DNS 域名解析服务 PC访问DNS用的是 UDP 53端口 主辅同步数据用的是 TCP 53端口 工作原理 当解析一台主机域名时 首先会访问电信 网通等提供的DNS服务器地址上的DNS服务器 去访问 根域 也就是根域 大概有13台 然后根
  • 数字三角形之动态规划(C语言实现)

    算法步骤 1 首先构造三个数组 第一个是存储三角形初始值的数组data 第二个是存储顶点到该点最大值的res 数组 第三个是存储该点上一个点的loc 数组 这里要对res 数组进行初始化 1 2 按照三角形的层次结构 从上到下 从左到右依次
  • mysql存储过程游标之loop循环

    mysql存储过程游标 一共有3中循环方式 while repeat loop loop DELIMITER CREATE PROCEDURE DAY081002 BEGIN 定义参数 后面使用 DECLARE a INT DECLARE
  • 前端面试总结

    1 引言 最近参加了大量的招聘会 投递了大量的简历 整整体会了从 随便找个厂上一下 还是的找个大厂 没人要 急了急了 海投一波 工资有点尬 海投中 简单说一下自己的一些感受吧 现在的前端属实有点尴尬 前端的基础教程特别多 最开始本来是觉得自
  • Stata输出统计结果到Excel或word

    目录 一 安装外部包 二 相关命令 三 实例 1 描述性统计结果输出 2 相关性结果输入 3 回归结果输出 1 单模型结果 2 多模型结果 参考 一 安装外部包 在Stata内安装外部包 estout和logout ssc install
  • CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN

    摘要 本文从网络体系结构的角度出发 提出了跨阶段局部网络 CSPNet 来解决以往工作中需要大量推理计算的问题 本文将问题归结为网络优化中的重复梯度信息 所提出的网络通过从网络阶段的开始和结束集成特征映射来注重梯度的可变性 CSPNet易于
  • Flink常用算子总结

    Streaming 算子 Map 将元素处理转换 再输出 map算子对一个DataStream中的每个元素使用用户自定义的Mapper函数进行处理 每个输入元素对应一个输出元素 最终整个数据流被转换成一个新的DataStream 输出的数据
  • 2020年黑苹果硬件配置推荐

    前言 黑苹果硬件配置推荐是一件众口难调的事情 但是为了更多的苹果Mac爱好者能够早日开心顺利的使用上macOS系统 mac996站长还是会200 的努力做好这件事情 也请大家大家多给一些支持和鼓励 注 本文仅针对黑苹果台式机做硬件推荐 不涉
  • 协同过滤算法的一些报错及python函数学习

    文章目录 1 cannot import name jaccard similarity score 2 DataFrame object has no attribute dtype 3 sort values 4 sort index
  • 2023前端面试题及答案整理(JS笔试题)

    JS笔试题 JS类型相关 typeof 没定义的变量会报错吗 typeof let定义了的呢 未声明的变量使用 typeof 返回字符串 undefined typeof 一个 let 定义的变量会因为暂时性死区报错 前提 let cons
  • go语言面试题

    文章目录 1 下面这段代码输出什么 2 下面代码输出什么 3 同级文件的包名不允许有多个 是否正确 4 下面的代码有什么问题 请说明 1 下面这段代码输出什么 func main count 0 for i range 256 struct
  • webpack 学习笔记(二) 打包 AMD模块时 js路径错误

    在使用webpack打包模块的时候遇到的问题 各种百度一直无法解决这个问题 真的对新手太不友好了 webpack 作为 一个模块打包工具 它可以将AMD CMD CommonJs ES6 模块都进行打包 这里推荐一个讲解模块比较详细的博客
  • 华为机考108题(c++)(1-16)

    HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 注 字符串末尾不以空格为结尾 输入描述 输入一行 代表要计算的字符串 非空 长度小于5000 输出描述 输出一个整数 表示输入字符
  • C语言算法--冒泡排序

    C语言算法 冒泡排序 1 什么是冒泡排序 冒泡排序是一种简单的排序算法 它通过比较相邻元素的大小 并根据需要交换它们的位置来排序数据 它的名称来自于越小的元素会慢慢 冒泡 到数组的开头 冒泡排序的基本思想是从数组的第一个元素开始 依次比较相
  • 修改本机localhost映射dns解析

    去C Windows System32 drivers etc目录下找到hosts文件 进入修改 最后一行添加127 0 0 1 空格 写自己的域名映射 增加后进入cmd命令行窗口输入ipconfig flushdns刷新dns解析 此后就
  • 开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

    不论您是一名开发者 架构师 CTO 如果您曾深度参与在微服务开发中 那么相信您一定有过开源微服务框架或体系选型的疑问 Apache Dubbo Spring Cloud gRPC 以及 Service Mesh 体系产品如 Istio 到底