2018/08/29 Communication between Eureka Server and Client

Eureka Server 和 Eureka Client 之间是通过一组 API 进行通信的,包括服务注册(registry),续约(renew),退出(cancel)和剔除(evict)。

注册

Eureka Client 启动之后首先会向 Eureka Server 进行注册,注册流程如下:

  1. Client 通过 POST /eureka/v2/apps/{appID} 向 Server 发起注册请求;

    mark

    mark

    mark

  2. Server 收到请求后,用双层 HashMap 保存注册信息;

    mark

    mark

  3. 更新自我保护机制阈值 expectedNumberOfRenewsPerMinnumberOfRenewsPerMinThreshold ;

    mark

    • expectedNumberOfRenewsPerMin ,期望最大每分钟续租次数。
    • numberOfRenewsPerMinThreshold ,期望最小每分钟续租次数。
  4. 将服务名字放到 recentRegisteredQueue 中;

    mark

  5. 更新实例的状态;

    mark

  6. 将实例信息放到 recentlyChangedQueue 中;

    mark

  7. 通过 invalidate() 清除 guava 缓存;

    mark

  8. 向相邻节点复制信息。

续约

Eureka Client 注册到 Eureka Server 后,需要定期(每30s)发送心跳来维持通信。如果超时未收到心跳,服务器会认为服务不可用,从而将 Eureka Client 的注册信息从服务器删除。Renew 的流程如下:

  1. Eureka Client 通过定时任务向服务器发起 renew 请求
    mark
    mark
  2. Eureka Server 收到请求后会更新该 Client 的更新时间
    mark
    更新最小分钟数 renewsLastMin 和 最后更新时间
    mark
  3. Eureka Server 向相邻节点同步信息
    mark

剔除

在 Eureka Server 上未正常推出和超时未收到心跳的 Client 注册信息会被剔除。 Evict 的流程如下:

  1. 初始化环境和上下文
    mark
  2. 从相邻节点同步注册信息
    mark
  3. 更新自我保护阈值
    mark
  4. 创建 evictionTask
    mark
    mark
  5. 判断是否过期
    mark
    mark
    mark
  6. 计算剔除的数量并随机删除
    mark
  7. 更新缓存

退出

退出是 Eureka Client 主动向服务通知服务关闭的操作,流程如下:

  1. Eureka Client 向服务器发送 cancel 请求
    mark
  2. Eureka Server 收到请求后,将实例从服务列表中删除
    mark
    将实例信息放到 recentlyChangedQueue 中,清空 guava 缓存
    mark
  3. 向相邻节点同步信息,更新阈值
    mark