SpringCloud(五):Netflix Eureka源码导读与原理分析
- 程序构成
- 是纯正的 servlet 应用,需构建成war包部署
- 使用了 Jersey 框架实现自身的 RESTful HTTP接口
- peer之间的同步与服务的注册全部通过 HTTP 协议实现
- 定时任务(发送心跳、定时清理过期服务、节点同步等)通过 JDK 自带的
Timer
实现 - 内存缓存使用Google的guava包实现
- 代码结构
- com.netflix.eureka.cluster - 与peer节点复制(replication)相关的功能
- com.netflix.eureka.lease - 即”租约”, 用来控制注册信息的生命周期(添加、清除、续约)
- com.netflix.eureka.registry - 存储、查询服务注册信息
- com.netflix.eureka.resources - RESTful风格中的”R”, 即资源。相当于SpringMVC中的Controller
- com.netflix.eureka.transport - 发送HTTP请求的客户端,如发送心跳
- com.netflix.eureka.aws - 与amazon AWS服务相关的类
- eureka-client模块:
Eureka客户端,微服务通过该客户端与Eureka进行通讯,屏蔽了通讯细节 - eureka-server模块:
包含了 servlet 应用的基本配置,如 web.xml。构建成功后在该模块下会生成可部署的war包。
- 由于是Servlet应用,所以Eureka需要通过servlet的相关监听器 ServletContextListener 嵌入到 Servlet 的生命周期中。EurekaBootStrap 类实现了该接口,在servlet标准的contextInitialized()方法中完成了初始化工作:
@Override 2 public void contextInitialized(ServletContextEvent event) { 3 try { 4 // 读取配置信息 5 initEurekaEnvironment(); 6 // 初始化Eureka Client(用来与其它节点进行同步) 7 // 初始化server 8 initEurekaServerContext(); 9 10 ServletContext sc = event.getServletContext(); 11 sc.setAttribute(EurekaServerContext.class.getName(), serverContext); 12 } catch (Throwable e) { 13 logger.error("Cannot bootstrap eureka server :", e); 14 throw new RuntimeException("Cannot bootstrap eureka server :", e); 15 } 16 }