在分布式架构的系统中注册中心这个概念就已经被提出了,最经典的就是Zookeeper中间件。
微服务架构中,注册中心是最核心的基础服务之一,注册中心可以看做是微服务架构中的通信中心,当一个服务去请求另一个服务时,通过注册中心可以获取该服务的状态,地址等核心信息。
服务注册主要关系到三大角色:服务提供者、服务消费者、注册中心。
2、流程和原理基础流程
服务启动时,将自身的网络地址等信息注册到注册中心,注册中心记录服务注册数据。
服务消费者从注册中心获取服务提供者的地址,并通过地址和基于特定的方式调用服务提供者的接口。
各个服务与注册中心使用一定机制通信。如果注册中心与服务长时间无法通信,就会注销该实例,这也称为服务下线,当服务重新连接之后,会基于一定的策略在线上线。
服务地址相关信息发生变化时,会重新注册到注册中心。这样,服务消费者就无需手工维护提供者的相关配置。
核心功能
通过上面的基本流程,不难发现一个注册中心需要具备哪些核心功能:
服务发现
服务发现是指服务在启动后,注册到注册中心,服务方提供自身的元数据,比如IP地址、端口、运行状况指标的Uri 、主页地址等信息。
服务记录
记录注册中心的服务的信息,例如服务名称、IP地址、端口等。服务消费方基于查询获取可用的服务实例列表。
动态管理服务
注册中心基于特定的机制定时测试已注册的服务,例如:默认的情况下会每隔30秒发送一次心跳来进行服务续约。通过服务续约来告知Server该Client仍然可用。正常情况下,如果Server在90 秒内没有收到Client 的心跳,Server会将Client 实例从注册列表中删除。
二、基础组件对比 1、Zookeeper组件1.1基础描述
ZooKeeper是非常经典的服务注册中心中间件,在国内环境下,由于受到Dubbo框架的影响,大部分情况下认为Zookeeper是RPC服务框架下注册中心最好选择,随着Dubbo框架的不断开发优化,和各种注册中心组件的诞生,即使是RPC框架,现在的注册中心也逐步放弃了ZooKeeper。在常用的开发集群环境中,ZooKeeper依然起到十分重要的作用,Java体系中,大部分的集群环境都是依赖ZooKeeper管理服务的各个节点。
1.2组件特点
从Zookeeper的数据结构特点看,并不是基于服务注册而设计的,ZooKeeper提供的命名空间与文件系统的名称空间非常相似,在数据结构上高度抽象为K-V格式,十分通用,说到这里不得不提一下Redis,也可以作为注册中心使用,只是用的不多。
ZooKeeper组件支持节点短暂存在,只要创建znode的会话处于活动状态,这些znode就会存在,会话结束时,将删除znode。Dubbo框架正是基于这个特点,服务启动往Zookeeper注册的就是临时节点,需要定时发心跳到Zookeeper来续约节点,并允许服务下线时,将Zookeeper上相应的节点删除,同时Zookeeper使用ZAB协议虽然保证了数据的强一致性。
2、Eureka组件2.1基础描述
SpringCloud框架生态中最原生的深度结合组件,Eureka是Netflix开发的服务发现框架,基于REST的服务,主要用于服务注册,管理,负载均衡和服务故障转移。但是官方声明在Eureka2.0版本停止维护,不建议使用。
2.2组件特点
Eureka包含两个组件:EurekaServer和EurekaClient。
EurekaServer提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。Eureka允许在注册服务的时候,自定义实现检查自身状态的是否健康的方法,这在服务实例能够保持心跳上报的场景下,是一种比较好的体验。
EurekaClient是一个java客户端,用于简化与EurekaServer的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
3、Consul组件3.1基础描述