Dubbo和Spring Cloud微服务架构对比

2023-11-17

Dubbo和Spring Cloud微服务架构对比



微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。


虽然微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影响力的开源微服务架构框架提供了微服务的关键思路,例如 Dubbo 和 Spring Cloud。


各大互联网公司也有自研的微服务框架,但其模式都与这二者相差不大。


微服务主要的优势


降低复杂度


将原来耦合在一起的复杂业务拆分为单个服务,规避了原本复杂度无止境的积累。


每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界;每个服务开发者只专注服务本身,通过使用缓存、DAL 等各种技术手段来提升系统的性能,而对于消费方来说完全透明。


可独立部署


由于微服务具备独立的运行进程,所以每个微服务可以独立部署。当业务迭代时只需要发布相关服务的迭代即可,降低了测试的工作量同时也降低了服务发布的风险。


容错


在微服务架构下,当某一组件发生故障时,故障会被隔离在单个服务中。比如通过限流、熔断等方式降低错误导致的危害,保障核心业务正常运行。


扩展


单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。


当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。


本文主要围绕微服务的技术选型、通讯协议、服务依赖模式、开始模式、运行模式等几方面来综合比较 Dubbo 和 Spring Cloud 这 2 种开发框架。


架构师可以根据公司的技术实力并结合项目的特点来选择某个合适的微服务架构平台,以此稳妥地实施项目的微服务化改造或开发进程。


核心部件


微服务的核心要素在于服务的发现、注册、路由、熔断、降级、分布式配置,基于上述几种必要条件对 Dubbo 和 Spring Cloud 做出对比。


总体架构


Dubbo 核心部件(如下图):

  • Provider:暴露服务的提供方,可以通过 jar 或者容器的方式启动服务。

  • Consumer:调用远程服务的服务消费方。

  • Registry:服务注册中心和发现中心。

  • Monitor:统计服务和调用次数,调用时间监控中心。(Dubbo 的控制台页面中可以显示,目前只有一个简单版本。)

  • Container:服务运行的容器。


Dubbo 总体架构


Spring Cloud总体架构(如下图):

  • Service Provider: 暴露服务的提供方。

  • Service Consumer:调用远程服务的服务消费方。

  • EureKa Server: 服务注册中心和服务发现中心。

Spring Cloud 总体架构


点评:从整体架构上来看,二者模式接近,都需要服务提供方,注册中心,服务消费方。


微服务架构核心要素


Dubbo 只是实现了服务治理,而 Spring Cloud 子项目分别覆盖了微服务架构下的众多部件,服务治理只是其中的一个方面。


Dubbo 提供了各种 Filter,对于上述中“无”的要素,可以通过扩展 Filter 来完善。例如:

  • 分布式配置:可以使用淘宝的 diamond、百度的 disconf 来实现分布式配置管理。

  • 服务跟踪:可以使用京东开源的 Hydra,或者扩展 Filter 用 Zippin 来做服务跟踪。

  • 批量任务:可以使用当当开源的 Elastic-Job、tbschedule。


点评:从核心要素来看,Spring Cloud 更胜一筹,在开发过程中只要整合 Spring Cloud 的子项目就可以顺利的完成各种组件的融合,而 Dubbo 却需要通过实现各种 Filter 来做定制,开发成本以及技术难度略高。


通讯协议


基于通讯协议层面对 2 种框架支持的协议类型以及运行效率方面进行比较。


支持协议


Dubbo


Dubbo 使用 RPC 通讯协议,提供序列化方式如下:

  • Dubbo:Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

  • RMI:RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。

  • Hessian:Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。

  • HTTP:采用 Spring 的 Http Invoker 实现。

  • Webservice:基于 CXF 的 frontend-simple 和 transports-http 实现。


Spring Cloud


Spring Cloud 使用 HTTP 协议的 REST API。


性能比较


使用一个 Pojo 对象包含 10 个属性,请求 10 万次,Dubbo 和 Spring Cloud 在不同的线程数量下,每次请求耗时(ms)如下:


说明:客户端和服务端配置均采用阿里云的 ECS 服务器,4 核 8G 配置,Dubbo 采用默认的 Dubbo 协议。


