本章,我将在本地搭建Eureka源码环境。这一章,是后续所有Eureka源码解读章节的基础,由于Netflix Eureka是采用Gradle构建的,源码构建环节中会有许多坑,所以读者需要跟随我的步骤,一步步完成Eureka源码的本地构建。
一、本地环境搭建
1.1 Gradle安装
Netflix Eureka项目是用Gradle来构建的,所以先从官网下载Gradle:https://gradle.org/releases/ 。我这里下载的是gradle-2.10
。
接着,设置GRADLE_HOME
环境变量,同时在PATH环境变量中,加入%GRADLE_HOME%/bin
。最后,在cmd命令行中,直接gradle -v
,看到gradle版本信息就代表装好了:
$ gradle -v
------------------------------------------------------------
Gradle 2.10
------------------------------------------------------------
Build time: 2015-12-21 21:15:04 UTC
Build number: none
Revision: 276bdcded730f53aa8c11b479986aafa58e124a6
Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.8.0_111 (Oracle Corporation 25.111-b14)
OS: Windows 10 10.0 amd64
如果要像Maven一样在setting.xml
中设置本地仓库的位置,可以再加一个环境变量的参数GRADLE_USER_HOME
,值设为自己创建的一个gradle仓库的路径,默认是C:\[Users_HOME]\.gradle
。
接着,配置下中央仓库,我这里使用阿里云的maven仓库。在C:\[Users_HOME]\.gradle
目录下新建一个名为init.gradle
的文件:
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}
1.2 Eureka源码下载
安装完gradle,就可以通过git clone https://github.com/Netflix/eureka.git
命令获取Eureka源码了。
$ git clone https://github.com/Netflix/eureka.git
Cloning into 'eureka'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 53593 (delta 4), reused 10 (delta 1), pack-reused 53568
Receiving objects: 100% (53593/53593), 11.66 MiB | 987.00 KiB/s, done.
Resolving deltas: 100% (21038/21038), done.
我这里直接通过Intellij IDEA从Git导入源码:
接着,进入Eureka的根目录,选择你要读的那个版本的源码,比如我这里是执行git checkout v1.7.2
,转到1.7.2版本的源码,后续章节的源码分析都是基于这个版本。
然后,执行gradlew.bat
脚本(我本地是windows),这个脚本会下载Eureka需要的所有依赖,这个过程巨慢无比,耐心等待吧,执行成功后会看到以下信息:
Welcome to Gradle 2.10.
To run a build, run gradlew <task> ...
To see a list of available tasks, run gradlew tasks
To see a list of command-line options, run gradlew --help
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL
Total time: 16 mins 47.672 secs
最后,在Eureka根目录执行以下命令,完成项目的构建:
gradle clean build
没有安装Git的童鞋请自行下载安装,我这里就不赘述了。
二、源码结构
Netflix Eureka项目的整体结构如下,本节我会对我们阅读源码需要关注的核心模块进行介绍,其它模块略过即可:
2.1 eureka-client
eureka-client,代表Eureka客户端(Eureka-Client),需要将自己注册到Eureka Server,或从Eureka Server获取服务注册表,同时进行心跳(续租)通信。
2.3 eureka-core
eureka-core,代表Eureka服务端(Eureka-Server),即注册中心,它接收Eureka-Client的服务注册请求,提供服务发现的功能,保持心跳(续约请求),摘除故障服务实例等等。
2.4 eureka-server
eureka-server的本质是一个web应用,它依赖eureka-client
、eureka-core
、eureka-resources
,相当于把它们一起打成一个war包。所以eureka-server既扮演着注册中心角色,也扮演着客户端的角色。
2.5 eureka-resources
Eureka依赖的一些静态资源,JSP资源都在这个包下。
2.6 eureka-examples
包含了大量Eureka的使用示例,后续我们研究Eureka源码时,会运行这些实例观察整个系统的运行过程。
2.7 eureka-test-utils
包含Eureka的各种单元测试工具类。
注:上述包含Jersey的模块,其实是对Jersey这个开源的RESTful框架进行了封装。读者可以把Jersey类比成Spring MVC。Eureka-Client和Eureka-Server之间的通信,都是基于Jersey框架来实现的(http restful接口请求和调用)。所以,eureka-client-jersey2/eureka-core-jersey2,就是Eureka为了方便自己使用,对Jersey框架的一个封装,提供更多的功能。
三、总结
本章,我带领大家在本地搭建起了Eureka源码环境。下一章,我将分析Eureka Server启动的整体流程,因为Eureka-Server同时扮演了Eureka-Client的角色,所以通过整个Eureka Server的启动流程,可以让读者从全局上对Eureka的各个核心概念有一个了解。