注册中心笔记
1、为什么要用注册中心
微服务架构中,微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果依靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来了很大的问题。
2、什么是注册中心
注册中心可以说是微服务架构中的"通讯录",它记载了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其他服务时,就到这里找到服务的地址,进行调用。
3、注册中心的功能
-
服务注册表
服务注册表示注册中心的核心,他用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询api和管理api,查询api用于查询可用的微服务实例,管理api用于服务的注册与注销。
-
服务注册与发现
服务注册是指微服务在启动时,将自己的信息注册到注册中心的过程。服务发现是值查询可用的微服务列表级网络地址的机制。
-
服务检查
注册中心使用一定的机制定时检测已经注册的服务,如发现某实例长时间无访问,就会从服务注册表移除该实例。
4、服务提供者,服务消费者,注册中心三者关系
微服务架构服务调用中主要涉及到三个角色:服务提供者,服务消费者,注册中心。
- 各个微服务在启动时,将自己的网络地址,接口,可以提供的服务等信息注册到注册中心,在注册中心存放这些数据。
- 服务消费者需要调用某个其他服务器的服务时,会从注册中心查询服务提供者的地址,并且通过该地址调用服务提供者的接口。
- 各个微服务与注册中心使用一定的机制进行通信,比如心跳机制,每隔一段时间向注册中心进行一次通信,如果注册中心与某个微服务长时间无法通信,就会注销该实例。
- 微服务的网络地址发生变化时,比如增加实例或ip发生变动是,都会重新注册到注册中心,这样服务消费者就无需人工修改提供者的网络地址了。
5、注册中心架构图
服务消费者和服务提供者都是整个架构中微服务的一部分,只不过在某个服务调用过程中有了一个”主从“关系。
每个微服务在启动的时候,都需要将自己的网络地址,服务接口等信息注册到注册中心,注册中心的管理api来存储这些数据,微服务都通过心跳机制同注册中心保持通信,来告诉注册中心,自己一直在保持工作,一直可以被调用。
微服务同时通过向注册中心定时拉取(pull)注册中心的查询api,来查询记录可用的微服务实例。当某个微服务需要调用另一个微服务工作时,这时候这两者之间才会出现角色的区别,调用的一方即服务消费者,被调用的一方即服务提供者。
服务消费者首先从本地缓存中查找,是否能找到需要的微服务的地址,如果没有,会pull注册中心的”通讯录“来查找需要的微服务的地址,找到之后,就可以进行调用。
问题:
-
如果服务消费者之前已经调用过服务提供者,当服务提供者更换网络地址或更改实例信息等,是怎么调用的?
答:当服务提供者有更换网络地址或更改实例信息等变化时,原地址和注册中心的通信机制会失效,在注册中心的等待时间结束后依旧没有收到来自原地址的通信包时,注册中心就会判定这个地址已经失效,删除这个地址的信息。在这个失效的过程中,有服务消费者需要调用这个服务,就会调用失败,因为现在服务提供者因为”失联“信息已经被删除,无调用地址,这个服务调用请求失败。如果这个服务提供者在更改活动完成之后还能和注册中心保持通信,在更改之后会第一时间向注册中心进行”登记“,来报告,自己现在在哪,能干什么,此时注册中心的通讯录中有了这个服务提供者的注册信息。在服务消费者定时的pull后,找到了服务提供者的最新信息,就可以进行调用,这个调用过程完成。
6、主流的注册中心
- Eureka
- Zookeeper
- consul
- etcd等
7、分布式应用的CAP理论
CAP理论指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得。
- 一致性(C) 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(所有节点在同一时间的数据完全一致,越多节点,数据同步越耗时)
- 可用性(A) 负载过大后,集群整体是否还能响应客户端的读写请求。(服务一直可用,而且是正常响应时间)
- 分区容错性(P) 分区容忍性,就是高可用性,一个节点崩了,并不影响其它的节点。(100个节点,挂了几 个,不影响服务,越多机器越好)
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡。
概述:
一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。
提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。
然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
总的来说就是,因为网络故障几率的存在,要保证数据的可用就要存在尽可能多的节点上,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。