微服务Dubbo和SpringCloud架构设计、优劣势比较

一、微服务介绍

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

1.1、微服务主要的优势

1、降低复杂度
       将原来偶合在一起的复杂业务拆分为单个服务,规避了原本复杂度无止境的积累。每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。每个服务开发者只专注服务本身,通过使用缓存、DAL等各种技术手段来提升系统的性能,而对于消费方来说完全透明。
2、可独立部署
       由于微服务具备独立的运行进程,所以每个微服务可以独立部署。当业务迭代时只需要发布相关服务的迭代即可降低了测试的工作量同时也降低了服务发布的风险
3、容错
       在微服务架构下,当某一组件发生故障时,故障会被隔离在单个服务中。 通过限流、熔断等方式降低错误导致的危害,保障核心业务正常运行。
4、扩展
       单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。

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

二、核心部件

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

2.1、总体架构

Dubbo 总体架构:

(1)、Provider: 暴露服务的提供方,可以通过jar或者容器的方式启动服务
(2)、Consumer:调用远程服务的服务消费方
(3)、Registry: 服务注册中心和发现中心
(4)、Monitor: 统计服务和调用次数,调用时间监控中心。(dubbo的控制台页面中可以显示,目前只有一个简单版本)
(5)、Container:服务运行的容器。

Spring Cloud总体架构:

(1)、Service Provider: 暴露服务的提供方。
(2)、Service Consumer:调用远程服务的服务消费方。
(3)、EureKa Server: 服务注册中心和服务发现中心。 

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

2.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种框架支持的协议类型以及运行效率方面进行比较;

2.1、支持协议

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

(1)、dubbo:Dubbo缺省协议采用单一长连接NIO异步通讯适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
(2)、rmi:RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接JDK标准序列化方式
(3)、hessian:Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现
(4)、http:采用Spring的HttpInvoker实现
(5)、webservice:基于CXF的frontend-simple和transports-http实现

Spring Cloud

(1)、Spring Cloud 使用HTTP协议的REST API

2.2、性能比较

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

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

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

三、服务依赖方式

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

(1)、interface层:服务接口层,定义了服务对外提供的所有接口
(2)、molel层:服务的DTO对象层
(3)、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方式交互,为跨平台调用奠定了基础。

四、组件运行流程

4.1、Dubbo组件运行流程

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

 (1)、gateWay:前置网关,具体业务操作,gateWay通过dubbo提供的负载均衡机制自动完成
 (2)、service:原子服务,只提供该业务相关的原子服务
 (3)、zookeeper:原子服务注册到zk上

4.2、Spring Cloud 组件运行流程

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

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

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

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

5.1、架构分解

(1)、网关集群:数据的聚合,实现对接入客户端的身份认证防报文重放防数据篡改、功能调用的业务鉴权响应数据的脱敏流量与并发控制
(2)、业务集群:一般情况下移动端访问和浏览器访问的网关需要隔离,防止业务耦合
(3)、Local Cache:由于客户端访问业务可能需要调用多个服务聚合,所以本地缓存有效的降低了服务调用的频次,同时也提示了访问速度。本地缓存一般使用自动过期方式,业务场景中允许有一定的数据延时。
(4)、服务层:原子服务层,实现基础的增删改查功能,如果需要依赖其他服务需要在Service层主动调用
(5)、Remote Cache:访问DB前置一层分布式缓存,减少DB交互次数,提升系统的TPS
(6)、DAL:数据访问层,如果单表数据量过大则需要通过DAL层做数据的分库分表处理。
(7)、MQ:消息队列用来解耦服务之间的依赖,异步调用可以通过MQ的方式来执行
(8)、数据库主从:服务化过程中毕竟的阶段,用来提升系统的TPS

5.2、注意事项

 (1)、服务启动方式建议使用jar方式启动,启动速度快,更容易监控
 (2)、缓存,系统中能使用缓存的地方尽量使用缓存,通过合理的使用缓存可以有效的提高系统的TPS
 (3)、服务拆分要合理,尽量避免因服务拆分而导致的服务循环依赖
 (4)、合理的设置线程池,避免设置过大或者过小导致系统异常

