⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/Eureka/project-structure/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Eureka 1.8.X 版本


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

本文主要分享 Eureka 的项目结构,附带部分简介和原理。

Eureka 项目地址:https://github.com/Netflix/eureka

  • 请注意下,不是 spring-cloud-netflix-eureka-client / spring-cloud-netflix-eureka-server
  • 笔者 Fork 的代码仓库 https://github.com/YunaiV/eureka,会随着这个系列的文章逐渐增加中文注释,可以先 Star 一下。

推荐 Spring Cloud 书籍

1.1 简介

Eureka 是 Netflix 开源的服务注册发现组件,分成 Client 和 Server 两部分。简化架构如下图:

  • Eureka-Server :通过 REST 协议暴露服务,提供应用服务的注册和发现的功能。
  • Application Provider :应用服务提供者,内嵌 Eureka-Client ,通过它向 Eureka-Server 注册自身服务。
  • Application Consumer :应用服务消费者,内嵌 Eureka-Client ,通过它从 Eureka-Server 获取服务列表。
  • 请注意下,Application Provider 和 Application Consumer 强调扮演的角色,实际可以在同一 JVM 进程,即是服务的提供者,又是服务的消费者。

1.2 项目结构

Eureka 项目结构如下:

❓❓❓不只 Eureka-Client 、 Eureka-Server ❓❓❓

淡定。我们一起来了解每个模块的功能和结构。

2. eureka-client

eureka-client 模块为 Eureka-Client 的功能实现:

  • com.netflix.appinfo 包:Eureka-Client 的应用配置。此处的应用指的就是上文提到的 Application Provider,Application Consumer。
  • com.netflix.discovery 包:Eureka-Client 的注册与发现相关功能。
    • com.netflix.discovery.DiscoveryClient 类:注册发现客户端实现类。

    • com.netflix.discovery.guice 包:Eureka 计划使用 Google Guice 实现依赖注入,参见本文「5.1 eureka-server-governator」。一方面 Guice 是轻量级的依赖注入框架,另一方面避免和业务代码的 Spring 版本冲突。

      Guice (pronounced 'juice') is a lightweight dependency injection framework for Java 6 and above, brought to you by Google.

    • com.netflix.discovery.converters 包:Eureka 内部传输数据编解码转换器,支持 XML / JSON 格式。

    • com.netflix.discovery.endpoint 包:目前该包正在重构,和下文的 com.netflix.discovery.shared.dnscom.netflix.discovery.shared.resolver 用途相近。

    • com.netflix.disvoery.provider 包:目前仅有 DiscoveryJerseyProvider 类。该类声明自定义的 Jersey 请求和响应的序列化和反序列化实现。

    • com.netflix.disvoery.providers 包:目前仅有 DefaultEurekaClientConfigProvider 类。该类实现 javax.inject.Provider 接口,设置 EurekaClientConfig ( Eureka 客户端配置 ) 的生成工厂。感兴趣的同学,可以点击《Google-Guice入门介绍》搜索 Provider 关键字。

    • com.netflix.discovery.shared 包:Eureka-Client 和 Eureka-Server 注册发现相关的共享重用的代码。下文你会看到,Eureka-Server 通过 eureka-core 模块实现,eureka-core 依赖 eureka-client粗一看,我们会感觉 What ?Eureka-Server 代码依赖 Eureka-Client 代码!?这个和 Eureka-Server 多节点注册信息 P2P 同步的实现有关。一个 Eureka-Server 收到 Eureka-Client 注册请求后,Eureka-Server 会自己模拟 Eureka-Client 发送注册请求到其它的 Eureka-Server,因此部分实现代码就使用到了这个包,在 《Eureka 源码解析 —— Eureka-Server 集群同步》 详细解析。

      • com.netflix.discovery.shared.transport 包:Eureka-Client 对 Eureka-Server RESTful 的 HTTP 客户端,基于 Jersey Client 实现。Jersey 在下文「2.1 eureka-client-jersey2」详细解析。
      • com.netflix.discovery.shared.dns 包 :DNS 解析器。
      • com.netflix.discovery.shared.resolver 包:Eureka Endpoint 解析器。在 《Eureka 源码解析 —— EndPoint 与 解析器》 有详细解析。
    • com.netflix.discovery.util 包 :工具类。

2.1 eureka-client-archaius2

Archaius 是 Netflix 开源的配置管理组件。

Archaius 目前有 1.x 和 2.x 版本,默认情况下,Eureka 使用 1.x 版本。从官方文档上来看,2.x 版本仍然在开发中。

FROM eureka-client-archaius2 README
This is a version of eureka-client that has been ported to use Archaius 2.x as the backing configuration system. Please note that this client is still work in progress. This client is also only java8 compatible (as Archaius 2.x is only java8 compatible).

2.2 eureka-client-jersey2

Jersey 是 JAX-RS(JSR311)开源参考实现,用于构建 RESTful Web Service。

Jersey 目前有 1.x 和 2.x 版本,默认情况下,Eureka 使用 1.x 版本。从官方文档上来看,2.x 版本由社区实现,Netflix 自己暂未使用。

FROM eureka-client-jersey2 README
Please note that this jersey2 compatible Eureka client (eureka-client-jersey2) is created and maintained by the community. Netflix does not currently use this library internally.

3. eureka-core

eureka-core 模块为 Eureka-Server 的功能实现:

  • com.netflix.eureka.EurekaBootStrap 类:Eureka-Server 启动类。
  • com.netflix.eureka.aws 包:与亚马逊 AWS 服务相关的类。由于笔者和大多数读者都对 AWS 暂不了解,本系列《Eureka 源码解析》会跳过和 AWS 相关的代码。
  • com.netflix.eureka.cluster 包:Eureka-Server 集群数据复制相关的代码。
  • com.netflix.eureka.lease 包:应用注册后的租约管理( 注册 / 取消 / 续期 / 过期 )。
  • com.netflix.eureka.resousrces 包:资源,基于 Jersey Server 实现,相当于 Spring MVC 的控制层代码。
  • com.netflix.eureka.transport 包:Eureka-Server 对 Eureka-Server 的 RESTful HTTP 客户端,基于 com.netflix.discovery.shared.transport 封装实现。
  • com.netflix.eureka.util 包:工具类。

3.1 eureka-core-jersey2

参见本文「2.1 eureka-client-jersey2」。

4. eureka-resources

eureka-resources 模块,使用 JSP 实现 Eureka-Server 的运维后台界面。项目结构如下图:

5. eureka-server

eureka-server 模块,将 eureka-client + eureka-core + eureka-resources 三者打包成 Eureka-Server 的 war 包。项目结构如下图:

5.1 eureka-server-governator

eureka-server-governator 模块,使用 Netflix Governator 管理 Eureka-Server 的生命周期。

FROM http://www.infoq.com/cn/news/2013/02/netflix-opensource
Governator,一款对 Google Guice 进行扩展的类库,提供了Classpath扫描及自动绑定、生命周期管理、成员属性验证等功能。

目前该模块正在实现阶段。

FROM eureka-server-governator README
This server build is still experimental.

6. eureka-examples

eureka-examples 模块,提供 Eureka-Client 使用例子。

7. eureka-test-utils

eureka-test-utils 模块,提供 Eureka 单元测试工具类。

666. 彩蛋

知识星球

第一篇 Eureka 的文章,如果有地方写的不正确,还望指出,谢谢。

下一篇 Eureka 调试环境搭建。

更多 Eureka 内容,推荐阅读如下文章:

文章目录
  1. 1. 1. 概述
    1. 1.1. 1.1 简介
    2. 1.2. 1.2 项目结构
  2. 2. 2. eureka-client
    1. 2.1. 2.1 eureka-client-archaius2
    2. 2.2. 2.2 eureka-client-jersey2
  3. 3. 3. eureka-core
    1. 3.1. 3.1 eureka-core-jersey2
  4. 4. 4. eureka-resources
  5. 5. 5. eureka-server
    1. 5.1. 5.1 eureka-server-governator
  6. 6. 6. eureka-examples
  7. 7. 7. eureka-test-utils
  8. 8. 666. 彩蛋