点评:Dubbo 支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜 Spring Cloud,如果对于系统的响应时间有严格要求,长链接更合适。


服务依赖方式


Dubbo


服务提供方与消费方通过接口的方式依赖,服务调用设计如下:

  • Interface 层:服务接口层,定义了服务对外提供的所有接口。

  • Molel 层:服务的 DTO 对象层。

  • Business层:业务实现层,实现 Interface 接口并且和 DB 交互。


因此需要为每个微服务定义各自的 Interface 接口,并通过持续集成发布到私有仓库中。调用方应用对微服务提供的抽象接口存在强依赖关系,开发、测试、集成环境都需要严格的管理版本依赖。


通过 maven 的 install & deploy 命令把 Interface 和 Model 层发布到仓库中,服务调用方只需要依赖 Interface 和 Model 层即可。


在开发调试阶段只发布 Snapshot 版本,等到服务调试完成再发布 Release 版本,通过版本号来区分每次迭代的版本。通过 xml 配置方式即可接入 Dubbo,对程序无入侵。

Dubbo 接口依赖方式


Spring Cloud


服务提供方和服务消费方通过 Json 方式交互,因此只需要定义好相关 Json 字段即可,消费方和提供方无接口依赖。通过注解方式来实现服务配置,对于程序有一定入侵。

点评:Dubbo 服务依赖略重,需要有完善的版本管理机制,但是程序入侵少。


而 Spring Cloud 通过 Json 交互,省略了版本管理的问题,但是具体字段含义需要统一管理,自身 Rest API 方式交互,为跨平台调用奠定了基础。


组件运行流程


Dubbo


下图中的每个组件都是需要部署在单独的服务器上,Gateway 用来接受前端请求、聚合服务,并批量调用后台原子服务。每个 Service 层和单独的 DB 交互。

Dubbo 组件运行流程


Dubbo 组件运行:

  • Gateway:前置网关,具体业务操作,Gateway 通过 Dubbo 提供的负载均衡机制自动完成。

  • Service:原子服务,只提供该业务相关的原子服务。

  • Zookeeper:原子服务注册到 ZK 上。

Spring Cloud 组件运行


Spring Cloud


Spring Cloud组件运行:

  • 所有请求都统一通过 API 网关(Zuul)来访问内部服务。

  • 网关接收到请求后,从注册中心(Eureka)获取可用服务。

  • 由 Ribbon 进行均衡负载后,分发到后端的具体实例。

  • 微服务之间通过 Feign 进行通信处理业务。


点评:业务部署方式相同,都需要前置一个网关来隔绝外部直接调用原子服务的风险。


Dubbo 需要自己开发一套 API 网关,而 Spring Cloud 则可以通过 Zuul 配置即可完成网关定制。使用方式上 Spring Cloud 略胜一筹。


微服务架构组成以及注意事项


到底使用是 Dubbo 还是 Spring Cloud 并不重要,重点在于如何合理的利用微服务。


下面是一张互联网通用的架构图,其中每个环节都是微服务的核心部分。

架构分解:

  • 网关集群:数据的聚合、实现对接入客户端的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制等。

  • 业务集群:一般情况下移动端访问和浏览器访问的网关需要隔离,防止业务耦合。

  • Local Cache:由于客户端访问业务可能需要调用多个服务聚合,所以本地缓存有效的降低了服务调用的频次,同时也提示了访问速度。本地缓存一般使用自动过期方式,业务场景中允许有一定的数据延时。

  • 服务层:原子服务层,实现基础的增删改查功能,如果需要依赖其他服务需要在 Service 层主动调用。

  • Remote Cache:访问 DB 前置一层分布式缓存,减少 DB 交互次数,提升系统的TPS。

  • DAL:数据访问层,如果单表数据量过大则需要通过 DAL 层做数据的分库分表处理。

  • MQ:消息队列用来解耦服务之间的依赖,异步调用可以通过 MQ 的方式来执行。

  • 数据库主从:服务化过程中必经的阶段,用来提升系统的 TPS。


