Dubbo和Spring Cloud微服务架构对比

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

目录

微服务主要的优势

降低复杂度

可独立部署

容错

扩展

核心部件

总体架构

Dubbo 核心部件

Spring Cloud总体架构

微服务架构核心要素

通讯协议

支持协议

Dubbo

Spring Cloud

性能比较

服务依赖方式

Dubbo

Spring Cloud

组件运行流程

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 都是实现微服务有效的工具。

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


---------------------
作者:豆奶快攻
来源:CSDN
原文:https://blog.csdn.net/zhangweiwei2020/article/details/78646252
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《ABP Framework 极速开发》 - 教程首发

‍写在发布之前强烈建议每一位小伙伴都应该好好看看 ABP Framework 官方文档,可能有很多的小伙伴跟我刚开始的感觉一样“一看文档深似海”,看完文档之后,想要上手却找不着头绪。本套教程写作的目的之一是为初学者提供一条相对简洁的快速上手路…

智能家居系统结构标准化

版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/8490423.html作者:窗户QQ:6679072E-mail:6679072qq.com0 引 言 智能家居是指利用先进的…

洛谷 P3391 文艺平衡树

题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --by洛谷…

JSONObject中optString和getString等的区别

2019独角兽企业重金招聘Python工程师标准>>> 同事在看到我写的解析数据代码后,告诉我optString比getString好用,optString不会抛异常,而getString会抛异常,自己是将信将疑,就说,回去后我查查资料…

Lombok插件安装(IDEA)、配置jar包、使用

点击进入Lombok官网下载Lombok jar包 使用Lombok可能需要注意的地方 (1)当你的IDE是Idea时,要注意你的Idea是支持Lombok的,如果不支持请更换高版本尝试(这里采用2018 3.3)。 (2)在使…

Blazor University (40)JavaScript 互操作 —— 传递 HTML 元素引用

原文链接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/passing-html-element-references/传递 HTML 元素引用源代码[1]在编写 Blazor 应用程序时,不鼓励对文档对象模型 (DOM) 进行操作,因为它可能会干…

RabbitMQ+PHP 教程六(RPC)

(using php-amqplib) 前提必读 本教程假设RabbitMQ是安装在标准端口上运行(5672)。如果您使用不同的主机、端口或凭据,则连接设置需要调整。 如果您在本教程中遇到困难,可以通过邮件列表与我们联系。 开始 在第二个教程中&#xf…

TKMybatis 介绍和使用

目录 一、什么是 TKMybatis 二、TKMybatis 使用 2.1 Springboot 项目中加入依赖 2.2 使用讲解 2.2.1 实体类中使用 2.2.2 dao中使用 2.2.3 Service 层中使用 2.3 实际案例 2.3.1 dao 层使用 2.3.2 service 层使用 一、什么是 TKMybatis TKMybatis 是基于 Mybatis 框…

WinForm(三)揭开可视化控件的面纱

WinForm所见即所得的UI设计框架,开发效率确实有所提升,同时降低了编程门槛,让WinForm更普及。拖拖拽拽就能设计出一个界面,那么我们拖拽的这些东西是什么?它们是什么原理?。WinForm我觉得很好的一点是&…

RestTemplate 详解

在项目中,当我们需要远程调用一个 HTTP 接口时,我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。Spring 官网对它的介绍如下: RestTemplate: The original Spring REST client with a synchronous, template met…

初识Spark2.0之Spark SQL

内存计算平台Spark在今年6月份的时候正式发布了spark2.0,相比上一版本的spark1.6版本,在内存优化,数据组织,流计算等方面都做出了较大的改变,同时更加注重基于DataFrame数据组织的MLlib,更加注重机器学习整…

ABP详细教程——模块类

概述模块化是ABP vNext的最大亮点,也是ABP vNext框架的核心,而模块类是ABP vNext框架模块化的核心要素。这一章节,我就从模块类的用法、运行机制、源代码等层面,带大家详细了解ABP vNext的模块类。用法在ABP的约定中,每…

[转]Eureka工作原理

目录 Eureka 工作原理 Eureka 核心概念 自我保护机制 Eureka 集群原理 Eurka 工作流程 总结 Eureka 工作原理 上节内容为大家介绍了,注册中心 Eureka 产品的使用,以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka&…

重谈联想5G编码投票事件

此前,司马南谈了联想好几个问题,其中最尖锐的要属国有资产流失,这是联想管理层无法回避的死穴。不过,司马南批判联想5G投票背刺H公司,这基本就是造谣了。当年,媒体把编码投票炒作的很厉害,抨击联…

JStorm2.1.1集群的安装和使用

为什么80%的码农都做不了架构师?>>> JStorm2.1.1集群的安装和使用 Storm是一个免费开源、分布式、高容错的实时计算系统,而JStorm是阿里巴巴开源的基于Storm采用Java重写的一套分布式实时流计算框架,在性能和支持的集群规模上做了…

Hystrix 原理

Hystrix是什么? Hystrix是Netflix开源库,这是一个针对分布式系统的延迟和容错库。 Hystrix 供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布…

「深度」无人机实名制政策特稿|市场看好、资本关注,“反黑飞”正在崛起

从政策和需求来看,“反黑飞”越来越重要,市场也正在不断崛起。 对于大多数人来说,今天是最适合明目张胆“装嫩”的六一儿童节。不过,在无人机厂商和无人机玩家的眼里,今天是无人机实名制政策正式实施的日子。 近年来&…

在navicat中新建数据库

前言: 在本地新建一个名为editor的数据库; 过程: 1.; 2.选择:utf8mb4 -- UTF-8 Unicode字符集,原因在于:utf8mb4兼容utf8,且比utf8能表示更多的字符。,而且它支持表情符号…

MASA Stack 第三期社区例会

MASA Blazor 0.5.0发版内容功能Autocomplete:支持通过设置AutoSelectFirst参数开启自动选择第一项的功能,支持CacheItems参数,增强使用上下键的用户体验。BottomNavigation::一个替代侧边栏的新组件。它主要用于移动应…

[转]高并发架构设计之--「服务降级」、「服务限流」与「服务熔断」

目录 服务降级 1 、简介 2 、使用场景 3 、核心设计 3.1 分布式开关 3.2 自动降级分类 3.3 配置中心 3.4 处理策略 3.5 降级分类 3.6 服务降级要考虑的问题 4 、高级特性 4.1 分级降级 4.2 降级权值 5 、总结与展望 服务限流 一、为什么要做服务限流设计&…