一. 分布式系统架构与微服务
分布式系统架构和微服务是现代软件开发中常见的两种概念,它们通常结合使用来构建灵活、可扩展和高效的应用程序。
分布式系统架构:
分布式系统架构是指将一个单一的应用程序或服务拆分成多个独立的部分,这些部分可以在不同的计算机、服务器或者地理位置上运行,并通过网络进行通信和协作。分布式系统的设计旨在提高系统的可靠性、可用性和扩展性,同时减少单点故障的影响。
分布式系统架构主要特点:
分解性: 将整体系统分解成多个相互独立的模块或服务。
分布性: 这些模块可以部署在不同的硬件设备上,通过网络进行通信。
并发性: 多个模块可以并发地运行和处理请求。
透明性: 用户和应用程序不需要关心系统的分布性,系统应该提供一致的操作接口。
微服务架构:
微服务架构是一种分布式系统架构的特定实现方式,它将一个应用程序拆分成一组小型服务,每个服务都运行在自己的进程中,并通过轻量级的通信机制(通常是HTTP或消息队列)进行互相调用。每个微服务都专注于一个特定的业务功能,并且可以独立部署、升级和扩展。
微服务架构的特点:
服务化: 将应用程序拆分成多个小型、自治的服务。
分布式管理: 每个服务可以由不同的团队开发、部署和管理。
松耦合: 每个微服务都可以独立开发、测试、部署和扩展,它们之间通过API或者消息传递进行通信,避免了传统单体应用程序中的紧耦合问题。
多语言和技术栈: 每个微服务可以使用最适合其需求的编程语言、数据库和技术栈。
微服务架构通过解耦和自治的服务单元来提高系统的灵活性、可维护性和可扩展性,同时也增加了复杂性和运维的挑战,因此在设计和实施时需要权衡各种因素。
二.什么是注册中心
注册中心:通常指的是分布式系统架构中的一个核心组件,主要用于服务发现和服务治理。注册中心在微服务架构中特别常见。具体来说,注册中心负责管理整个系统中所有的服务实例,包括它们的网络位置(如IP地址和端口号)以及运行状态。
服务实例: 注册在注册中心中的具体服务的运行实例,指的是具体提供某项服务的实际运行实例或者节点。例如,一个微服务架构中的某个具体服务(如用户管理服务)可能会运行多个实例,每个实例都会向注册中心注册自己的位置和状态,以便其他服务可以发现和调用它们。
配置中心: 配置中心用于集中管理和动态更新应用程序的配置信息。它提供了一个存储配置的地方,应用程序在运行时可以从配置中心获取最新的配置。配置中心通常支持配置的版本管理、动态刷新、权限控制等功能,以便于管理和维护应用程序的配置。 比如Nacos、Spring Cloud Config等配置中心,应用程序可以从这些中心获取数据库连接信息、日志级别、业务参数等配置,而不需要硬编码在应用中,从而实现配置和代码的分离。
注册中心与配置中心的区别:
主要功能不同: 注册中心关注服务实例的注册和发现,确保服务之间能够相互发现和通信;配置中心关注应用配置的集中管理和动态更新,确保应用程序在运行时能够获取最新的配置信息。
服务对象不同: 注册中心服务于服务实例,帮助它们相互发现和通信;配置中心服务于应用程序,提供配置管理和动态更新的功能,使得应用配置可以集中管理和动态调整。
三.注册中心主要功能:
服务注册(Service Registration):服务实例启动时,会向注册中心注册自己的信息,包括服务名称、版本号、网络位置(IP地址和端口号)等。注册中心将这些信息存储起来,形成服务注册表(服务注册表是分布式系统中用于管理和存储服务实例信息的重要组件。它通常由服务注册中心(Service Registry)来实现和维护。服务注册表在微服务架构中尤为重要,它使得服务之间的通信变得更加透明和可靠。常见的服务注册表包括ZooKeeper、Nacos,和Netflix的Eureka、Consul、etcd等)。
服务发现(Service Discovery):当服务消费者需要调用某个服务时,它可以向注册中心查询该服务的注册信息。注册中心返回该服务的可用实例列表,消费者可以根据负载均衡策略选择一个实例进行调用,而不需要事先配置服务的位置。
健康检查(Health Check):注册中心会定期检查注册的服务实例的健康状态,比如是否存活、负载情况,是否能够正常处理请求等。服务实例通常会定期发送心跳信号给注册中心,以表明自己的健康状态。如果发现某个服务实例不可用,注册中心将从注册表中移除该实例,以确保消费者不会再将请求发送到不可用的服务实例上。
负载均衡(Load Balancing):一些注册中心会提供负载均衡的功能,通过在多个服务实例之间分发负载,确保系统资源的高效利用。
故障转移和容错(Failover and Fault Tolerance):当某个服务实例发生故障时,注册中心可以快速将流量转移到其他健康的实例,从而提高系统的可用性和稳定性。
四.常见的注册中心:
常见的注册中心包括ZooKeeper、Nacos、Eureka、Consul等,它们通过提供REST API或其他协议与服务实例通信,管理和监控整个系统中的服务。
一致性算法:指定了每个系统使用的一致性算法。ZooKeeper使用ZAB(ZooKeeper Atomic Broadcast),Nacos和Consul使用RAFT。
服务发现:表示系统是否支持动态服务发现(其他服务通过服务注册中心查询服务信息,从而能够动态地调用其他服务而无需硬编码依赖)。所有四个系统都支持服务发现。
服务注册:表示系统是否支持服务注册(微服务启动时将自身信息注册到服务注册中心,包括服务名称、IP地址、端口号、健康状态等)。所有四个系统都支持服务注册。
健康检查:表示系统是否支持对服务实例的健康状态检查(定期检查服务实例的健康状态,包括运行状态、响应时间等,将不健康的实例从服务发现中移除,避免向其分发请求)。所有四个系统都支持健康检查。
负载均衡:表示系统是否提供负载均衡功能(负载均衡是指在多个服务实例之间分配请求的过程,以确保系统能够处理更多的请求并提高可靠性。比如,将请求均匀地分发到多个服务实例,避免某个实例过载或故障时影响整体服务可用性)。Consul内置了负载均衡,而其他系统大多依赖于客户端实现或第三方组件。
一致性保证:描述系统的一致性级别(系统在数据更新和分布式事务处理中的一致性级别。强一致性意味着在任何时刻,所有节点都能看到最新的数据,而一致性稍低的系统可能会在一段时间内存在数据不一致的情况)。ZooKeeper和Consul提供强一致性,Nacos和Consul提供一致性。
雪崩效应:指系统是否可能在某些条件下导致雪崩效应(多个服务实例在同一时间发生故障或不可用时,可能导致请求在系统中积累,最终导致整个系统不可用的情况。为了避免雪崩效应,系统设计通常包括故障隔离、超时控制、限流等策略)。各系统在架构设计和实现上采取不同措施来避免雪崩效应。
K8s集成:指系统是否直接支持和集成到Kubernetes中(一个系统是否直接支持和集成到Kubernetes容器编排平台中。Kubernetes可以管理和调度大规模的容器化应用,通过其服务发现、负载均衡等功能简化了微服务的部署和管理)。
配置管理:指系统是否提供配置管理功能(集中管理微服务的配置信息,确保不同环境(开发、测试、生产)的配置能够灵活切换和管理,减少人工操作和错误)。
五. 常用注册中心的区别:
Zookeeper: 最早流行的开源分布式协调服务框架之一,提供了分布式配置中心的功能。以高可用,一致性和可靠信著称,需要用户自己来开发实现分布式配置的功能。
ZooKeeper本身提供了一些基础的原语(如创建节点、写入数据、监听节点变化等),可以用于构建更高级的分布式系统和应用。但是,要实现一个完整的分布式配置中心,需要用户编写代码来管理和维护配置信息的存储、读取、更新和同步。这些功能包括:
配置管理:设计和实现配置的存储结构,如何将应用的配置信息存储在ZooKeeper节点上。
配置更新:监控配置的变化,并在配置更新时通知相关的应用程序。
版本控制:确保配置的一致性和可靠性,可能需要实现版本管理机制。
安全性:对配置信息的访问进行权限控制,确保只有授权的应用程序可以读取或修改配置。
因此,尽管ZooKeeper提供了可靠的基础设施来处理分布式系统中的协调问题,但用户仍需要自行开发额外的代码来利用这些基础设施构建特定于自己应用的分布式配置管理功能。
Nocos: 阿里巴巴开源的服务注册中心和配置中心,自带了配置中心功能,提供了更多可视化配置管理工具。
Eureba NetFlix开源的服务注册中心,被广泛应用在Spring Cloud微服务架构中。提供了易于使用的REST API 和web界面,支持基于Region与Zone的服务分组与负载均衡。
Consul: HashiCorp开源的服务注册中心和配置中心,提供了服务发现,健康检查,KV存储和多数据中心功能,有更丰富的健康检查和路由功能与丰富的API和WEB UI。
六.ZAB(ZooKeeper Atomic Broadcast)和RAFT
ZAB(ZooKeeper Atomic Broadcast)和RAFT都是一致性协议,用于确保分布式系统中多个节点之间的数据一致性和顺序性。
ZAB(ZooKeeper Atomic Broadcast):
ZAB是ZooKeeper中使用的一致性协议,它的设计目标是提供高可用性和严格的顺序一致性。ZAB的目标是提供强一致性,即所有节点在同一时间看到相同的数据状态。它通过选举Leader和使用基于日志的复制机制来保证这一点。
ZAB主要特点:
领导者选举: ZooKeeper集群中的一个节点被选举为Leader,负责处理客户端请求和更新操作。
原子广播: Leader接收客户端的写请求,并通过ZAB协议将其原子性地广播给所有的Follower节点。
基于日志的复制: Leader将每一个事务请求转换为一个事务提案,并将这些提案通过一种类似Paxos的协议进行广播,确保所有Follower按照相同的顺序接收和应用这些提案。
RAFT:
RAFT是一种由Diego Ongaro 和 John Ousterhout 提出的分布式一致性算法,目标是提供易理解和易实现的一致性协议。RAFT通过领导者选举和日志复制机制提供了一种可理解和实现的分布式一致性解决方案,广泛用于诸如Nacos和Consul等系统中。
RAFT的主要特点:
领导者选举: RAFT集群中的每个节点都可以是Candidate、Leader或Follower。选举Leader的过程通过投票来完成,确保每个任期内只有一个Leader。
领导者日志复制: Leader负责接收客户端的写请求,并将这些请求作为日志条目追加到其日志中。Leader通过RPC将这些条目复制到所有的Follower节点上。
安全性: RAFT确保只有在大多数节点确认了条目追加操作后,该条目才被视为已提交,从而保证数据的一致性和持久性。
ZAB和RAFT比较:
复杂度与实现: RAFT相对于ZAB来说更易于理解和实现,因此在许多新兴的分布式系统中得到了广泛应用,如Nacos和Consul。
历史与稳定性: ZAB在ZooKeeper中有着长时间的实际应用和稳定性验证,适用于需要强一致性和高可用性的场景。