前言
这个系列开始研究spring-cloud-netflix微服务框架的各个组件源码,首先是注册中心eureka。
本文先介绍eureka项目的基本结构,系列文章基于eureka版本 1.7.2。
没有特殊说明,本篇中所有client都指eureka-client,server指eureka-server。
笔者在eureka源码中加了大量注释辅助理解,为了行文流畅,有些细节的注释没有在文中体现
介绍
仓库
Eureka是微服务框架spring-cloud-netflix中的一个核心组件,作为注册中心而被应用广泛,其前身是Netflix公司开源的组件Eureka。
github仓库地址:https://github.com/Netflix/eureka.git。
请注意不在spring仓库下,spring-cloud-netflix-eureka只是对Netflix-Eureka的一个包装,核心逻辑代码在Netflix仓库下。
架构
下图是eureka功能简图:
大体分为三个角色:
- Eureka Server:也就是eureka的服务端,通过REST接口对外提供应用服务的服务注册和服务发现等功能。由于采用的是REST接口,所以非Java应用也可以注册到Eureka,笔者的公司就通过sidecar将php和node.js的服务都注册到了同一个Eureka注册中心,对语言异构的技术团队非常友好,方便统一管理和互相调用。
- provider:应用服务的提供方,需要作为eureka-client向eureka-server注册他自己。
- consumer:应用服务的消费方,需要作为eureka-client从eureka-server拉取服务注册表,然后根据注册表向服务提供方发起远程调用
图中1、2、3线标明服务中心的使用流程。注意实际使用中,provider同时也会是consumer,一般不会严格区分某个服务是否只需要消费而不需要注册或者只需要注册而不需要消费。
源码
项目结构
上图是将工程导入 IDEA 后的目录结构,说明下各个模块的用途。
- eureka-client:eureka-client 客户端的核心功能
- eureka-client-archaius2:Archaius 是 Netflix 开源的配置管理组件。
- eureka-client-jersey2:Jersey 是 JAX-RS(JSR311)开源参考实现,用于构建 RESTful Web Service。
- eureka-core:eureka-server 服务端的核心功能
- eureka-core-jersey2:构建 RESTful Web Service。
- eureka-examples:例子
- eureka-resources:基于 jsp 开发的eureka 后台页面
- eureka-server:eureka 集成包。包含客户端,服务端,后台页面,可以直接部署进web容器中。
- eureka-server-governator:实验模块,不重要
- eureka-test-utils:单元测试工具类
笔者的源码阅读将以eureka-serve
为切入点,重点研究eureka-client
和eureka-core
模块。
阅读顺序
1、 先看看eureka-server集成模块下的构建配置文件,即build.gradle
,这个文件会标识出两个信息:;
1、 模块的依赖;
2、 模块的构建方式:eureka是通过war包;
2、 由于eureka-server是一个经典web应用,所以我们直接去看web.xml
文件内容,这个文件标识出:web应用的监听器,拦截器,servlet,欢迎页面等信息;
我们看到web.xml 中配置了Servlet监听器:
- com.netflix.eureka.EurekaBootStrap
Serlvet监听器是指实现了javax.servlet.ServletContextListener
接口的实现类,这个接口提供了两个供子类实现的模板方法,分别会在web 容器初始化和销毁的时候被 Tomcat等实现了 Servlet 标准的 web 容器调用。
一些框架会利用这一特性做资源初始化和销毁工作,比如我们现在讨论的 Eureka,
也就是说com.netflix.eureka.EurekaBootStrap#contextInitialized方法将作为eureka-core模块的核心入口方法。
另外四个功能拦截器:
- com.netflix.eureka.StatusFilter,猜测:负责状态相关的逻辑
- com.netflix.eureka.ServerRequestAuthFilter,猜测:负责对请求进行授权认证的逻辑
- com.netflix.eureka.RateLimitingFilter。猜测:负责限流相关的逻辑
- com.netflix.eureka.GzipEncodingEnforcingFilter。猜测:负责压缩,编码相关的逻辑
还有一个jersey请求处理拦截器,负责处理请求,类似 SpringMVC 中的 DispatcherServlet,不过是使用拦截器实现:
- com.sun.jersey.spi.container.servlet.ServletContainer
一个欢迎页面:
- jsp/status.jsp
另外:web.xml 中还配置了拦截器对应的过滤路径,值得注意的是,限流拦截器默认是没有配置过滤路径的,也就是说默认没有启动拦截器,按需启用。
预告
下一篇准备介绍Eureka项目的调试入口,这个调试的地方有坑,很多中文博客都说的不对。😅