注册中心 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.1 eureka-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.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.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上篇》

原文发布于微信公众号 - 芋道源码(YunaiV)

原文发表时间:2018-01-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

Spring-Data-REST轻松搞定RESTfulAPI

背景 昨天同事问我有没有研究过 ,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 ,过一会发过两个截图过来。真的很强大,感觉这个在使用...

2676
来自专栏dalaoyang

服务注册与发现---eureka

eureka简介:云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。 话不多说直接上代码 首先新建一个springcl...

4166
来自专栏SpringSpace.cn

使用 Kotlin 和Spring Boot 2.0快速开发REST API客户端 顶

在上一篇文章使用 Kotlin 和Spring Boot 2.0快速开发REST API接口内介绍了如何使用简单代码快速实现REST API的服务端接口,此文简...

672
来自专栏惨绿少年

NFS启动时报错Linux NFS:could not open connection for tcp6

1.1 启动时出现的错误 [root@znix ~]#/etc/init.d/nfs start Shutting down NFS daemon:     ...

2210
来自专栏cloudskyme

虚拟化平台cloudstack(7)——新版本的调试

调试环境 ubuntu 12.04 JDK1.7 apache-maven-3.10 eclipse 4.2 Juno mysql 5 源码下载及调试 上面的几...

3535
来自专栏Java技术栈

Spring Boot 1.5.10 发布:修复重要安全漏洞!!!

2018/01/31,Spring Boot团队发布了Spring Boot 1.5.10。 Maven: <parent> <groupId>org....

3809
来自专栏james大数据架构

SpringMVC过程中@RequestBody接收Json的问题 总是报415

在SpringMVC中用@RequestBody接收Json的问题,总是报415,经过一翻查找 前台js的post: var postdata = '{"tit...

1909
来自专栏乐百川的学习频道

Spring IO Platform 简介

Spring IO Platform框架简单来说就是一个版本号兼容系统,它将常用第三方类库的兼容的版本组织起来。只要我们在项目中引用了Spring IO Pla...

2259
来自专栏杂烩

分布式服务框架之Dubbo整合Spring项目(一)

        先说一下架构,项目采用Maven管理依赖,总共三个项目,一个是接口包common-inter,一个是服务提供者provider,最后一个是服务消...

1491
来自专栏Danny的专栏

SLF4J和Logback日志框架详解

SLF4J是一套简单的日志外观模式的Java API,帮助在项目部署时对接各种日志实现。

1404

扫码关注云+社区

领取腾讯云代金券