阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

本文主要围绕微服务的技术选型、通讯协议、服务依赖模式、开始模式、运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架。架构师可以根据公司的技术实力并结合项目的特点来选择某个合适的微服务架构平台,以此稳妥地实施项目的微服务化改造或开发进程。

微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标准和规范或者草案,但业界已经有一些很有影响力的开源微服务架构框架提供了微服务的关键思路,例如Dubbo和Spring Cloud。各大互联网公司也有自研的微服务框架,但其模式都于这二者相差不大。

微服务主要的优势如下:

1、降低复杂度

将原来偶合在一起的复杂业务拆分为单个服务,规避了原本复杂度无止境的积累。每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。每个服务开发者只专注服务本身,通过使用缓存、DAL等各种技术手段来提升系统的性能,而对于消费方来说完全透明。

2、可独立部署

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

3、容错

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

4、扩展

单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。

本文主要围绕微服务的技术选型、通讯协议、服务依赖模式、开始模式、运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架。架构师可以根据公司的技术实力并结合项目的特点来选择某个合适的微服务架构平台,以此稳妥地实施项目的微服务化改造或开发进程。

一、核心部件

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

1、总体架构

  • Dubbo 核心部件(如下图):
阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较
  • Provider: 暴露服务的提供方,可以通过jar或者容器的方式启动服务
  • Consumer:调用远程服务的服务消费方。
  • Registry: 服务注册中心和发现中心。
  • Monitor: 统计服务和调用次数,调用时间监控中心。(dubbo的控制台页面中可以显示,目前只有一个简单版本)
  • Container:服务运行的容器。

▲Dubbo 总体架构

Spring Cloud总体架构如下图

  • Service Provider: 暴露服务的提供方。
  • Service Consumer:调用远程服务的服务消费方。
  • EureKa Server: 服务注册中心和服务发现中心。
阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

▲Spring Cloud总体架构

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

2、微服务架构核心要素

Dubbo只是实现了服务治理,而Spring Cloud子项目分别覆盖了微服务架构下的众多部件,而服务治理只是其中的一个方面。Dubbo提供了各种Filter,对于上述中“无”的要素,可以通过扩展Filter来完善。

例如

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

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

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

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

二、通讯协议

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

(一)、支持协议

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

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

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

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

http:采用Spring的HttpInvoker实现

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

2、Spring Cloud:Spring Cloud 使用HTTP协议的REST API

(二)、性能比较

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

阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

说明:客户端和服务端配置均采用阿里云的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,对程序无入侵。

阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

▲Dubbo接口依赖方式

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

阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

点评:Dubbo服务依赖略重,需要有完善的版本管理机制,但是程序入侵少。而Spring Cloud通过Json交互,省略了版本管理的问题,但是具体字段含义需要统一管理,自身Rest API方式交互,为跨平台调用奠定了基础。

四、组件运行流程

阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

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

▲Dubbo组件运行流程

  • gateWay:前置网关,具体业务操作,gateWay通过dubbo提供的负载均衡机制自动完成
  • Service:原子服务,只提供该业务相关的原子服务
  • Zookeeper:原子服务注册到zk上
阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

▲Spring Cloud 组件运行

Spring Cloud

  • 所有请求都统一通过 API 网关(Zuul)来访问内部服务。
  • 网关接收到请求后,从注册中心(Eureka)获取可用服务。
  • 由 Ribbon 进行均衡负载后,分发到后端的具体实例。
  • 微服务之间通过 Feign 进行通信处理业务。

点评:业务部署方式相同,都需要前置一个网关来隔绝外部直接调用原子服务的风险。Dubbo需要自己开发一套API 网关,而Spring Cloud则可以通过Zuul配置即可完成网关定制。使用方式上Spring Cloud略胜一筹。

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

到底使用是dubbo还是Spring Cloud其实并不重要,重点在于如何合理的利用微服务。下面是一张互联网通用的架构图,其中每个环节都是微服务的核心部分。

阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

(一)、架构分解

  • 网关集群:数据的聚合、实现对接入客户端的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制等
  • 业务集群:一般情况下移动端访问和浏览器访问的网关需要隔离,防止业务耦合
  • 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.6版本,而Spring Cloud更新的非常快,目前已经更新到Finchley.M2。因此,企业需要根据自身的研发水平和所处阶段选择合适的架构来解决业务问题,不管是Dubbo还是Spring Cloud都是实现微服务有效的工具。


money.jpg

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

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

相关文章

数码摄影(扫街)

快门速度: 快门速度是曝光控制的一个重要变量,能够控制光线进入的多少。 快门的速度越快,时间越短,通过的光线就越少,反之,则越多。 在很好光线下,1/125s就能清晰地捕捉到行走中的人物。 阴天…

论文浅尝 | 让“演进知识图谱”带你“瞻前顾后”看世界

本文转载自公众号:爱思美谱。 指导老师 | 傅洛伊 王新兵核心技术成员 | 刘佳琪导读在前面几期的内容中,小编已经为大家介绍了知识图谱的产生历史和基本概念。相信大家已经对知识图谱强大的信息结构化能力有所了解。但是,目前的大部分知识…

