vlambda博客
学习文章列表

Eureka源码解析:入口分析

我们知道eureka-server将 eureka-client + eureka-core + eureka-resources 三者打包成 war 包,我们最终是要访问的是这个模块,所以我们先来分析此模块。

根据项目结构,我们锁定项目的入口是在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/javaeehttp://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,作为请求的入口接收所有的请求;处理一些逻辑之后再调用你写的代码逻辑。