01Eureka
Eureka
简单使用
1 | |
1 | |
Eureka概念
服务注册:Eureka Client会通过发送REST请求的方式向Eureka Server注册自己的服务,提供自身的元数据,比如 IP 地址、端口、运行状况指标的URL、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个ConcurrentHashMap中。
服务续约:在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。Eureka Client在默认的情况下会每隔30秒发送一次心跳来进行服务续约。实质上就是修改Lease对象里面的时间戳。
服务同步:Eureka Server之间会互相进行注册,构建Eureka Server集群,不同Eureka Server之间会进行服务同步,用来保证服务信息的一致性。
获取服务:服务消费者(Eureka Client)在启动的时候,会发送一个REST请求给Eureka Server,获取上面注册的服务清单,并且缓存在Eureka Client本地,默认缓存30秒。同时,为了性能考虑,Eureka Server也会维护一份只读的服务清单缓存,该缓存每隔30秒更新一次。
服务调用:服务消费者在获取到服务清单后,就可以根据清单中的服务列表信息,查找到其他服务的地址,从而进行远程调用。Eureka有Region和Zone的概念,一个Region可以包含多个Zone,在进行服务调用时,优先访问处于同一个Zone中的服务提供者。
服务下线:当Eureka Client需要关闭或重启时,就不希望在这个时间段内再有请求进来,所以,就需要提前先发送REST请求给Eureka Server,告诉Eureka Server自己要下线了,Eureka Server在收到请求后,就会把该服务状态置为下线(DOWN),并把该下线事件传播出去。
服务剔除:有时候,服务实例可能会因为网络故障等原因导致不能提供服务,而此时该实例也没有发送请求给Eureka Server来进行服务下线,所以,还需要有服务剔除的机制。Eureka Server在启动的时候会创建一个定时任务,每隔一段时间(默认60秒),从当前服务清单中把超时没有续约(默认90秒)的服务剔除。
自我保护:既然Eureka Server会定时剔除超时没有续约的服务,那就有可能出现一种场景,网络一段时间内发生了异常,所有的服务都没能够进行续约,Eureka Server就把所有的服务都剔除了,这样显然不太合理。所以,就有了自我保护机制,当短时间内,统计续约失败的比例,如果达到一定阈值(15%),则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。(根据已经注册的实例计算的预期心跳数和实际的对比)
服务端缓存:在服务端增量拉取和全量拉取都会走缓存,服务端缓存分为3级缓存,三级缓存的主要目的是为了解决读写冲突。三级缓存是只读缓存(ConcurrentMap<Key, Value> readOnlyCacheMap),有一个线程每30s对比二级缓存(二级缓存没有就去以及缓存),更新自己的三级缓存。所以三级缓存存在30s的误差。二级缓存是guava提供的 LoadingCache<Key, Value> readWriteCacheMap,没有误差,每次有更新操作的时候都会让缓存中的数据失效,二级缓存的数据设置了过期时间默认为180s。一级缓存是ConcurrentHashMap<String, Map<String, Lease
客户端缓存:客户端同样也是维护了一个Instance缓存,单独开一个线程,默认每30s去服务端拉取数据,然后同步到本地缓存,也会存在30s的误差,所以如果服务端开启三级缓存,就会发生最多1分钟的延迟,以及后面ribbion也会做缓存30s,还会有更长的延迟。
Region、Zone:eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS:region:可以简单理解为地理上的分区,比如上海地区,或者广州地区,再或者北京等等,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。zone:可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以在此region之下划分出zone1,zone2两个zone。一个机房内的服务优先调用同一个机房内的服务,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用
VIP:在客户端配置vip,可以实现客户端只去拉取配置了vip的注册信息,多个用逗号分割

Eureka-Server主要原理




这里主要是初始化一个Jersey Web服务器,后面注册,同步,下线等等都是使用Http请求完成
1 | |
服务注册
1 | |
生成全量的注册信息
1 | |
获取增量数据
1 | |
Eureka-Client


1 | |
拉取注册
1 | |
注册
1 | |
发送心跳
1 | |
刷新缓存
1 | |
如何在Client获取注册信息
1 | |
Eureka常用配置
通用配置
1 | |
eureka.server
1 | |
eureka.instance
1 | |
eureka.client
1 | |