Eureka的一些概念
Register-服务注册
当Eureka Client向Eureka Server注册的时候,client会向server提供自身的元数据信息,如:IP地址、端口、运行状况
Renew-服务续约
client每个30秒向server发送信息告知server服务正常,如果在90秒内,server没有收到client的消息,server默认client已下线,将client实例从服务列表中删除
Fetch Registries-获取服务注册列表信息
client向server注册成功后,会从server上获取服务的注册列表,当client需要访问其他服务的时候,就是从服务的注册列表中获取其他服务的信息;client默认每30秒从server更新注册列表的信息
Cancel-服务下线
client主动发送下线请求,server将client实例从服务注册列表中删除
Eviction-服务剔除
当server在90秒内没有收到client的消息通知,server就会将client从注册列表中剔除
源码了解
client服务启动时,创建DiscoveryClient对象(图1),DiscoveryClient对象维护着scheduler、heartbeatExecutor、cacheRefreshExecutor等线程池,通过调用initScheduledTasks()启动线程,进行服务注册、服务续约的一系列功能。
线程池信息
initScheduledTasks()
initScheduledTasks方法最后设置线程启动
线程的run方法默认调用discovery的方法,进行服务注册和服务列表更新
服务注册的信息
流程如下:
1.discoveryClient实例创建,构建线程池,指定线程任务;
2. InstanceInfoReplicator这个对象实现线程接口,作为线程任务调用调用模板,调用discoveryClient的register等方法进行服务注册。
discoveryClient下的其他方法分别实现不同的功能
fetchRegistry()获取服务注册列表
renew()续约
server方记录服务注册信息于AbstractInstanceRegistry的registry中
client通过调用server的接口ApplicationResource,将服务信息注册到server上
server通过PeerAwareInstanceRegistryImpl的register()实现集群信息的同步
注意事项
- Eureka Client启动后并非马上向server注册,存在默认40秒的延迟,在initScheduledTasks方法最后
- Eureka Server存在响应缓存,注册的实例不能马上就出现在服务注册列表中
- Eureka Client保留注册表信息的缓存,缓存每30秒更新一次,因此Eureka刷新本地缓存并发现其他新注册的实例可能需要30秒
- Ribbon的负责均衡器从本地的EurekaClient获取服务注册列表信息,而Ribbon本身也维护了缓存,此缓存每30秒刷新一次。
Eureka自我保护模式
当一个新的Eureka Server加入到集群的时候,会自动从相邻的Peer节点获取服务实例的信息,如果从当前的Peer节点获取信息失败,就会从下一个节点获取,直到获取成功,此时Server会设置服务续约的阈值,如果Server接收到的服务续约信息低于阈值,就会启动自我保护模式,不再剔除注册列表的信息。以防止因为Server自身的网络问题导致Client不能被其他服务消费
关闭Eureka自我保护模式:
eureka:
server:
enable-self-preservation: false
Eureka集群构建
略
server只会向server-url配置指定server同步信息