04、Eureka教程-原生Eureka-Server启动入口寻找

一、先去GitHub上下载源码,瞄一眼目录结构。

 

根据笔者小学的英文水平加上百度大概看出来,分为code核心模块、client客户端模块、server服务端模块、resource资源模块、examples用例、utils工具包几个模块吧。。

接着又发现了有这么几个三级项目名archaius2、jersey2、governator。经过再一次的百度查询,发现governator是一个用来增强 Google Guice 框架的库、扩展和工具集,提供类路径扫描和自动绑定、生命周期管理、配置到字段的映射、字段验证和并行对象热身 (parallelized object warmup).

archaius是netflix开源的动态属性配置框架,基于apache commons configuration, 提供在运行时获取配置值的功能.

eureka-core-jersey2是一个类似于SpringMvc的框架。(⊙o⊙)…一个也没用过…

二、本着先看服务端的思想,笔者先打开了两个服务端的项目。

突然发现`eureka-server-governator项目的readme中写了这么一句话,This server build is still experimental.此服务构建依然处于试验阶段。。。这时笔者也无语了,既然你是试验阶段,那就跳过吧。
 

没办法,那就看看eureka-server项目吧~
 

从图中可以看到貌似也没有什么代码,就是几个配置文件和一个测试类。接着笔者把几个配置文件都瞄了一眼,在web.xml文件里面发现了一些有趣的东西。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <listener>
    <listener-class>com.netflix.eureka.EurekaBootStrap</listener-class>
  </listener>

  <filter>
    <filter-name>statusFilter</filter-name>
    <filter-class>com.netflix.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>

  <filter>
    <filter-name>jersey</filter-name>
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
      <param-value>/(flex|images|js|css|jsp)/.*</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.sun.jersey;com.netflix</param-value>
    </init-param>

    <!-- GZIP content encoding/decoding -->
    <init-param>
      <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
      <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
      <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
    </init-param>
  </filter>

  <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>

  <!-- 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>
  -->

  <filter-mapping>
    <filter-name>gzipEncodingEnforcingFilter</filter-name>
    <url-pattern>/v2/apps</url-pattern>
    <url-pattern>/v2/apps/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>jsp/status.jsp</welcome-file>
  </welcome-file-list>

</web-app>

从web.xml里面可以看到,它配置了一个EurekaBootStrap的监听器和五个拦截器StatusFilterServerRequestAuthFilterRateLimitingFilterGzipEncodingEnforcingFilterServletContainer
从名字上来看,EurekaBootStrap可能是一个启动类,StatusFilter是状态拦截器,ServerRequestAuthFilter是和权限相关的拦截器,RateLimitingFilter经过百度翻译是一个限流的拦截器、GzipEncodingEnforcingFilter是编码相关的拦截器、ServletContainer是和Servlet相关的拦截器。以上仅是笔者猜测,不一定正确。并且需要注意的是,RateLimitingFilter拦截器的filter-mapping是注释掉的,也就是默认是不开启的~

三,EurekaBootStrap类查看

&nbsp;

可以看到EurekaBootStrapEureka-core项目中,并且实现了javax.servlet.ServletContextListener接口,这个接口是Servlet原生API的。那么我们就可以去看一下它的contextInitialized方法了~
&nbsp;

大致就是这样,看名字是先初始化了一下环境参数,接着初始化了Server上下文,最后拿到上下文,设置了一个参数。