注册中心 Eureka 源码解析 —— 项目结构简介
本文主要基于 Eureka 1.8.X 版本
- 1. 概述
- 1.1 简介
- 1.2 项目结构
- 2. eureka-client
- 2.1 eureka-client-archaius2
- 2.2 eureka-client-jersey2
- 3. eureka-core
- 3.1 eureka-core-jersey2
- 4. eureka-resources
- 5. eureka-server
- 5.1 eureka-server-governator
- 6. eureka-examples
- 7. eureka-test-utils
- 666. 彩蛋
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 一下。
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.shared.transport
包:Eureka-Client 对 Eureka-Server RESTful 的 HTTP 客户端,基于 Jersey Client 实现。Jersey 在下文「2.1eureka-client-jersey2
」详细解析。 -
com.netflix.discovery.shared.dns
包 :DNS 解析器。 -
com.netflix.discovery.shared.resolver
包:Eureka Endpoint 解析器。在 《Eureka 源码解析 —— EndPoint 与 解析器》 有详细解析。 -
com.netflix.discovery.DiscoveryClient
类:注册发现客户端实现类。 -
com.netflix.discovery.guice
包:Eureka 计划使用 Google Guice 实现依赖注入,参见本文「5.1eureka-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.dns
和com.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.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。
- Eureka-Server 使用 Jersey Server 创建 RESTful Server 。
- Eureka-Client 使用 Jersey Client 请求 Eureka-Server 。
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 内容,推荐阅读如下文章:
- 携程 —— 《深度剖析服务发现组件Netflix Eureka》
- 程序员DD —— 《Spring Cloud源码分析(一)Eureka》
- 王鸿飞 —— 《Spring Cloud Netflix Eureka源码导读与原理分析》
- 许进 —— 《Spring Cloud Netflix之Eureka上篇》
- SpringBoot开发案例之整合mail发送服务
- SpringBoot开发案例之整合mongoDB
- Docker学习之CentOS 7安装配置
- Docker学习之搭建JavaWeb环境
- Docker学习之搭建JavaWeb环境进阶篇
- Docker学习之网络模式配置
- Docker学习之SSH连接docker容器
- Docker学习之搭建Nginx容器服务
- Docker学习之搭建MySql容器服务
- 初识Python
- XGboost数据比赛实战之调参篇(完整流程)
- Pandas使用DataFrame进行数据分析比赛进阶之路(一)
- Augmentor 使用介绍
- 如何在Centos7.2安装HDP2.6
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R|apply,tapply
- python中的基本运算
- 助力联邦——Pulsar在Angel PowerFL联邦学习平台中的应用
- 让数据跃然“图”上!腾讯位置服务数据可视化API正式发布
- 腾讯云 Serverless 衔接 Kafka 上下游数据流转实战
- Tensorflow 测试一段能运行在 GPU 的代码
- Tensorflow on HDFS 的实践
- MPI on Kubernetes
- Tensorflow Serving模型指向s3地址,Could not find base path?
- Python之turtle模块初体验
- tcsetpgrp failed重新编译tini
- s3cmd ls之迷惑
- 构建pyflink镜像
- apt-get update遇到NO_PUBKEY
- 遇到mpi worker exited on signal 9