六、总结

       Dubbo出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司;只需要通过spring配置的方式即可完成服务化,对于应用无入侵。设计的目的还是服务于自身的业务为主。虽然阿里内部原因dubbo曾经一度暂停维护版本,但是框架本身的成熟度以及文档的完善程度,完全能满足各大互联网公司的业务需求。如果我们需要使用配置中心、分布式跟踪这些内容都需要自己去集成,这样无形中增加了使用 Dubbo 的难度。

       Spring Cloud 是大名鼎鼎的 Spring 家族的产品, 专注于企业级开源框架的研发。 Spring Cloud 自从发展到现在,仍然在不断的高速发展,几乎考虑了服务治理的方方面面,开发起来非常的便利和简单。

       Dubbo于2017年开始又重启维护,发布了更新后的2.5.6版本,而Spring Cloud更新的非常快,目前已经更新到Finchley.M2。因此,企业需要根据自身的研发水平和所处阶段选择合适的架构来解决业务问题,不管是Dubbo还是Spring Cloud都是实现微服务有效的工具。

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

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

相关文章

搜索引擎核心技术与算法 —— 词项词典与倒排索引优化

一只小狐狸带你解锁NLP/ML/DL秘籍作者:QvQ老板~我会写倒排索引啦!我要把它放进咱们自研搜索引擎啦!我呸!你这种demo级代码,都不够当单元测试的!嘤嘤嘤,课本上就是这样讲的呀?!来来&…

论文浅尝 | Distant Supervision for Relation Extraction

Citation: Ji,G., Liu, K., He, S., & Zhao, J. (2017). Distant Supervision for RelationExtraction with Sentence-Level Attention and Entity Descriptions. Ai,3060–3066.动机关系抽取的远程监督方法通过知识库与非结构化文本对其的方式,自动标注数据&am…

使用sklearn做单机特征工程

目录 1 特征工程是什么?2 数据预处理  2.1 无量纲化    2.1.1 标准化    2.1.2 区间缩放法    2.1.3 标准化与归一化的区别  2.2 对定量特征二值化  2.3 对定性特征哑编码  2.4 缺失值计算  2.5 数据变换  2.6 回顾3 特征选择  3.1 Filte…

【JavaWeb】JDBC的基本操作和事务控制+登录和转账案例

1 JDBC操作数据库 1.1 连接数据库 首先导入jar包到lib public class JdbcDemo1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取数据库连接对象Connection…

Restful、SOAP、RPC、SOA、微服务之间的区别

一、介绍Restful、SOAP、RPC、SOA以及微服务 1.1、什么是Restful? Restful是一种架构设计风格,提供了设计原则和约束条件,而不是架构,而满足这些约束条件和原则的应用程序或设计就是 Restful架构或服务。 主要的设计原则&#xf…

详解深度语义匹配模型DSSM和他的兄弟姐妹

一只小狐狸带你解锁NLP/ML/DL秘籍正文作者:郭耀华正文来源:https://www.cnblogs.com/guoyaohua/p/9229190.html前言在NLP领域,语义相似度的计算一直是个难题:搜索场景下Query和Doc的语义相似度、feeds场景下Doc和Doc的语义相似度、…

行业新闻 | 阿里发力知识图谱研究 悉数囊括顶尖学者探讨合作

12 月 20 日,阿里巴巴联合中国中文信息学会语言与知识计算专委会(KG专委)举办的知识图谱研讨会在杭州召开。研讨会由阿里巴巴集团副总裁墙辉(花名:玄难)主持,国内知识图谱领域多位顶级专家参加此次研讨会。在阿里巴巴持…

【JavaWeb】JDBC优化 之 数据库连接池、Spring JDBC

