当前位置: 首页 > 编程日记 > 正文

Dubbo和Spring Cloud微服务架构对比

一、为什么要使用微服务?

微服务提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合。

今天我们来了解下业内主要的微服务框架:DubboSpring Cloud

微服务主要的优势

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

每一个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界。

每个服务开发者只专注服务本身,通过使用缓存、DAL 等各种技术手段来提升系统的性能,而对于消费方来说完全透明。

可独立部署

由于微服务具备独立的运行进程,所以每个微服务可以独立部署。当业务迭代

时只需要发布相关服务的迭代即可,降低了测试的工作量同时也降低了服务发布的风险。

容错

在微服务架构下,当某一组件发生故障时,故障会被隔离在单个服务中。

比如通过限流、熔断等方式降低错误导致的危害,保障核心业务正常运行。

扩展

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

当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,

因为每个服务可以根据实际需求独立进行扩展。

微服务的核心要素在于服务的发现、注册、路由、熔断、降级、分布式配置!!

二、Dubbo 和 SpringCloud 的比较

1、Dubbo 核心部件

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

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

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

Monitor:统计服务和调用次数,调用时间监控中心,Dubbo 的控制台页面中可以显示。

Container:服务运行的容器。
1269192-20190929010340648-1647090584.png

Spring Cloud总体架构

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

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

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

1269192-20190929010357734-1904193506.png

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

2、微服务架构核心要素

1269192-20190929010402583-1884182883.png

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

Dubbo 提供了各种 Filter,对于上述中没有的要素,可以通过扩展 Filter 来完善:

  a. 分布式配置:可以使用淘宝的 diamond、百度的 disconf 来实现分布式配置管理。b. 服务跟踪:可以使用京东开源的 Hydra,或者扩展 Filter 用 Zippin 来做服务跟踪。c. 批量任务:可以使用当当开源的 Elastic-Job、tbschedule。

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

3、通讯协议

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

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

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

Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 HTTP 通讯,采用 Servlet 暴露服务,

Dubbo 缺省内嵌 Jetty 作为服务器实现。

HTTP:采用 Spring 的 Http Invoker 实现。

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

Spring Cloud 使用 HTTP 协议的 REST API。

4、性能比较

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

1269192-20190929010412739-27742668.png

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

Dubbo 支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜Spring Cloud,

如果对于系统的响应时间有严格要求,长链接更合适。

5、服务依赖方式

Dubbo

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

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

Molel 层:服务的 DTO 对象层。

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

因此需要为每个微服务定义各自的 Interface 接口,并通过持续集成发布到私有仓库中。

调用方应用对微服务提供的抽象接口存在强依赖关系,开发、测试、集成环境都需要严格的管理版本依赖。

通过 maven 的 install & deploy 命令把 Interface 和 Model 层发布到仓库中,

服务调用方只需要依赖 Interface 和 Model 层即可。

在开发调试阶段只发布 Snapshot 版本,等到服务调试完成再发布 Release 版本,

通过版本号来区分每次迭代的版本。通过 xml 配置方式即可接入 Dubbo,对程序无入侵。

1269192-20190929010420830-529500130.png

Spring Cloud

服务提供方和服务消费方通过 Json 方式交互,因此只需要定义好相关 Json 字段即可,

消费方和提供方无接口依赖。通过注解方式来实现服务配置,对于程序有一定入侵。

1269192-20190929010452836-1934008545.png

6、组件运行流程

Dubbo

下图中的每个组件都是需要部署在单独的服务器上,Gateway 用来接受前端请求、

聚合服务,并批量调用后台原子服务。每个 Service 层和单独的 DB 交互。

Dubbo 组件运行:

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

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

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

1269192-20190929010439275-2002835105.png

Spring Cloud组件运行:

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

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

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

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

1269192-20190929010500799-2113047834.png

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

Dubbo 需要自己开发一套 API 网关,而 Spring Cloud 则可以通过 Zuul 配置即可完成网关定制。

使用方式上 Spring Cloud 略胜一筹。

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

1269192-20190929010506674-240831540.png

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

架构分解:

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

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

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

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

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

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

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

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

注意事项:

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

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

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

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

总结

Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司;

只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主。

框架本身的成熟度以及文档的完善程度,完全能满足各大互联网公司的业务需求。

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

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

Spring Cloud 自从发布到现在,仍然在不断的高速发展,几乎考虑了服务治理的方方面面,

开发起来非常的便利和简单。

