1.再回顾一下:什么是服务注册中心?先回顾一下什么是服务注册中心?顾名思义,假设你有一个分布式系统,其中包含部署在不同机器上的多个服务,然后这些不同机器上的服务需要相互调用。让我们举一个现实的例子。例如电商系统中的订单服务需要调用库存服务,如下图所示。现在的问题是订单服务在192.168.31.154机器上,库存服务在192.137.1.33机器上。现在订单服务要调用库存服务,但是他不知道库存服务在哪台机器上!毕竟人在不同的机器上。所以这个时候,服务注册中心就需要出现了。这时候你的系统架构需要引入一个独立部署在一台机器上的服务注册中心,如下图所示。那么订单服务、库存服务等兄弟需要配置服务注册中心部署在哪台机器上,比如192.168.31.45。然后在自己启动订单服务和库存服务的时候,要向服务注册中心发送请求,进行服务注册。换句话说,你必须告诉服务注册中心你是哪个服务,然后你将它部署在哪台机器上。然后服务注册中心会将注册的信息放到注册表中,如下图所示。那么如果订单服务要调用库存服务,那就去服务注册中心问:你能告诉我库存服务部署在哪台机器上吗?服务注册中心知道这个信息,所以会告诉订单服务:库存服务部署在192.1371.133这台机器上,所以你可以向这台机器发送请求。然后,订单服务可以向库存服务的机器发送请求,完成服务之间的调用。整个流程如下图所示:以上就是服务注册中心的作用、地位和意义。现在大家应该知道服务注册中心的作用了。好的!那我们就来看看Consulasaserviceregistry。它的架构设计原则是什么?2、Consul服务注册中心整体架构如果要使用Consul作为服务注册中心,首先要在每个服务所在的机器上部署一个ConsulAgent,作为服务所在机器的代理。然后你要在多台机器上部署ConsulServer,这是核心的服务注册中心。这个ConsulAgent可以用来收集你的服务信息并发送给ConsulServer,它也会不断地向你的服务发送请求来检查它是否健康。那么当你想发现其他服务时,ConsulAgent也会帮你转发请求到ConsulServer去查询其他服务所在的机器。ConsulServer一般需要部署3到5台机器来保证高可用和数据一致性。它们之间会自动实现数据同步,ConsulServer集群会自动选出一台机器作为leader,其他ConsulServer为follower。我们先看下图,先感受一下这个Consul的整体架构。3、Consul是如何通过Raft协议实现强一致性的?首先,上一篇文章:《??替代Eureka,你可以试试Consul??》正如我所说,Eureka服务注册中心不保证数据一致性。在这种情况下,很有可能你注册的服务不会被其他人发现,或者很晚才被发现。OK,那我们就来说说Consul是如何实现数据一致性的。首先大家知道ConsulServer部署集群,他会选举一个Server作为Leader。接下来,各个服务发送的注册请求都会发送给Leader,由Leader同步给其他Follower。那么首先,LeaderServer肯定有最新的服务注册信息,不是吗?比如库存服务发起注册,那么LeaderServer上肯定有库存服务的注册信息。那么比如订单服务要查找库存服务,就会向LeaderServer发送查询请求。这样,服务注册和发现都是通过一个LeaderServer来进行的,可以保证服务注册数据的强一致性。请看下图。那么大家就想,万一注册inventory服务的时候数据刚写到leaderserver,导致leaderserver宕机了,这时候怎么办?那么此时这条注册数据就丢失了,订单服务找不到库存服务。没关系,这里Consul会基于Raft协议来解决这个问题。首先,库存服务向LeaderServer注册时,会采用Raft协议,要求LeaderServer将这个注册数据复制到大部分FollowerServer才算成功。这样就保证了如果你认为你注册成功了,那么一定有多个ConsulServer有这个注册数据。如果你只是发给LeaderServer,他就崩溃了,那么这个注册就算失败了。此时ConsulServer集群会重新选举一个LeaderServer,需要重新重新注册。这样就可以保证你注册成功的数据永远不会丢失,然后其他人发现该服务时,就可以从LeaderServer获取到最新的强一致性注册数据。整个过程如下图所示:从上图可以看出,只要注册强制同步到大部分基于Raft协议的服务器,即使leader挂了,也会选举出新的leader。这样其他人就可以从新的LeaderServer发现你的服务,所以数据是绝对强和一致的。4、Consul是如何通过Agent实现分布式健康检查的?最后说一下Consul是如何通过在每台服务机上部署Agent来实现分布式健康检查的。中心化的心跳机制,比如传统的Eureka,要求每个服务定时向EurekaServer发送心跳。如果一段时间内没有收到心跳,则认为该服务已宕机。但是这种中心化的心跳机制会给EurekaServer带来很大的心跳请求压力。事实上,EurekaServer收到的请求最多的请求之一就是数千个服务发送的心跳请求。因此Consul在这方面优化了架构,引入了Agent的概念。每台机器上的ConsulAgent会不断发送请求,检查服务是否健康,是否宕机。如果服务宕机,ConsulServer会收到通知。这个怎么样?有没有发现各个服务不再需要向服务器发送心跳请求了?减轻这部分Server的压力吧?没错,这就是Consul基于代理的分布式健康检查机制,可以大大减轻服务器端的压力。这样即使只部署三五台机器,也可以轻松支撑上千个服务。再来一张图,我们来看一下:
