1 从 Netfix 聊起

程序员男生居多,应该很多人爱看美剧,应该都或多或少听过Netfix 。Netfix 在美国或者全球来说都算是最优秀的视频点播公司,在对外提供视频播放的海量业务中,自然也催生了内部极为优秀的技术。这次要分享的 Eureka 也是他们的社区贡献的。

对于 Java 生态来说,目前国内主流的微服务框架都是 Dubbo 或者 SpringCloud,前些年Spring CLoud Netfix 应该蛮多,不过随着 Spring CLoud Netfix 系列组件逐渐停止迭代和维护,技术选型上已经不会倾向于使用 Spring Cloud Netfix 了。
新起之秀 Spring CLoud Alibaba 也许会成为未来的趋势,但有很多人会忧虑 Dubbo 当年停更的事件是否会重现。

谈起 Eureka,也许有些同学会混淆Netflix Eureka 与 Spring-Cloud-Netflix-Eureka:简单来说,可以认为 Spring-Cloud-Netflix-Eureka 在 Netfix 上又封装了一层。

2 源码结构

首先从 GitHub 上 clone 下 代码,采用的是 Gradle,核心大概分为以下几个部分:

  • eureka-client:eureka的客户端,注册到eureka上面去的一个服务,就是一个eureka client者,都是一个eureka客户端。
  • eureka-core:eureka的服务端,其实就是eureka的注册中心
  • eureka-resources:基于jsp开发的eureka控制台,在这个web页面上你可以看到各种注册服务
  • eureka-server:把eureka-client、eureka-core、eureka-resources打包成了一个war包,也就是说eureka-server自己本身也是一个eureka-client,同时也是注册中心,同时也提供eureka控制台。
  • eureka-examples:eureka使用的例子
  • eureka-test-utils:eureka的单元测试工具类
  • eureka-client-jersey2 和 eureka-core-jersey2: eureka为了方便自己,对 jersey 框架进行了一个封装,提供更多的功能,方便自己使用。eureka client 和 eureka server之间的通信,都是基于jersey 框架实现的(使用 http restful 接口)。

3 Eureka 原理

3.1 工作流程

  1. eureka server启动以及初始化
  2. eureka client启动以及初始化
  3. eureka client向eureka server进行服务实例的注册,eureka控制台可以看到注册的服务
  4. eureka client 全量抓取注册表,后续30s一次增量拉取。
  5. eureka server 接收请求,使用多级缓存,返回注册表信息
  6. eureka client 与 eureka server 基于心跳机制实现续约
  7. eureka client关闭,服务停止,需要调用自身的shutdown() 方法,将服务实例停止

3.2 服务启动流程

核心是基于读取到的环境配置、本地配置构建一个 PeerAwareInstanceRegistry(应用实例信息的注册表,这里面封装了注册相关的信息),最终构造出一个上下文(EurekaServerContext),通过这个 EurekaServerContext,可以读取server 配置、
应用实例信息的注册表以及Eureka-Server 集群节点集合等信息。

3.3 注册流程

核心也是通过 http 请求发送自身的注册信息, server 保存发送过来的信息到本地内存中。

3.4 拉取注册表

分为启动时全量拉取和启动之后定时增量拉取。

3.5 多级缓存机制

3.6 缓存过期机制

被动过期
主动过期
定时过期

3.7 eureka server 的自我保护机制

4 整体架构设计

5 一些可能值得说道的设计思想

配置管理器中的单例模式以及面向接口的配置读取方式
减少网络传输:基于hash 值校验增量拉取注册表
网络的不稳定性:自我保护机制

6 写在最后

回过头来,其实在 2021 年的今天,再来聊 Eureka,有点谈论历史的感觉,因为早在两年前, Eureka 2.X 就已经“流产”了,有社区本身的原因,但也从另一个方面说明 Eureka 没有持续的生命力。
现在已经很难想象七八年前 Martin fowler 提出 “微服务”这个概念时引起的震动,互联网的技术更新确实太快了,新名词层出不穷,Eureka 已经成为明日黄花,下一个该轮到谁。
这也让技术者思考:什么才是我们的核心生命力?