eureka server 解析

实例信息  InstanceInfo

Eureka Server端实例存储结构

      双层线程安全的HashMap。第一层是app层,key为app_name. 第二层为instance层,key为instanceId,value为Lease对象,也就是具体的服务了。Lease其实是对InstanceInfo的包装,里面保存了实例信息以及一些实例服务注册相关的时间。如注册时间registrationTimestamp、最新的续约时间lastUpdateTimestamp等。

ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry  = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();

存储覆盖状态
protected final ConcurrentMap<String, InstanceStatus> overriddenInstanceStatusMap = CacheBuilder
        .newBuilder().initialCapacity(500)
        .expireAfterAccess(1, TimeUnit.HOURS)
        .<String, InstanceStatus>build().asMap();

实例状态枚举:InstanceInfo.InstanceStatus

UP    正常服务状态
DOWN  当健康检查为失败时,失败的状态转为DOWN
STARTING  实例初始化状态,此状态主要给实例留初始化时间
OUT_OF_SERVICE 不参与接受服务,但状态正常
UNKNOWN  未知状态

服务端注册类:  InstanceRegistry -> PeerAwareInstanceRegistryImpl

eureka通过Rest对外提供接口,在EurekaServerAutoConfiguration类中有申明一个jerseyApplication,可以暴露com.netflix.eureka.resources中的Resource供外部调用。比如erueka中的服务端数据同步等等。

EurekaController类暴露了基本的接口,比如eureka-server访问的页面URL,展示applications列表。

其中cred-leaseservice-84466c888-bjwqr:addr-service:8080 这种为InstanceInfo的id.对instace操作都需要使用该instaceId.

查看Aplication信息: http://eureka.dev.bkjk.cn/eureka/apps/UUS-UUS

查看instance信息:  http://eureka.dev.bkjk.cn/eureka/instances/uus-6d79dcb6f-q9ww8:uus-uus:8080

状态覆盖

       eureka引入overriddenStatus来解决状态覆盖问题。

       可以用于解决一些外部的一些操作,在Netflix的Spinnaker里面就是用于red/black(红黑/蓝绿)部署的时候,先把指定服务设置为OUT_OF_SERVICE,停止接收请求,即变为black,之后新部署的服务启动起来,即为red。如果新服务正常,就可以关闭旧服务了,假设新服务出现问题,则立马删除旧服务。将原有服务的overriddenStatus删除掉,恢复UP,恢复接受流量。

       在客户端调用updateStatus方法时同时更新server端实例的status和overriddenStatus状态。

       客户端调用renew方法时,也要更新server端实例status和overriddenStatus状态。但是有一些规则:

       a.如果客户端上传的状态是starting或者down.表明客户端是重启或者healthcheck,此时这个实例不能作为服务提供服务。因此即使客户端调用updateStatus把实例状态更新为up,也是没用的。此时客户端实例的状态为down或者starting。       

       b.如果客户端的实例是up或者out_of_service,此时是不可信的。有可能client端的状态已被改变,此时要使用overriddenStatus转态作为当前实例的状态,避免被覆盖。

 

        在实际开发过程中,在eurekaAdmin控制台上,我们想强制下线某个服务,就需要用到状态覆盖。其实就是给应用实例设置另外一个状态。当续约,注册的时候,以这个覆盖状态为准。overriddenInstanceStatusMap存储应用的覆盖状态。

可以设置服务的上线下线

程序入口: com.netflix.eureka.resources.InstanceResource。

服务下线:PUT   http://127.0.0.1:8761/eureka/apps/MICROSERVICE-OPS-UI/10.241.6.169:microservice-ops-ui:8080/status?value=OUT_OF_SERVICE 

服务下线:PUT   http://127.0.0.1:8761/eureka/apps/MICROSERVICE-OPS-UI/10.241.6.169:microservice-ops-ui:8080/status?value=UP 

 

Eureka的evict机制(过期剔除机制)

      eureka server启动后,会开启一个evictTask,定时剔除任务(默认60S)。清理之前先判断是否需要清理(sLeaseExpirationEnabled())。这个判断方法首先会判断是否开启了自我保护开关,如果开启了,则会判断上一分钟的续约次数是否小于阀值。如果上一分钟的续约数量小于自我保护阀值,则开启自我保护机制,不进行服务剔除。

      过程:1.遍历register的数据结构,看是否过期,如果过期了保存到过期实例列表里面。

               2.计算要剔除的数量EvictNumber。

               3.循环EvictNumber,通过洗牌算法公平的随机剔除。(如果过期的实例数<最大剔除数则全部剔除)这里有自我保护机制,当大量需要剔除时候,eureka怀疑自己出了问题,为了避免出现误伤,开启了自我保护机制,只随机剔除一部分。

               4.剔除实例的时候首先在数据结构中找到该实例,然后将其清除。

               5.清除之后将清除实例添加到recentlyChangeQueue队列中。

               6.清除Guave缓存。

 

 Eureka的节点复制机制

      Eureka是一个AP的系统,满足最终一致性。过程中各个节点之间的数据允许存在差异,server提供了节点复制机制,来保证注册中心节点间的信息同步。

1.在Eureka Server服务启动时候,主动拉取其他节点的服务注册信息。 EurekaServerBootStrap调用PeerAwareInstanceRegistryImpl.syncUp()同步节点。

2.Eureka Server接收client的register,renew,cancel时,主动推送给其他节点。

转载于:https://my.oschina.net/u/3126880/blog/3085907

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值