Eureka的三个核心要素
服务注册中心:提供服务的注册与发现
服务提供者:提供服务的应用,将自己提供的服务注册到服务注册中心,可供其他服务发现
服务消费者:消费者应用从服务注册中心拉取服务列表,从而获取服务提供者的地址
其实服务提供者也同样承担着服务消费者的角色,甚至服务注册中心在注册中心高可用的情况下也可以理解为一个服务提供者。
服务提供者
服务注册
服务提供者在启动的时候会发送REST请求到服务注册中心,将服务的服务名、ip、端口等信息发送到服务注册中心。
服务注册中心接收到这个消息之后,会将服务提供者的基本信息存储起来,供服务消费者拉取服务列表。
服务列表的存储格式是一个双层Map形式,Map第一层的key是服务注册名,第二层的key是具体的服务名,value是服务提供者的一些基本信息。
服务同步
由于单服务的不可靠性,所以服务注册中心可以支持多部署。
搭建高可用的服务注册中心的原理是搭建两个服务注册中心,让它们互相注册。
两个服务注册中心之间互相注册,当服务提供者向一个服务注册中心发送注册消息时,它会将该注册信息转发给另一台服务注册中心,从而同步两个服务注册中心的服务列表。
服务续约
在服务提供者注册成功之后,服务提供者和服务注册中心之间会维护一个心跳(由服务提供者来维护)来保证服务提供者的可用性,官方称之为Renewal。
同样的服务注册中心会定时检测服务提供者的可用性,对于不可用的服务提供者,服务注册中心会将其剔除。
关于服务续约有两个参数可以配置:
服务消费者
获取服务
在服务消费者启动的时候,会发送一个REST请求到服务注册中心,拉取服务列表。
关于获取服务有两个参数可以配置:
服务调用
服务消费者在获得服务列表之后,可以获得具体服务的IP、端口等信息。
使用Ribbon+RestTemplate可以采用轮询的方式去调用指定服务名的机器,以实现负载均衡。
服务下线
服务消费者在下线的时候会发送REST请求给服务注册中心,服务注册中心收到消息会更新已注册的服务列表,并将服务列表下发到所有已注册的服务。
服务注册中心
失效剔除
在已注册的服务不是正常下线的情况下,是无法向服务注册中心发送下线消息的,那么服务注册中心就无法将异常关闭的服务剔除出去,所以服务注册中心自己维护了一个剔除机制。
关于失效剔除有两个配置需要注意:
服务注册中心的
服务提供者的
自我保护机制
上面说过,服务提供者和服务注册中心之间会维护一个心跳,服务注册中心会根据服务提供者配置的心跳超时时间来剔除已注册的服务。
但是如果在短时间内大量的已注册服务维护的心跳时间超时,可能是网络波动导致的,不应该轻易的将服务剔除。
所以服务注册中心自己维护了一个自我保护机制,自我保护机制的工作机制是如果在15分钟内超过85%的服务提供者节点都没有正常的心跳,那么服务注册中心就认为客户端与注册中心出现了网络故障,服务注册中心自动进入自我保护机制,此时服务注册中心会:
不再剔除服务
仍然能接受新服务的注册和查看服务列表,但不会同步到集群中其他服务注册中心
当网络稳定后,将新的注册信息同步到其他服务注册中心
这里也有一个配置:
这个配置表示是否开启自我保护机制,默认为true,开发环境下可以关闭这个配置以实现自动剔除。
领取专属 10元无门槛券
私享最新 技术干货