微服务架构提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。

企业需根据自身的研发水平和所处阶段选择合适的架构来解决业务问题,不管是 Dubbo 还是 Spring Cloud

都是实现微服务有效的工具。

转载于:https://www.cnblogs.com/miantiao312/p/11605666.html

相关文章:

Unity 3D为策略游戏创建地图学习教程

MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:30节课(7h 42m) |大小:5 GB 含项目文件 沿着曲线、高程图和数据结构移动对象 你会学到: Unity&…

Lambda表达式(简单解析)

Lambda表达式 Lambda表达式其实是JDK8的一个新特性。所谓Lambda表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式,可以用于解决匿名内部类中定义复杂的问题。 我们先来看一段代码,如下: interface Customer{public void print(…

YTU 2899: D-险恶逃生 I

2899: D-险恶逃生 I 时间限制: 1 Sec 内存限制: 128 MB提交: 130 解决: 55题目描述 Koha被邪恶的巫师困在一个m*n的矩阵当中,他被放在了矩阵的最左上角坐标(0,0)处,而唯一的出口在矩阵最右下角坐标(m-1,n-1)处,他每次只能向右或者向下移动一…

2021-2027年中国托育服务行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国托育服务行业市场行业相关概述、中国托育服务行业市场行业运行环境、分析了中国托育服务行…

2021全国高校计算机能力挑战赛(初赛)Java试题一

从大于等于N 的正整数里找到一个最小的数M,使之满足:M和M的逆序数(如1230的逆序数为321)的和为一个[100000,200000]区间内的值。 import java.util.Scanner; public class Main {public static void main(String[] args){Scanner scanner new Scanner(System.in);int N scann…

Blender写实产品创作学习教程

Blender中的现实产品创作 Realistic Product Creation in Blender MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确)|时长:71节课(6小时30分钟)|大小解压…

试题 入门训练 Fibonacci数列(Java)

题目: 一开始我看到这题目其实觉得挺简单的,第一次简单写了一个循环就提交上去了,结果… 我意识到这是因为超过long类型的最大范围导致的,所以第二次换成BigInteger大整数类型,但最后一个测试点超时了… 通过百度…

翻译BonoboService官网的安装教程

This page covers simple Bonobo Git Server installation. Be sure to check prerequisites page before installation and for other sections visit the documentation page. 此页包括简单的Bonobo Git 服务安装。在安装和查看文档页之前要先查看系统要求页。 The following…

2021-2027年中国涂装行业市场需求预测与投资战略规划分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国涂装行业市场行业相关概述、中国涂装行业市场行业运行环境、分析了中国涂装行业市场行业的…

【SICP练习】84 练习2.56

这道题的代码略长啊。不过我也是因此而知道Edwin上的代码居然可以复制到word上,以前还想当然的以为不能复制的,毕竟在Edwin上粘贴用的CtrlY,而不是CtrlV。在这里我就只将书上没有的代码贴出来了。 (define (deriv exp var)(cond ((number? e…

2021全国高校计算机能力挑战赛(初赛)Java试题二

某地大数据防疫平台记录了往来的所有防疫相关信息,包括本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果等 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new …

Zbrush2021写实人物肖像雕刻学习教程

Zbrush 2021写实人物肖像雕刻学习教程 Zbrush 2021 Character Likeness Sculpting Tutorial 大小解压后:24G 持续时间32h 1280X720 MP4 语言:英语中英文字幕(根据原英文字幕机译更准确) 标题:Udemy–Zbrush 2021人物肖像雕刻教程…

监听指定端口数据交互(HttpListenerContext )

很怀念以前做机票的日子,,,,可惜回不去 以前的项目中的,拿来贴贴 场景:同步第三方数据,监听指定地址(指定时间间隔,否则不满足,因为需要处理粘包问题&#xf…

OpenCV-Java版学习(1.在IDEA中使用OpenCV)

前言 因为最近要做一个关于计算机视觉的应用程序,所以便来学一下OpenCV的使用,上网找了许久也没找到OpenCV关于Java的教程,无奈之下只能照着官方的Python版的文档学习,所幸里面的函数的使用方法基本都一样。 IDEA中使用OpenCV …

ElasticSearch Groovy脚本远程代码执行漏洞

什么是ElasticSearch?它是一种分布式的、实时性的、由JAVA开发的搜索和分析引擎。2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由于搜索引擎支持使用脚本代码&#xf…

2021全国高校计算机能力挑战赛(初赛)Java试题三

二维空间中给定的一组点的坐标,以任意两个点为直径绘制一个圆。求可以绘制的最大圆,满足该圆不包含其他点,输出直径 import java.util.*;import java.util.Scanner; public class Main {private static double res -1;public static void ma…

在Blender中制作火箭发射烟雾和火焰模拟的动画

大小:1.25G 时长1h 30m 1280X720 MP4 语言:英语中英文字幕(根据原英文字幕机译更准确) 在Blender中制作火箭发射烟雾和火焰模拟的动画 Animate a Rocket Launch Smoke & Fire Simulation in Blender 信息: 制作火箭发射的短片…

OpenCV-Java版学习(2.图像入门)

前言 上一篇博客我们讲了如何在IDEA中使用OpenCV来进行一些简单的图像操作,这节我们来学习图像的一些基本的入门级操作。 图像入门 一.在Java中使用OpenCV注意事项 1.解决awt报错问题 先给大家贴个错误,如下图: 我们在使用awt处理图像的…

两个数组找不同

<script> function subArr(a, b) { return a.filter(function(i) { return b.indexOf(i) -1 }) } console.log(subArr([1,2,3,4],[3,4,5])); </script>转载于:https://www.cnblogs.com/mouse2417/p/5165391.html

jQuery Mobile设置边距的宽度和颜色

border-top:10px solid #EFEFF4"

2021全国高校计算机能力挑战赛(初赛)Java试题四

某游戏公司设计了一个奖励活动&#xff0c;给N个用户&#xff08;1<N<10^7&#xff09;连续编号为1到N&#xff0c;依据用户的编号S发放奖励。 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scann…

Blender与UE5完美结合全流程创作游戏资产视频教程

Blender到虚幻引擎5 Blender to Unreal Engine 5 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44100 Hz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小:18.4 GB |时长:20h 55m 只有视频课程 无素材文件 你想学习如何…

OpenCV-Java版学习(3.对视频的基本操作)

前言 上一节我们学习了使用OpenCV对图像进行一些基础操作&#xff0c;现在我们学习对视频进行一些基础的操作。 对视频的基本操作 从相机中读取视频 我们从电脑自带的摄像头捕捉一段视频并在屏幕上显示出来&#xff0c;代码如下&#xff1a; import org.junit.jupiter.api…

win7如何设置某个软件不弹出用户账户控制

手动修改注册表&#xff1a; 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面新建值&#xff0c;值的名字是程序的全路径&#xff0c;值数据是“RunAsInvoker”。 该程序在没有修改系统文件或设置的情况下不会弹出用户帐户控…

IDEA热部署基于maven的web项目

第一步&#xff1a;首先先创建web项目 按照向导一步一步完成项目创建&#xff0c;我创建的示例项目为hotdeploddemo 第二步&#xff1a;设置项目的web资源 下图中的路径要修改正确&#xff0c;指向src/main/webapp/WEB-INF下面的web.xml,然后点击右下角的fix创建artifacts 第三…

2021全国高校计算机能力挑战赛(初赛)C语言试题一

输入两个整数x,y&#xff0c;输出x,y中各位数重新组合的可能形成最小的数。 #include <stdio.h>int main() {int n1, n2, tmp;int s[10000];int i 0;scanf("%d %d", &n1, &n2);while (n1 ! 0) {s[i] n1 % 10;i;n1 n1 / 10;}while (n2 ! 0) {s[i] n…

Unity创建游戏VFX视觉特效-初级到中级

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44100 Hz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.36 GB |时长:4h 17m 本课程是关于用Unity视觉效果图为游戏创建VFX。 你将从零开始学习VFX图形&#xff0…

关于object references an unsaved transient instance - save the transient instance before flushing的解决方法

关于object references an unsaved transient instance - save the transient instance before flushing的解决方法 异常信息 object references an unsaved transient instance - save the transient instance before flushing : com.gcl.demo.entity.Borrow.member -> c…

Java——Math类

Java中的Math类包含了基本的数学运算方法。下面将从以下几部分进行讲解。debug后发现,常量E和常量PI均为double类型。

SpringMVC工作环境搭建 配置文件

web.xml配置 在服务器端容器启动之前加载配置文件的顺序&#xff1a;context-param>listener>filter>servlet //容器配置application上下文的时候加载的文件 //这是spring容器的配置文件 <context-param> <param-name>contextConfigLocation</param-na…