“不积跬步,无以至千里。”
这个专题开始,我们来深度刨析一下springcloud netflix技术栈核心组件的源码,虽然目前Alibaba系会更火一些,但我个人认为,微服务的始祖是netflix系组件,所谓一通百通,当我们把netflix组件原理全部吃透,彻底吸收微服务设计理念、核心思想的时候,后面的再出的所有微服务体系框架对你来说都不是问题。做技术这个事情,急不得,更不能什么火就去追,到最后什么都只是用用,一个程序员的核心竞争力应该是看源码的能力,尤其是阅读静态源码。而这些事情,我都会带着你看懂,这个专题我会采用小白都能看懂的方式,尽可能将源码解读细化,也会适当放入一些我自己手工绘制的图,帮助理解,话不多说,我们进入正题。
spring cloud eureka server和client是对netflix的eureka进行了封装,加了一些注解,对spring boot进行支持。所以看eureka的源码,应该先从netflix eureka开始看起。
本次netflix eureka解读的版本:1.10.14,其实1.7.2的版本我也看过,发现在架构设计、运行原理、核心流程上并没有太大的差别,可能某些功能在实现细节上会有些许的差别而已。
- eureka-client:eureka客户端代码模块
- eureka-core:eureka服务端代码模块,包括服务注册与发现,心跳,摘除故障服务实例功能
- eureka-resources:基于jsp开发的eureka控制台
- eureka-server:注册中心模块,包含以上三者
- jersey:mvc框架,使服务端和客户端通过restful接口进行网络通信

Eureka Server启动
Eureka-server是一个web应用,那么它的入口就是web.xml;
web.xml配置的Listener是EurekaBootStrap,所以这个类就是Eureka server启动的核心类,是我们重点要去看的;
<listener>
<listener-class>com.netflix.eureka.EurekaBootStrap</listener-class>
</listener>
进到EurekaBootStrap这个类里,发现它继承自ServletContextListener,那么就会调用contextInitialized方法进行初始化:
@Override
public void contextInitialized(ServletContextEvent event) {
try {
//下面两个方法是初始化的核心方法
initEurekaEnvironment();
initEurekaServerContext();
ServletContext sc = event.getServletContext();
sc.setAttribute(EurekaServerContext.class.getName(), serverContext);
} catch (Throwable e) {
logger.error("Cannot bootstrap eureka server :", e);
throw new RuntimeException("Cannot bootstrap eureka server :", e);
}
}
先说initEurekaEnvironment()这个方法,大概梳理一下它做的几件事情:
-
使用Double check的单例模式搞出来一个ConfigurationManager的实例对象,这个对象你可以认为是一个配置管理组件,后面会通过Properties对象来加载配置,然后对配置进行管理的这么一个东东;
String dataCenter = ConfigurationManager.getConfigInstance().getString(EUREKA_DATACENTER); //顺着getConfigInstance方法往里走,最终实际上实例化的是ConcurrentCompositeConfiguration这样一个对象,在它的构造函数会初始化一些东西,然后把这个对象返回,就不细看了,不是核心。 public static AbstractConfiguration getConfigInstance() { if (instance == null) { synchronized (ConfigurationManager.class) { if (instance == null) { //这个instance就是AbstractConfiguration类型 instance = getConfigInstance(Boolean.getBoolean(DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG)); } } } return instance; } -
初始化数据中心,如果没有配置的话,默认设置为DEFAULT ;
String dataCenter = ConfigurationManager.getConfigInstance().getString(EUREKA_DATACENTER); if (dataCenter == null) { logger.info("Eureka data center value eureka.datacenter is not set, defaulting to default"); ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, DEFAULT);

本文详细剖析了Spring Cloud Netflix Eureka服务注册与发现组件的启动过程,从web.xml的EurekaBootStrap监听器开始,逐步讲解了配置管理、环境初始化、EurekaServerConfig和EurekaInstanceConfig的构建、EurekaClient的初始化、服务实例注册表的创建、Eureka集群的启动以及监控状态的注册等关键步骤。通过源码分析,揭示了Eureka服务发现的核心机制。
最低0.47元/天 解锁文章
1737

被折叠的 条评论
为什么被折叠?



