前言
一套微服务架构的系统由很多单一职责的服务单元组成,而每个服务单元又有众多运行实例。由于各服务单元颗粒度较小、数量众多,相互之间呈现网状依赖关系,因此需要服务注册中心来统一管理微服务实例,维护各服务实例的健康状态。
什么是服务注册与发现
从宏观角度,微服务架构下的系统角色可以简单分为注册中心、服务提供者、远程客户端组件。
什么是服务注册呢?服务注册是指服务提供者将自己的服务信息(如服务名、IP地址等)告知服务注册中心。
什么是服务发现呢?注册中心客户端组件从注册中心查询所有服务提供者信息,当其他服务下线后,注册中心能够告知注册中心客户端组件这种变化。
远程客户端组件与服务提供者之间一般使用某种RPC通信机制来进行服务消费,常见的RPC通信方式为REST API,底层为HTTP传输协议。服务提供者通常以Web服务的方式提供REST API接口;远程客户端组件则通常以模块组件的方式完成REST API的远程调用。
注册中心、服务提供者、远程客户端组件之间的关系大致如下图所示。
注册中心的主要功能如下:
- (1)服务注册表维护:此功能是注册中心的核心,用来记录各个服务提供者实例的状态信息。注册中心提供Provider实例清单的查询和管理API,用于查询可用的Provider实例列表,管理Provider实例的上线和下线。
- (2)服务健康检查:注册中心使用一定机制定时检测已注册的Provider实例,如发现某实例长时间无法访问,就会从服务注册表中移除该实例。
服务提供者的主要功能如下:
(1)服务注册:是指Provider微服务实例在启动时(或者定期)将自己的信息注册到注册中心的过程。
(2)心跳续约:Provider实例会定时向注册中心提供“心跳”,以表明自己还处于可用的状态。当一个Provider实例停止心跳一段时间后,注册中心会认为该服务实例不可用了,就会将该服务实例从服务注册表中剔除。如果被剔除掉的Provider实例过了一段时间后又继续向注册中心提供心跳,那么注册中心会把该Provider实例重新加入服务注册表中。 - (3)健康状况查询:Provider实例能提供健康状况查看的API,注册中心或者其他的微服务Provider能够获取其健康状况。服务提供者的服务注册和心跳续约一般都会通过注册中心客户端组件来完成。
注册中心客户端组件还有如下功能:
- (1)服务发现:从注册中心查询可用Provider实例清单。
- (2)实例缓存:将从注册中心查询的Provider实例清单缓存到本地,不需要在每次使用时都去注册中心临时获取。
总体来说,注册中心、服务提供者需要作为独立应用进行部署和运行,而注册中心客户端组件、远程客户端组件则不同,它们一般会作为一个模块组件被服务提供者所使用。
Spring Cloud生态体系中存在多种注册中心框架,例如Eureka、Nacos、Consul、ZooKeeper等。本书将以Eureka为例讲解注册中心的使用。