Eureka 目录结构
源码目录简要说明
- eureka-client
指的eureka的客户端,注册到eureka上面去的一个服务,就是一个eureka client,无论是你要注册,还是要发现别的服务,无论是服务提供者还是服务消费者,都是一个eureka客户端 - eureka-core
指的eureka的服务端,其实就是eureka的注册中心 - eureka-examples
eureka使用的例子 - eureka-resources
这个是基于jsp开发的eureka控制台,web页面,上面你可以看到各种注册服务 - eureka-server
这是把eureka-client、eureka-core、eureka-resources打包成了一个war包,也就是说eureka-server自己本身也是一个eureka-client,同时也是注册中心,同时也提供eureka控制台。真正的使用的注册中心 - eureka-test-utils
单元测试工具类
核心配置文件 web.xml
什么是web.xml,为什么先分析web.xml文件
因为eureka-server是一个web工程,web.xml是一个核心文件,所以我们先看看web.xml文件,这里面有很多个和节点,比如:listener、filter但是并不会因为哪个卸载前面就先加载哪个,他们是有一定的加载顺序的。
web容器的加载顺序:
ServletContext -> context-param -> listener -> filter -> servlet
并且这些元素可以配置在文件中的任意位置
web容器加载过程顺序如下:
- 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取和两个结点
- 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文
- 容器将转换为键值对,并交给servletContext。
- 容器创建节点中的类实例,创建监听器
web.xml 核心内容
<!--最重要的监听器【在eureka-core里,就是负责eureka-server的初始化的】-->
<listener>
<listener-class>com.netflix.eureka.EurekaBootStrap</listener-class>
</listener>
<!--任何一个请求都会经过这四个过滤器的,而且每个过滤器都会对请求进行处理-->
<!--状态过滤器-->
<filter>
<filter-name>statusFilter</filter-name>
<filter-class>com
在eureka-server应用启动的时候就会执行,负责初始化一些逻辑,即执行EurekaBootStrap类lix.eureka.StatusFilter</filter-class>
</filter>
<!--对请求进行授权认证处理的过滤器-->
<filter>
<filter-name>requestAuthFilter</filter-name>
<filter-class>com.netflix.eureka.ServerRequestAuthFilter</filter-class>
</filter>
<!--负责限流逻辑的过滤器-->
<filter>
<filter-name>rateLimitingFilter</filter-name>
<filter-class>com.netflix.eureka.RateLimitingFilter</filter-class>
</filter>
<!--和压缩、编码相关的过滤器-->
<filter>
<filter-name>gzipEncodingEnforcingFilter</filter-name>
<filter-class>com.netflix.eureka.GzipEncodingEnforcingFilter</filter-class>
</filter>
<!--ServletContainer 过滤器,这里的这个ServletContainer就是一个核心filter,接收所有的请求,作为请求的入口,处理之后来调用你写的代码逻辑-->
<filter>
<filter-name>jersey</filter-name>
<filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
......
</filter>
<!--StatusFilter和RequestAuthFilter,一看就是通用的处理逻辑,是对所有的请求都开放的-->
<filter-mapping>
<filter-name>statusFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>requestAuthFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--RateLimitingFilter,默认是不开启的,如果你要打开eureka-server内置的限流功能,你需要自己把RateLimitingFilter的<filter-mapping>的注释打开,让这个filter生效-->
<!-- Uncomment this to enable rate limiter filter.
<filter-mapping>
<filter-name>rateLimitingFilter</filter-name>
<url-pattern>/v2/apps</url-pattern>
<url-pattern>/v2/apps/*</url-pattern>
</filter-mapping>
-->
<!--GzipEncodingEnforcingFilter,/v2/apps相关的请求,会走这里,仅仅对部分特殊的请求生效-->
<filter-mapping>
<filter-name>gzipEncodingEnforcingFilter</filter-name>
<url-pattern>/v2/apps</url-pattern>
<url-pattern>/v2/apps/*</url-pattern>
</filter-mapping>
<!--jersey核心filter,是拦截所有的请求的-->
<filter-mapping>
<filter-name>jersey</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--welcome-file-list,是配置了status.jsp是欢迎页面,首页,eureka-server的控制台页面,展示注册服务的信息-->
<welcome-file-list>
<welcome-file>jsp/status.jsp</welcome-file>
</welcome-file-list>
EurekaBootStrap在eureka-server应用启动的时候就会执行,负责初始化一些逻辑,即执行EurekaBootStrap类
build.gradle 配置文件类
apply plugin: 'war' // 打成war包进行运行
dependencies {
// eureka-server 是依赖于 eureka-client 的因为集群模式下是需要进行互相注册的
compile project(':eureka-client')
// eureka-serverq其实是依赖于eureka-core的
// 因为eureka-core核心是注册中心的角色,接受别人注册,服务发现,心跳,故障实例摘除等等功能
compile project(':eureka-core')
compile "com.sun.jersey:jersey-server:$jerseyVersion"
compile "com.sun.jersey:jersey-servlet:$jerseyVersion"
compile 'org.slf4j:slf4j-log4j12:1.6.1'
compile 'org.glassfish.jaxb:jaxb-runtime:2.3.3'
runtimeOnly 'xerces:xercesImpl:2.12.0'
runtimeOnly 'org.codehaus.jettison:jettison:1.2'
providedCompile "javax.servlet:servlet-api:$servletVersion"
testCompile project(':eureka-test-utils')
// 数据模拟工具
testCompile "org.mockito:mockito-core:${mockitoVersion}"
// 类似于Tomcat的web容器
testCompile "org.eclipse.jetty:jetty-server:$jetty_version"
testCompile "org.eclipse.jetty:jetty-webapp:$jetty_version"
}
task copyLibs(type: Copy) {
into 'testlibs/WEB-INF/libs'
from configurations.runtime
}
war {
from (project(':eureka-resources').file('build/resources/main'))
}
// Integration test loads eureka war, so it must be ready prior to running tests
test.dependsOn war
测试类
主要的测试方法
-
setUp()
启动eureka服务 -
tearDown()
关闭eureka服务 -
testRegistration()
测试注册行为 -
testHeartbeat()
测试心跳行为 -
testMissedHeartbeat()
测试缺失心跳行为 -
startServer()
启动服务 -
createEurekaServerConfig()
创建Eureka服务配置 -
testCancelForEntryThatExists()
测试取消注册实体