Eureka源码解析:入口分析
我们知道eureka-server将 eureka-client
+ eureka-core
+ eureka-resources
三者打包成 war
包,我们最终是要访问的是这个模块,所以我们先来分析此模块。
根据项目结构,我们锁定项目的入口是在web.xml文件中配置的:
<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>
1、欢迎页面
看上图我们知道欢迎页面是eureka-resources
中的status.jsp文件。
2、初始化类
由上图可知,web项目启动后会去调用com.netflix.eureka.EurekaBootStrap
所以我们后面要着重分析此类!他应该就是负责eureka-server
初始化工作的。
3、过滤器
<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>
web.xml中有连着5个Filter:
(1)StatusFilter:负责状态相关的处理逻辑
(2)ServerRequestAuthFilter:对请求进行授权认证的处理的
(3)RateLimitingFilter:负责限流相关的逻辑的(很有可能成为eureka-server里面的一个技术亮点,看看人家eureka-server作为一个注册中心是怎么做限流的?限流的算法是什么?留到后面去看)
这个filter默认不开启。
(4)GzipEncodingEnforcingFilter:gzip,压缩相关的;encoding,编码相关的。
(5)jersey:jersey的核心filter
每个mvc框架都有一个核心filter或者是核心servlet。
比如说struts2的核心filter是
org.apache.struts2.dispatcher.FilterDispatcher
spring web mvc的核心servlet是
org.springframework.web.servlet.DispatcherServlet
这些核心类配置在web.xml里后相当于将web请求的处理入口交给框架了,框架会根据你的配置,自动帮你干很多事儿,最后调用你的一些处理逻辑。
jersey这里的ServletContainer就是它的一个核心filter,作为请求的入口接收所有的请求;处理一些逻辑之后再调用你写的代码逻辑。