注意事项:

  • 服务启动方式建议使用jar方式启动,启动速度快,更容易监控。

  • 缓存、缓存、缓存,系统中能使用缓存的地方尽量使用缓存,通过合理的使用缓存可以有效的提高系统的TPS。

  • 服务拆分要合理,尽量避免因服务拆分而导致的服务循环依赖。

  • 合理的设置线程池,避免设置过大或者过小导致系统异常。


总结


Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司;只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主。


虽然阿里内部原因 Dubbo 曾经一度暂停维护版本,但是框架本身的成熟度以及文档的完善程度,完全能满足各大互联网公司的业务需求。


如果我们使用配置中心、分布式跟踪这些内容都需要自己去集成,这样无形中增加了使用 Dubbo 的难度。


Spring Cloud 是大名鼎鼎的 Spring 家族的产品, 专注于企业级开源框架的研发。


Spring Cloud 自从发布到现在,仍然在不断的高速发展,几乎考虑了服务治理的方方面面,开发起来非常的便利和简单。


Dubbo 于 2017 年开始又重启维护,发布了更新后的 2.5.7 版本,而 Spring Cloud 更新的非常快,目前已经更新到 Finchley.M2。


因此,企业需要根据自身的研发水平和所处阶段选择合适的架构来解决业务问题,不管是 Dubbo 还是 Spring Cloud 都是实现微服务有效的工具。

微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo和Spring Cloud微服务架构对比 的相关文章

  • Windows 10环境下安装MySQL

    MySQL 是最流行的关系型数据库管理系统 在 WEB 应用方面 MySQL 是最好的 RDBMS应用软件之一 今天以MySQL5 5版本为例讲解安装步骤 1 找到本地安装包 并运行文件 2 点击Next安装 3 同意协议 直接选择下一步
  • 内网情况下 MAVEN不加载本地库的问题

    第一种解决方式 settings gt maven的配置里勾选 work offline即可解决问题 在这里插入图片描述 在这里插入图片描述 https img blog csdnimg cn cebc5829e3014aa3a3dc4f9
  • 面经分享-阿里、网易实习生面试题(附答案)

    4 23更新 已收到网易短信offer 阿里面试 先说下阿里吧 前段时间找师兄内推了阿里巴巴实习生 特此记录一下面试的感受 阿里确实是技术的圣地 目前为止我遇到的面试官都很nice 无论是语气还是技术都让人佩服 我就根据印象回忆一下面试的情

