微服务注册中心之Zookeeper,Eureka,Nacos,C

2023-05-15  本文已影响0人  上善若泪

1 微服务注册中心

微服务的注册中心目前主流的有以下五种:ZookeeperEurekaConsulNacosKubernetes

1.1 注册中心概念

1.1.1 为什么需要注册中心

随着单体应用拆分,首当面临的第一份挑战就是服务实例的数量较多,并且服务自身对外暴露的访问地址也具有动态性。可能因为服务扩容、服务的失败和更新等因素,导致服务实例的运行时状态经常变化,如下图:


image.png

商品详情需要调用营销、订单、库存三个服务,存在问题有:

解决第一个问题办法就是加一个中间,这个中间层就是我们的注册中心。
解决第二问题就是关于负载均衡的实现,这个需要结合中间层来实现。

1.1.2 如何实现一个注册中心

对于如何实现注册中心这个问题,首先将服务之间是如何交互的模型抽象出来,我们结合实际的案例来说明这个问题,以商品服务为例:

由此我们需要引入的三个角色就是:中间层(注册中心)、生产者、消费者,如下图:


image.png

整体的执行流程如下:

上图还多一个设计缓存本地路由,缓存本地路由是为了提高服务路由的效率和容错性,服务消费者可以配备缓存机制以加速服务路由。更重要的是,当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。
在整个执行的过程中,其中有点有一点是比较难的,就是服务消费者如何及时知道服务的生产者如何及时变更的,这个问题也是经典的生产者消费者的问题,解决的方式有两种:

对于如何选择这两种方式,其实还有一个数据一致性问题可以聊聊,比如选择定时器肯定就抛弃了强一致性,最后要求的是最终一致,这里就不深入展开了,另外你可能还会说服务的移除等等这些功能都没介绍,在我看来那只是一个附加功能,注册中心重点还是在于服务注册和发现,其他都是锦上添花罢了。


image.png

1.1.3 如何解决负载均衡的问题

负载均衡的实现有两种方式:

对于实现的方案来说本质上是差不多的,只是说承接的载体不一样,一个是服务端,一个客户端,如下图:


image.png

服务端的负载均衡,给服务提供者更强的流量控制权,但是无法满足不同的消费者希望使用不同负载均衡策略的需求。
客户端的负载均衡则提供了这种灵活性,并对用户扩展提供更加友好的支持。但是客户端负载均衡策略如果配置不当,可能会导致服务提供者出现热点,或者压根就拿不到任何服务提供者。
服务端负载均衡典型的代表就是 Nginx,客户端负载均衡典型代表是Ribbon,每种方式都有经典的代表,我们都是可以深入学习的。

常见的负载均衡器的算法的实现,常见的算法有以下六种:

1.2 注册中心如何选型

现在注册中心的选择也是五花八门,现阶段比较流行有以下几种:


image.png

在介绍这个之前大家有些需要了解的知识有CAPPaxosRaft 算法这里我就不进行过多介绍了。开始介绍以上5种实现注册中心的方式。

1.2.1 Zookeeper

这个说起来有点意思的是官方并没有说他是一个注册中心,但是国内 Dubbo 场景下很多都是使用Zookeeper来完成了注册中心的功能。
点击了解zookeeper深入理解其原理

1.2.2 Eureka

点击了解SpringCloud之Eureka原理

1.2.3 Nacos

点击了解Nacos原理

1.2.4 Consul

ConsulHashiCorp 公司推出的开源工具,ConsulGo 语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。

Consul的特点:

Consul 支持多数据中心,在上图中有两个DataCenter,他们通过Internet互联,同时请注意为了提高通信效率,只有Server节点才加入跨数据中心的通信。

在单个数据中心中,Consul分为ClientServer两种节点(所有的节点也被称为Agent),Server节点保存数据,Client负责健康检查及转发数据请求到ServerServer节点有一个Leader和多个FollowerLeader节点会将数据同步到 FollowerServer 的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader

集群内的Consul节点通过gossip协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。单个数据中心的流言协议同时使用TCPUDP通信,并且都使用8301端口。跨数据中心的流言协议也同时使用TCPUDP通信,端口使用8302。
集群内数据的读写请求既可以直接发到Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点,在允许数据延时的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。

Consul其实也可以在应用内进行注册,后续采用Spring Cloud全家桶这套做负载

我们这里聊聊关于Consul的应用外的注册:


image.png

上图主要多出来两个组件,分别是RegistratorConsul Template,接下来我们介绍下这两个组件如何结合可以实现在应用发进行服务发现和注册。

整体架构图可能是这样


image.png

我们用 Registrator 来监控每个Server的状态。当有新的Server启动的时候,Registrator会把它注册到Consul这个注册中心上。

由于Consul Template已经订阅了该注册中心上的服务消息,此时Consul注册中心会将新的Server信息推送给Consul TemplateConsul Template则会去修改nginx.conf的配置文件,然后让Nginx重新载入配置以达到自动修改负载均衡的目的。

1.2.5 Kubernetes

Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。

Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产环境运行工作负载15年的经验,并吸收了来自于社区的最佳想法和实践。
Kubernetes经过这几年的快速发展,形成了一个大的生态环境,Google在2014年将Kubernetes作为开源项目。

Kubernetes的关键特性包括:

Kubernetes属于主从分布式架构,主要由Master NodeWorker Node组成,以及包括客户端命令行工具Kubectl和其它附加项。

Master Node:作为控制节点,对集群进行调度管理,Master主要由三部分构成:

image.png

Worker Node:作为真正的工作节点,运行业务应用的容器;Worker Node主要包含五部分:

上一篇 下一篇

猜你喜欢

热点阅读