Dubbo v Spring Cloud:两大技术栈如何选型

提到微服务开源框架,不可不说的是 Dubbo 和 Spring Cloud,这两大框架应该是大家最熟悉的微服务解决方案,也是面试中的热点。本文就梳理下 Dubbo 和 Spring Cloud 的应用特性,以及两个组件的功能对比。

Dubbo

是阿里开源的一个分布式服务框架,目的是支持高性能的远程服务调用,并且进行相关的服务治理。在 RPC 远程服务这一课时我们也介绍过 Dubbo,从功能上,Dubbo 可以对标 gRPC、Thrift 等典型的 RPC 框架。

总体架构 下图包含了 Dubbo 核心组件和调用流程:

包括了下面几个角色:

  • Provider,也就是服务提供者,通过 Container 容器来承载;
  • Consumer,调用远程服务的服务消费方;
  • Registry,服务注册中心和发现中心;
  • Monitor,Dubbo 服务调用的控制台,用来统计和管理服务的调用信息;
  • Container,服务运行的容器,比如 Tomcat 等。

应用特性 Dubbo 是一个可扩展性很强的组件,主要的特性如下。

1.基于 SPI 的扩展 SPI(Service Provider Interface)是 JDK 内置的一种服务提供发现机制,JDK 原生的 SPI 加载方式不灵活,要获取一个类的扩展必须加载所有实现类,得到指定的实现类需要遍历。

Dubbo 中增强了原生的 SPI 实现,可以通过指定的扩展类名称来找到具体的实现,这样可以更好地进行功能点扩展。

2.灵活的服务调用 Dubbo 作为一个优秀的 RPC 解决方案,支持多种服务调用方式,针对服务端和消费端的线程池、集群调用模式、异步和同步调用等都可以进行灵活的配置。

3.责任链和插件模式 Dubbo 的设计和实现采用了责任链模式,使用者可以在服务调用的责任链上,对各个环节进行自定义实现,也可通过这种方式,解决 Dubbo 自带策略有限的问题。基于 SPI 和责任链模式,实现了一个类似微内核加插件的设计,整体的可扩展性和灵活性都比较高。

4.高级特性支持 Dubbo 对远程服务调用提供了非常细粒度的功能支持,比如服务发布支持 XML、注解等多种方式,调用可以选择泛化调用、Mock 调用等。

Spring Cloud

Spring Cloud 基于 Spring Boot,是一系列组件的集成,为微服务开发提供一个比较全面的解决方案,包括了服务发现、配置管理、API 网关、限流熔断组件、调用跟踪等一系列的对应实现。

总体架构,微服务组件都有多种选择,典型的架构图如下图所示:

整体服务调用流程如下:

  • 外部请求通过 API 网关,在网关层进行相关处理;
  • Eureka 进行服务发现,包含健康检查等;
  • Ribbon 进行均衡负载,分发到后端的具体实例;
  • Hystrix 负责处理服务超时熔断;
  • Zipkin 进行链路跟踪。

应用特性 Spring Cloud 目前主要的解决方案包括 Spring Cloud Netflix 系列,以及 Spring Cloud Config、Spring Cloud Consul 等。

Spring Cloud 典型的应用如下:

  • 配置中心,一般使用 Spring Cloud Config 实现,服务发现也可以管理部分配置;
  • 服务发现,使用 Eureka 实现,也可以扩展 Consul 等;
  • API 网关,使用 Zuul 实现,另外还有 Kong 等应用;
  • 负载均衡,使用 Ribbon 实现,也可以选择 Feign;
  • 限流降级,使用 Hystrix 实现熔断机制,也可以选择 Sentinel。

Dubbo 和 Spring Cloud 对比

可以看到,在介绍 Dubbo 时,主要是从 RPC 服务调用的特性入手,而在介绍 Spring Cloud 时,更多的是强调其在微服务方面提供的整体解决方案。

Dubbo 更多关注远程服务调用功能特性,Spring Cloud 则包含了整体的解决方案,可以认为 Dubbo 支持的功能是 Spring Cloud 的子集。

功能对比 

使用 Dubbo 组件实现服务调用,需要强依赖 ZooKeeper 注册中心;如果要实现服务治理的周边功能,比如配置中心、服务跟踪等,则需要集成其他组件的支持。

  • 注册中心:需要依赖 ZooKeeper,其他注册中心应用较少。
  • 分布式配置:可以使用 diamond,淘宝的开源组件来实现。
  • 分布式调用跟踪:应用扩展 Filter 用 Zippin 来做服务跟踪。
  • 限流降级:可以使用开源的 Sentinel 组件,或者自定义 Filter 实现。

SpringCloud提供的功能更加多样,服务治理只是其中的一个方面,面向的是微服务整体的解决方案。

调用方式
Dubbo 使用 RPC 协议进行通讯,支持多种序列化方式,包括 Dubbo 协议、Hessian、Kryo 等,如果针对特定的业务场景,用户还可以扩展自定义协议实现。