1 数据库连接池 为什么要使用数据库连接池? 数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接使用连接池可以提高对数据库连接资源的管理节约资源且高效 概念:数据库连接池其实就是一个容器,存放数据库连接的容器…

Java远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背…

CUDA层硬件debug之路

前记 众所周知,夕小瑶是个做NLP的小可爱。 虽然懂点DL框架层知识,懂点CUDA和底层,但是我是做算法的哎,平时debug很少会遇到深度学习框架层的bug(上一次还是三年前被pytorch坑),更从没遇到过CUDA…

研讨会 | 知识图谱大咖云集阿里,他们都说了啥

前言12月20日,由阿里巴巴联合中国中文信息学会语言与知识计算专委会(KG专委)举办的知识图谱研讨会在杭州召开。研讨会由阿里巴巴集团副总裁墙辉(玄难)主持,知识图谱领域国内知名专家参与了此次研讨。在阿里巴巴持续发力知识图谱这…

置信区间、P值那点事

在假设检验中,我们常常看到跟P值形影不离的一对区间值, 就是大名鼎鼎的置信区间了。 这置信区间和P值是怎么得来的,我想大多数盆友都不会有什么直观的概念,只会注意P值是否小于0.05或者0.01(根据显著性水平确定)。为了给大伙说清楚…

【JavaWeb】HTML+CSS

1 Web概念概述 JavaWeb是使用Java语言开发基于互联网的项目 软件架构 cs架构:优点【资源加载快、用户体验好】、缺点【安装、部署、维护麻烦】bs架构:优点【开发、安装、部署、维护简单】、缺点【应用过大,用户体验会受影响、对硬件有要求…

深度推荐系统2019年度阅读收藏清单

一只小狐狸带你解锁NLP/ML/DL秘籍正文来源:深度传送门今天是2020年新年工作第一天,祝大家开工大吉,新的一年一切顺利,诸事躺赢!深度传送门也跟很多号主一样,花了点时间分类整理了一下阅读清单(包…

手把手教你协方差分析的SPSS操作

手把手教你协方差分析的SPSS操作 2017-04-27 手把手教你协方差分析的SPSS操作 一、问题与数据 某研究将73例脑卒中患者随机分为现代理疗组(38例)和传统康复疗法组(35例)进行康复治疗,采用Fugl-Meyer运动功能评分法&a…

我对DevOps的理解

一、DevOps的意图 究竟什么是DevOps? 要想回答这个问题,首先要明确DevOps这个过程参与的人员是谁?即开发团队和IT运维团队!那么,DevOps的意图是什么呢?即在两个团队之间,建立良好的沟通和协作,…

【JavaWeb】JavaScript基础篇+高级篇

文章目录1 介绍2 ECMAScript2.1 基本语法2.2 基本对象3 BOM3.1 window窗口对象3.2 location地址栏对象3.3 history历史记录对象4 DOM4.1 概念4.2 核心DOM4.2.1 Document对象4.2.2 Element对象4.2.3 节点对象4.2.4 案例:动态表格4.2.5 内容切换4.2.6 样式设置5 事件5…

万万没想到,我的炼丹炉玩坏了

一只小狐狸带你解锁NLP/ML/DL秘籍作者:夕小瑶前记众所周知,夕小瑶是个做NLP的小可爱。虽然懂点DL框架层知识,懂点CUDA和底层,但是我是做算法的哎,平时debug很少会遇到深度学习框架层的bug(上一次还是三年前…

Reactor三种线程模型与Netty线程模型

一、Reactor三种线程模型 1.1、单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接、读、写、异常、关闭等等。单线程Reactor模型基于同步事件分离器来分发事件,这个同步事件分离器,可以看做是一个单线程的while循环。下图描述了…

图解Transformer-一篇文章看懂transformer

原文标题:The Illustrated Transformer 原文链接:https://jalammar.github.io/illustrated-transformer/ 论文地址:https://arxiv.org/abs/1706.03762 前言 Attention这种机制最开始应用于机器翻译的任务中,并且取得了巨大的成就…