eureka-server 项目结构分析

552 阅读3分钟

Eureka 目录结构

image.png

源码目录简要说明

  1. eureka-client
    指的eureka的客户端,注册到eureka上面去的一个服务,就是一个eureka client,无论是你要注册,还是要发现别的服务,无论是服务提供者还是服务消费者,都是一个eureka客户端
  2. eureka-core
    指的eureka的服务端,其实就是eureka的注册中心
  3. eureka-examples
    eureka使用的例子
  4. eureka-resources
    这个是基于jsp开发的eureka控制台,web页面,上面你可以看到各种注册服务
  5. eureka-server
    这是把eureka-client、eureka-core、eureka-resources打包成了一个war包,也就是说eureka-server自己本身也是一个eureka-client,同时也是注册中心,同时也提供eureka控制台。真正的使用的注册中心
  6. eureka-test-utils
    单元测试工具类

核心配置文件 web.xml

image.png

什么是web.xml,为什么先分析web.xml文件

    因为eureka-server是一个web工程,web.xml是一个核心文件,所以我们先看看web.xml文件,这里面有很多个和节点,比如:listener、filter但是并不会因为哪个卸载前面就先加载哪个,他们是有一定的加载顺序的。
web容器的加载顺序:
ServletContext -> context-param -> listener -> filter -> servlet
     并且这些元素可以配置在文件中的任意位置

web容器加载过程顺序如下:

  1. 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取和两个结点
  2. 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文
  3. 容器将转换为键值对,并交给servletContext。
  4. 容器创建节点中的类实例,创建监听器

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

测试类

image.png

主要的测试方法

  1. setUp()
    启动eureka服务

  2. tearDown()
    关闭eureka服务

  3. testRegistration()
    测试注册行为

  4. testHeartbeat()
    测试心跳行为

  5. testMissedHeartbeat()
    测试缺失心跳行为

  6. startServer()
    启动服务

  7. createEurekaServerConfig()
    创建Eureka服务配置

  8. testCancelForEntryThatExists()
    测试取消注册实体