随机推荐

  • 使用ajax从数据库动态加载下拉框(select)数据,可编辑下拉框。

    div span style margin left 100px width 18px span div
  • JavaScript编程语言-代码结构,js的特性,调试,资源面板,控制台,代码风格,语法,花括号,

    JavaScript 特性 本章简要回顾我们到现在为止学到的 JavaScript 特性 并特别注意了一些细节 代码结构 语句用分号分隔 alert Hello alert World 通常 换行符也被视为分隔符 因此下面的例子也能正常运行
  • 密钥交换算法DH(Java实现)

    密钥交换算法 DH 1 简述 1976年 W Diffie和M Hellman在发表的论文中提出了公钥加密算法思想 但当时并没有给出具体的实施方案 原因在于没有找到单向函数 也就是消息摘要算法 但在该论文中给出了通信双方通过信息交换协商密钥
  • Linux删除任务未执行排查解决

    写了一个定时删除日志的脚本 用于删除超过30天的日志 到了指定的时间 发现定时任务并没有执行 find usr local tomcat logs mtime 30 name log exec rm rf 百思不得其解之际 将命令逐段执行f
  • Shell脚本编写教程【一】——Shell 变量

    Shell脚本编写教程 一 Shell 变量 目录 https blog csdn net shn111 article details 131590488 参考教程 https www runoob com linux linux she
  • github使用入门 之GIT GUI Windows版

    申明下是原创 这二天网上也看了不少关于github使用的文章 github对代码管理也开始用起来了 这篇给github新手看 大牛们请跳过 github说白了就是版本管理库 最常用的就是程序代码管理了 不过我也在github上看到有人在用它
  • python or的用法_python and or用法详解

    and 和 or 是python的两个逻辑运算符 可以使用and or来进行多个条件内容的判断 下面通过代码简单说明下and or的用法 1 or 当有一个条件为真时 该条件即为真 逻辑图如下 测试代码如下 a raw input plea
  • ipconfig命令

    ipconfig命令 ipconfig release 释放 IP 地址租约 ipconfig flushdns 清除本地 DNS 缓存 ipconfig displaydns 显示本地 DNS 内容 ipconfig registerdn
  • SQL知识整理一:触发器、存储过程、变量表、临时表

    pre class javascript dd2 draggable proxy clone 一 触发器 create trigger tr name on table view for after instead of update in
  • 大数据课程L8——网站流量项目的SparkStreaming整合代码

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 掌握网站流量项目的工程Pom配置文件代码 掌握网站流量项目的SparkStreaming整合Kafka代码 掌握网站流量项目的SparkStreaming整合
  • 电机高频注入原理_STM32 TALK

    电机在各种应用中 都是最广泛 最核心的存在 随着传统应用转变翻新 新兴应用层出不穷 这几年的电机界 如果不会FOC 都不好意思说自己是做电机的 八月底 在电堂联合ST举办的 STM32 TALK 电机控制私享会 上 艾思科技作为STM32的
  • 图像仿射变换原理1:齐次坐标来龙去脉详解

    老猿Python博文目录 https blog csdn net LaoYuanPython 仿射变换博文传送门 带星号的为付费专栏文章 图像仿射变换原理1 齐次坐标来龙去脉详解 图像仿射变换原理2 矩阵变换 线性变换和图像线性变换矩阵 图
  • [刷题记录]牛客面试笔刷TOP101

    牛客笔试算法必刷TOP101系列 每日更新中 主要是记录自己的刷题 所以描述的可能不是很清楚 但如果刚好能帮助到你就更好了 后续后头复习的时候 记得是看正解啊 别对着错的例子傻傻看了 目录 1 合并有序链表2023 9 3 2 链表是否有环
  • 第14.18节 爬虫实战4: request+BeautifulSoup+os实现利用公众服务Wi-Fi作为公网IP动态地址池

    写在前面 本文相关方法为作者独创 仅供参考学习爬虫技术使用 请勿用作它途 禁止转载 一 引言 在爬虫爬取网页时 有时候希望不同的时候能以不同公网地址去爬取相关的内容 去网上购买地址资源池是大部分人员的选择 老猿所在的环境有电信运输商部署的对
  • [Python学习] 专题五.列表基础知识 二维list排序、获取下标和处理txt文本实例

    通常测试人员或公司实习人员需要处理一些txt文本内容 而此时使用Python是比较方便的语言 它不光在爬取网上资料上方便 还在NLP自然语言处理方面拥有独到的优势 这篇文章主要简单的介绍使用Python处理txt汉字文字 二维列表排序和获取
  • 橘子学java之java中的协程

    一 关于协程 最近jdk19上了 java开始支持虚拟线程了 也就是所谓的协程 java的协程库是官方是这个https openjdk org projects loom 我指的是oracle的java 阿里那个well的早就支持了 只是官
  • stm32——Fatfs文件系统读写文件

    因项目需求需要移植fatfs文件系统 参考了正点原子的战舰例程 使用mcu为stm32f103zet6 spi的sd卡模块 8Gsd卡 例程为mini板 mcu stm32f103rct6 的 ALIENTEK MINISTM32 实验29
  • 【详解】指令系统中跳转指令与OF,SF,CF,ZF的关系

    目录 无符号跳转表示法 有符号跳转表示法 无符号跳转表示法详解 有符号跳转表示法详解 无符号跳转表示法 小于 大于等于 小于等于 大于 有符号跳转表示法 小于 大于等于 小于等于 大于 无符号跳转表示法详解 我在学习这部分的最大的困惑点就是
  • TensorboardX和Tensorboard的介绍及使用

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 Tensorboard是什么 conda环境安装 二 Tensorboard可供显示的内容 三 Tensorboard使用步骤 1 标量SCALARS 2 图片
  • Dubbo和Spring Cloud微服务架构对比

    Dubbo和Spring Cloud微服务架构对比 微服务架构是互联网很热门的话题 是互联网技术发展的必然结果 它提倡将单一应用程序划分成一组小的服务 服务之间互相协调 互相配合 为用户提供最终价值 虽然微服务架构没有公认的技术标准和规范或