做过leader,会数仓,项目经验丰富,能值多少钱?

有个朋友,上个月准备从 Java 转做大数据,一个月过去了,一份面试都没约到,来问我怎么回事。我一看简历,期望年薪 40w,深度也不够,要大项目也没有。我们做大数据的,虽说是薪资高&#…

LeetCode 98. 验证二叉搜索树(中序遍历)

文章目录1. 题目信息2. 解题2.1 递归中序2.2 非递归中序1. 题目信息 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和…

阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群管理 分布式应用配置项的管理等 Zookeeper已经成为Hadoop生态系统…

GNN学习一

一、为什么使用图卷积 传动的深度学习方法,比如卷积网络,效果很好,但是它研究的对象是Euclidean data,这种数据的特征就是有规则的空间结构,比如图片是规则的正方形格子,比如语音是规则的一维序列。这些数…

禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本

文 | 苏剑林单位 | 追一科技编 | 兔子酱不管是打比赛、做实验还是搞工程,我们经常会遇到训练集与测试集分布不一致的情况。一般来说我们会从训练集中划分出来一个验证集,通过这个验证集来调整一些超参数[1],比如控制模型的训练轮数…

论文浅尝 | 最新10篇《知识图谱》论文推荐(ICML, CVPR, ACL, KDD, IJCAI 2019)

本文转载自公众号:专知。【导读】知识图谱一直是研究热点,研究者近年来广泛关注知识图谱嵌入(Knowledge Graph Embedding,简称KGE)方法,在保留语义的同时,将知识图谱中的实体和关系映射到连续的…

详解RPC远程调用和消息队列MQ的区别

谈到分布式架构,就不得不谈到分布式架构的基石RPC。 什么是RPC RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制。 RPC服务框架有哪些 知名度较高的有Thrift&#x…

GNN学习二

基于频谱的图卷积和基于空间的图卷积 (在图上做傅里叶变换?) 图时间空间网络-交通上车流速度和红绿灯

技术动态 | eBay开源分布式知识图谱存储Beam,支持类SPARQL查询

本文转载自公众号:AI前线。作者 | Diego Ongaro,Simon Fell 译者 | 盖磊 编辑 | Natalie AI 前线导读:eBay 工程人员于 5 月 1 日在 官方技术博客 上发布了开源的分布式知识图谱存储 Beam,Beam 实现了事实数据的 RDF 存储&#xf…

2020国内互联网公司的开源项目及Github地址部分汇总

2020国内互联网公司的开源项目及Github地址部分汇总 一、Alibaba 阿里巴巴 阿里巴巴的开源项目很多,都说国内Java公司的技术架构大部分来自阿里系,而且还有很多重量级的项目,例如LVS、Tengine,或者很有实践价值的中间件&#xf…

端到端问答新突破:百度提出RocketQA,登顶MSMARCO榜首

源 | 机器之心开放域问答(Open-domain QA)一直是自然语言处理领域的重要研究课题。百度从面向端到端问答的检索模型出发,提出了RocketQA训练方法,大幅提升了对偶式检索模型的效果,为实现端到端问答迈出了重要的一步。R…

深度剖析RPC框架的核心设计

做过分布式服务端的Java工程师,随着对技术底层的认知的加深,都会或多或少的会去想: 一个RPC框架需要考虑的问题有哪些,如何来解决? 下面我们围绕RPC通信框架,从如何实现这个角度做一个剖析,以及每个环节能…

LeetCode 200. 岛屿数量(图的遍历)

文章目录1. 题目信息2. 解题2.1 DFS2.2 BFS1. 题目信息 给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你…

论文浅尝 | 引入“引用”的语言模型

笔记整理:杨帆,浙江大学硕士,研究方向知识图谱.论文链接:https://arxiv.org/pdf/1611.01628.pdf动机Referring expression(RE)在自然语言中十分常见,并且在信息交流中扮演了十分重要的角色&…

短文本语义匹配/文本相似度框架(SimilarityNet, SimNet),基于bow_pairwise模式及框架原理介绍

用PaddlePaddle实现段文本语义匹配Simnet模型 https://aistudio.baidu.com/aistudio/projectdetail/124373 Hinge loss: https://blog.csdn.net/hustqb/article/details/78347713 原文链接:https://blog.csdn.net/qq_33187136/article/details/10677043…

卖萌屋招人啦!

萌萌的小夕突然出现~这次来寻找小伙伴一起建设小屋啦!本期提供四种通道可直达卖萌屋核心腹地!小编/作者日常:发现,拍脑袋,然后写写写外部投稿的审核与编辑基本条件:对NLP、CV、IR、Rec、Ads、DM…

LeetCode 36. 有效的数独(哈希)

文章目录1. 题目信息2. 解题2.1 暴力3次遍历查找2.2 一次遍历查找1. 题目信息 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线…

如何从0到1设计一个类Dubbo的RPC框架

之前分享了如何从0到1设计一个MQ消息队列,今天谈谈“如何从0到1设计一个Dubbo的RPC框架”,重点考验: 你对RPC框架的底层原理掌握程度。 以及考验你的整体RPC框架系统设计能力。 RPC和RPC框架 1.RPC(Remote Procedure Call&#x…