Java 微服务框架对比:Dubbo 和 Spring Cloud

微服务特点:

微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。

  1. 独立部署
  2. 松耦合
  3. 单一职责,每个服务仅关注一件任务

微服务框架

 相关概念:

 

rpc

1、远端过程调用,其调用协议通常包含传输协议和编码协议

2、RPC 可以把 HTTP 作为一种传输协议(比如 gRPC 使用 HTTP 2.0 协议传输),本身还会封装一层 RPC 框架的应用层协议,不同语言之间调用需要依赖 RPC 协议

grpcHTTP 2.0 协议传输
dubbo自定义报文的 TCP 协议。编码协议包含: 如基于文本编码的 XML Json,也有二进制编码的 ProtoBuf Binpack 等
restREST 风格直接把 HTTP 作为应用协议(直接和服务打交道),不同语言之间调用比较方便

 

为什么 Dubbo 比 Spring Cloud 性能要高一些?

Dubbo 采用单一长连接和 NIO 异步通讯(保持连接/轮询处理),使用自定义报文的 TCP 协议,并且序列化使用定制 Hessian2 框架,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况,但不适用于传输大数据的服务调用

Spring Cloud 直接使用 HTTP 协议(但也不是强绑定,也可以使用 RPC 库,或者采用 HTTP 2.0 + 长链接方式(Fegin 可以灵活设置))。

Dubbo

分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。简单的说,Dubbo 就是个服务框架,说白了就是个远程服务调用的分布式框架.

dubbo

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

Consumer: 调用远程服务的服务消费方
Registry: 服务注册与发现的注册中心
Monitor: 统计服务的调用次调和调用时间的监控中心
Container: 服务运行容器

SpringCloud

基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。Spring Boot 是 Spring 的一套快速配置脚手架,使用默认大于配置的理念,用于快速开发单个微服务

核心功能:

  • 分布式/版本化配置
  • 服务注册和发现
  • 路由
  • 服务和服务之间的调用
  • 负载均衡
  • 断路器
  • 分布式消息传递

流程:

  • 请求统一通过 API 网关(Zuul)来访问内部服务。
  • 网关接收到请求后,从注册中心(Eureka)获取可用服务。
  • 由 Ribbon 进行均衡负载后,分发到后端具体实例。
  • 微服务之间通过 Feign 进行通信处理业务。
  • Hystrix 负责处理服务超时熔断。
  • Turbine 监控服务间的调用和熔断相关指标。

对比

dubbo

优点:

Dubbo 支持 RPC 调用,服务之间的调用性能会很好。

支持多种序列化协议,如 Hessian、HTTP、WebService。

Dobbo Admin后台管理功能强大,提供了路由规则、动态配置、访问控制、权重调节、均衡负载等功能。

在国内影响力比较大,中文社区文档较为全面

阿里最近重启维护

缺点:

1、Registry 严重依赖第三方组件(zookeeper 或者 redis),当这些组件出现问题时,服务调用很快就会中断

2、只支持 RPC 调用。使得服务提供方(抽象接口)与调用方在代码上产生了强依赖

3、Dubbo 只是实现了服务治理,其他微服务框架并未包含,需要结合第三方框架实现(比如分布式配置用淘宝的 Diamond、服务跟踪用京东的 Hydra,但使用相对麻烦些),开发成本较高,且风险较大。

springcloud

优点

1、有强大的 Spring 社区、Netflix 等公司支持

2、标准化的将微服务的成熟产品和框架结合一起,Spring Cloud 提供整套的微服务解决方案,开发成本较低,且风险较小

3、基于 Spring Boot,具有简单配置、快速开发、轻松部署、方便测试的特点

4、支持 REST 服务调用,相比于 RPC,更加轻量化和灵活(服务之间只依赖一纸契约,不存在代码级别的强依赖),有利于跨语言服务的实现,以及服务的发布部署。另外,结合 Swagger,也使得服务的文档一体化

5、提供了 Docker 及 Kubernetes 微服务编排支持

6、企业应用非常多,经受了大公司的应用考验(比如 Netfilx 公司),以及强大的开源社区支持

缺点:

1、REST 服务调用性能会比 RPC 低一些(但也不是强绑定)

2、Spring Cloud 整合了大量组件,相关文档比较复杂,需要针对性的进行阅读

3、支持 REST 服务调用,可能因为接口定义过轻,导致定义文档与实际实现不一致导致服务集成时的问题(可以使用统一文档和版本管理解决,比如 Swagger)。

 

性能比较:

选型出发点

微服务选型要评估以下几点:

  1. 内部是否存在异构系统集成的问题;
  2. 备选框架功能特性是否满足需求;
  3. HTTP 协议的通信对于应用的负载量会否真正成为瓶颈点(Spring Cloud 也并不是和 HTTP + JSON 强制绑定的,如有必要 Thrift、ProtoBuf 等高效的 RPC、序列化协议同样可以作为替代方案);
  4. 社区活跃度、团队技术储备等。作为已经没有团队持续维护的开源项目,选择 Dubbo 框架内部就必须要组建一个维护团队,先不论你要准备要集成多少功能做多少改造,作为一个支撑所有工程正常运转的基础组件,问题的及时响应与解答、重大缺陷的及时修复能力就已足够重要。

选型建议

1、使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。

2、Spring Cloud 可以说是一个更完备的微服务解决方案,它从功能性上是 Dubbo 的一个超集对于一些中小型企业 Spring Cloud 可能是一个更好的选择

3、Dubbo 和 Spring Cloud 的主要不同体现在两个方面:服务调用方式不同专注点不同(生态不同)

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

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

相关文章

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

reference : http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻 塞队列和非阻塞队列,其中阻…

31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?

问题导入 给你一个用户,如何找出这个用户的所有三度(其中包含一度、二度和三度)好友关系? 搜索算法 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为&a…

可能是最好理解的二叉树的层序遍历

题目描述&#xff1a;二叉树的层序遍历&#xff0c;按层数输出每一层的结果数组 代码实现 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res new ArrayList<List<Integer>>();Queue<…

Spring学习9-MyEclipse中Spring工程使用@Resource注释的问题

在MyEclipse 的Spring工程中&#xff0c;有时候要使用Resource注释来驱动Spring配置。但是在MyEclipse添加Spring开发能力的操作中&#xff0c;并没有 把相关的库添加到工程的classpath中&#xff0c;所以使用该注解时会产生找不到类的错误&#xff0c;这是由于MyEclipse带的Sp…

jdk1.8对synchronized锁的优化

synchronized 锁的优化&#xff1a;锁的四种状态-无锁&#xff0c;偏向锁、轻量级锁&#xff0c;重量级锁 1、偏向锁&#xff1a;原因是大多数时候是不存在锁竞争的&#xff0c;常常是一个线程多次获得同一个锁&#xff0c;因此如果每次都要竞争锁会增大很多没有必要付出的代价…

jstack命令使用

概述 jstack可用于导出java运用程序的线程堆栈。其基本使用语法为&#xff1a; jstack [-l] pid -l 选项用于打印锁的额外信息。使用演示样例 以下这段代码执行之后会出现死锁现象(由于线程1持有lock1。在等待lock2。线程2持有lock2在等待lock1&#xff0c;造成了循环等待。形成…

Python运算符优先级

找了个表格。 参考网址&#xff1a;http://www.runoob.com/python/python-operators.html转载于:https://www.cnblogs.com/Deribs4/p/5203936.html