Spring Cloud 一般使用 HTTP 协议的 RESTful API 调用,RESTful 接口相比 RPC 更为灵活,服务提供方和调用方可以更好地解耦,不需要依赖额外的 jar 包等,更适合微服务的场景。从性能角度考虑,一般来说,会认为 PRC 方式的性能更高,但是如果对请求时延不是特别敏感的业务,是可以忽略这一点的。

服务发现
Dubbo 的服务发现通过注册中心实现,支持多种注册中心,另外本地测试支持 Multicast、Simple 等简单的服务发现方式。

Spring Cloud 有各种服务发现组件,包括 Eureka、Consul、Nacos 等。前面提到过,ZooKeeper 实现的是 CAP 中的 CP 一致性,Spring Cloud 中的 Eureka 实现的是 AP 一致性,AP 更适合服务发现的场景。

开发成本
应用 Dubbo 需要一定的开发成本,自定义功能需要实现各种 Filter 来做定制,使用 Spring Cloud 就很少有这个问题,因为各种功能都有了对应的开源实现,应用起来更加简单。特别是,如果项目中已经应用了 Spring 框架、Spring Boot 等技术,可以更方便地集成 Spring Cloud,减少已有项目的迁移成本。

经过上面的对比可以看出,Dubbo 和 Spring Cloud 的目标不同,关注的是微服务实现的不同维度,Dubbo 看重远程服务调用,Spring Cloud 则是作为一个微服务生态,覆盖了从服务调用,到服务治理的各个场景。

社区活跃度

Spring Cloud 从发展到现在,社区一直保持高度活跃,各类解决方案越来越丰富,另外,Dubbo 在近几年又重启维护,发布了新的版本,并且也官宣了新的升级计划。

分布式服务考点梳理及高频面试题

如何考察分布式服务,在整个分布式课程中,分布式服务是大部分开发中应用最多的,也是面试中经常出现的一个热点。

在分布式服务部分的面试中,面试官通常会围绕“服务治理”的各个场景进行提问,考察候选人对微服务和服务治理各个环节的掌握程度。分布式服务这部分内容涉及的比较广,有非常丰富的内涵和外延知识。本课程只是带你描述了一些核心领域的知识点,剩下的内容,还需要你在平时的工作和学习中多多积累。

我们在课程中提到了 Spring Cloud 和 Dubbo 两个技术栈,这两大技术栈是目前大部分公司进行服务治理的选择。当然,一些公司使用的是 Thrift 和 gRPC 等服务框架,但是应用比例要小很多,在实际的面试中,通常会选择一个服务治理的技术栈来展开提问,对候选人进行考察。

下面我以 Dubbo 技术栈为例,整理了一些分布式服务相关的问题,来模拟实际的面试场景。这些问题都是比较基础的,你可以作为对照,检测一下掌握程度:

  • 为什么需要 Dubbo?
  • Dubbo 的主要应用场景?
  • Dubbo 的核心功能?
  • Dubbo 服务注册与发现的流程?
  • Dubbo 的服务调用流程?
  • Dubbo 支持哪些协议,每种协议的应用场景、优缺点?
  • Dubbo 有些哪些注册中心?
  • Dubbo 如何实现服务治理?
  • Dubbo 的注册中心集群挂掉,如何正常消费?
  • Dubbo 集群提供了哪些负载均衡策略?
  • Dubbo 的集群容错方案有哪些?
  • Dubbo 支持哪些序列化方式?

需要你注意的是,即使开发框架不同,但是在服务治理中关注的功能是一致的,如果你应用的是另外的分布式服务框架,可以把关键词做一些替换,比如 Spring Cloud 的主要应用场景、Spring Cloud 的核心功能,同样可以用来考察自己对整体技术栈的掌握程度。

微服务技术栈梳理
下图分别展开 Dubbo 和 Spring Cloud 这两大微服务技术栈,可以对照这张图片,查漏补缺进行针对性的学习。

对 Spring Cloud 和 Dubbo 两大技术栈的掌握,重在深入而不是只能泛泛而谈。举个例子,Dubbo 在不同业务场景时,如何选择集群容错策略和不同的线程模型,又如何配置不同的失败重试机制呢?

Dubbo 为什么选择通过 SPI 来实现服务扩展,又对 Java 原生的 SPI 机制做了哪些调整呢?这些应用细节都要针对性地了解,才能在系统设计时避免各种问题。

除了上层的技术组件之外,微服务底层的技术支撑也要去了解一下,比如 Docker 容器化相关知识,容器内隔离是如何实现的,JVM 对容器资源限制的理解,以及可能产生的问题,还有容器如何调度等。

继续扩展,你可以思考一下,为什么现在很多企业选择 Golang 作为主要的开发语言,其中一个原因,就和 Go 语言部署和构建快速,占用容器资源小有关系。

微服务设计常用的 DDD(领域驱动设计)思路,开发中的设计模式,也要有一定的理解和掌握。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值