【重难点】【分布式 01】RESTful、RPC 对比、Dubbo、Spring Cloud 对比、Eureka、Zookeeper、Consul、Nacos 对比、分布式锁
文章目录
一、RESTful、RPC 对比
1.RESTful
REST(Representational State Transfer,表述性状态转移)指的是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是 RESTful
Web 应用程序最重要的 REST 原则是,客户端和服务器的交互请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知
在服务器端,应用程序状态和功能可以分为各种资源,资源向客户端公开。资源包括应用程序对象、数据库记录、算法等等。每个资源都是用 URI 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、POST、PUT、DELETE
特点
- 使用 URI 代表资源
- 使用标准的 HTTP 方法
- 通过操作资源的表现形式来操作资源
- 资源的表现形式是 XML 或者 HTML
- 客户端与服务器的交互请求之间是无状态的
2.RPC
RPC(Remote Procedure Call,远程过程调用)是一种进程间通信方式。允许像调用本地服务一样调用远程服务
RPC 框架的主要目标就是让远程服务调用更简单、透明。RPC 框架负责屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/JSON/二进制)和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程
3.对比
传输协议
REST 基于 HTTP 协议
RPC 一般基于 TCP 协议,也可以基于 HTTP 协议
传输效率
REST 大多使用 HTTP 1.1 协议,请求头中会包含大量冗余信息,如果是基于 HTTP 2.0 协议,效率会大大提高
RPC 一般使用自定义的 TCP 协议,可以减小请求报文体积,或者使用 HTTP 2.0 协议
性能消耗
REST 大部分通过 JSON 来实现,字节大小和序列化更消耗性能,如果是基于 HTTP 2.0 协议,性能消耗会降低
RPC 可以实现高效的二进制传输
二、Dubbo、Spring Cloud 对比
1.Dubbo
Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
2.Spring Cloud
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署
Spring Cloud 并没有重复制造轮子,它只是将各家公司开发得比较成熟、经得起实际考验得服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者流出了一套简单易懂、易部署和易维护得分布式系统开发工具包
3.对比
Dubbo 和 Spring Cloud 不能直接对比,Dubbo 是一款 RPC 框架,而 Spring Cloud 是一种微服务架构的一站式解决方案,Spring Cloud 也可以集成 Dubbo 实现 RPC
三、Eureka、Zookeeper、Consul、Nacos 对比
1.Eureka
Eureka 是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务。此外,还有负载均衡和服务故障转移的功能
Eureka 包含两个组件:Eureka Server 和 Eureka Client。Eureka Server 是注册中心,每个服务都是一个 Eureka Client,需要在 Eureka Server 中进行注册
Eureka Server 通过复制、心跳检查和客户端缓存来确保系统的可用性
Eureka 遵循 AP 原则,因为 Eureka 集群没有主节点的概念,每个 Eureka 服务可以单独提供服务,不会出现重新选举的情况,也就无法保证系统的一致性
Eureka 目前已经停止开发
2.Zookeeper
Zookeeper 是一个分布式应用程序协调服务,提供的功能包括:统一命名服务、统一配置管理、统一集群管理
与 Eureka 不同的是,Zookeeper 遵循 CP 原则,在 Zookeeper 集群中,如果主节点挂掉了,为了保证数据一致性,就需要进行重新选举(Fast Paxos),这个选举过程通常是耗时比较长的,并且在选举期间整个系统都是不可用的,也就无法保证系统的可用性
3.Consul
Consul 用于实现分布式系统的服务发现与配置,使用 Golang 编写。Consul 内置了服务注册与发现框架、分布式一致性协议实现、健康检查、键值对存储、多数据中心方案
Consul 遵循 CP 原则,与 Zookeeper 类似,如果主节点挂掉了,也需要进行选举,但是使用的是更加简单的 Raft 算法,Raft 协议要求必须超过半数的节点都写入成功才认为注册成功
4.Nacos
Nacos 需要下载 Nacos 并且启动 Nacos Server,进行简单的配置就可以完成服务的注册发现。此外,Nacos 还支持动态配置服务,简单来说 Nacos 就是 Spring Cloud 注册中心 + Spring Cloud 配置中心
Nacos 默认遵循 AP 原则,也可以切换为 CP,加入选举机制
四、分布式锁
1.Zookeeper 实现分布式锁
- Zookeeper 每接收到客户端的一个请求,就在 /locks 节点下创建一个临时顺序节点,按照顺序依次获取锁,处理完业务后删除临时节点
- 每个临时节点都会判断自己是不是当前节点下的最小节点,是,就获取锁;不是,就监听前一个节点,一旦前一个释放了锁就可以获取锁
2.Redis 实现分布式锁
在 Redis 节点中设置一个 Key,如果 Key 存在,说明锁被占用,如果 Key 不存在,说明可以添加 Key 也就是获取锁,处理完业务后再将 Key 删除。我们可以使用 Redis 的 SETNX 命令来实现这个添加 Key 的操作
如果客户端获取了锁,但是在释放锁之前宕机了,就会导致锁永远无法释放。解决方案是在添加 Key 的时候为 Key 设置一个过期时间
但是这样又会引出另一个问题,锁被提前释放了。解决方案是让客户端在获取锁后立刻启动一个子线程给自己续命,这个子线程需要做的就是,在锁即将过期的时候就重新设置锁的过期时间