在开始本篇文章以前,我想你对SpringCloud和SpringBoot的基本使用已经比较熟悉了,若是不熟悉的话能够参考我以前写过的文章 本篇文章的源码基于SpringBoot2.0,SpringCloud的Finchley.RELEASEspring
@EnableEurekaServer
注解咱们知道,在使用Eureka做为注册中心的时候,咱们会在启动类中增长一个@EnableEurekaServer
注解,这个注解咱们是一个自定义的EnableXXX系列的注解,主要做用咱们以前也屡次提到了,就是引入配置类而已。看一下源码吧json
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Import({EurekaServerMarkerConfiguration.class}) public @interface EnableEurekaServer { }
引入了一个配置类EurekaServerMarkerConfiguration
,看一下这个类的具体内容bootstrap
@Configuration public class EurekaServerMarkerConfiguration { @Bean public Marker eurekaServerMarkerBean() { return new Marker(); } class Marker { } }
如今看这里好像难以理解,这是啥意思,搞个空的类干啥的,不要着急,接着往下看服务器
既然注解上没有找到咱们想要的东西,那么就看一下spring.factories
文件吧,这里自动配置的实现类是EurekaServerAutoConfiguration
app
因为这个类涉及的代码实在是太多了,这里就不贴了,我们直接来解析这个类:ide
看名字就知道了这个类是负责Eureka的初始化工做的,这个类实现了SmartLifecycle
接口,因此在spring初始化和销毁的时候,就会分别调用它的start和stop方法工具
首先看一下start方法fetch
public void start() { new Thread(new Runnable() { @Override public void run() { try { //启动EurekaServer eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext); log.info("Started Eureka Server"); publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig())); EurekaServerInitializerConfiguration.this.running = true; publish(new EurekaServerStartedEvent(getEurekaServerConfig())); } catch (Exception ex) { // Help! log.error("Could not initialize Eureka servlet context", ex); } } }).start(); }
这个代码好像比较直接了当啊,直接就起个线程启动了EurekaServer,而后发布了一些启动事件,来看启动的过程吧this
public void contextInitialized(ServletContext context) { try { //初始化执行环境 initEurekaEnvironment(); //初始化上下文 initEurekaServerContext(); context.setAttribute(EurekaServerContext.class.getName(), this.serverContext); } catch (Throwable e) { log.error("Cannot bootstrap eureka server :", e); throw new RuntimeException("Cannot bootstrap eureka server :", e); } }
这里一共包含初始化环境和初始化上下文两个分支spa
这个不是很重要,能够过滤掉
protected void initEurekaEnvironment() throws Exception { log.info("Setting the eureka configuration.."); //AWS相关的东西,能够忽略 String dataCenter = ConfigurationManager.getConfigInstance() .getString(EUREKA_DATACENTER); if (dataCenter == null) { log.info( "Eureka data center value eureka.datacenter is not set, defaulting to default"); ConfigurationManager.getConfigInstance() .setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, DEFAULT); } else { ConfigurationManager.getConfigInstance() .setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, dataCenter); } //设置 Eureka 环境,默认为test String environment = ConfigurationManager.getConfigInstance() .getString(EUREKA_ENVIRONMENT); if (environment == null) { ConfigurationManager.getConfigInstance() .setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, TEST); log.info( "Eureka environment value eureka.environment is not set, defaulting to test"); } else { ConfigurationManager.getConfigInstance() .setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, environment); } }
protected void initEurekaServerContext() throws Exception { // 设置json与xml序列化工具 JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH); XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH); if (isAws(this.applicationInfoManager.getInfo())) { this.awsBinder = new AwsBinderDelegate(this.eurekaServerConfig, this.eurekaClientConfig, this.registry, this.applicationInfoManager); this.awsBinder.start(); } EurekaServerContextHolder.initialize(this.serverContext); log.info("Initialized server context"); // 同步Eureka集群数据 int registryCount = this.registry.syncUp(); this.registry.openForTraffic(this.applicationInfoManager, registryCount); // 注册监控统计信息 EurekaMonitors.registerAllStats(); }
这个方法中同步集群数据和注册监控信息都涉及的内容比较多,因此本篇文章就再也不展开了,请关注我留意后续文章
看到这里就揭开了开篇@EnableEurekaServer
注解注入的那个bean的含义了。也就是说若是我们的启动类没有使用@EnableEurekaServer
注解的话,这个自动配置类就不会执行,那也就没有Eureka的事了
深刻这个注解发现这个仍是使用的@Import
注解的机制引入了两个类,这个注解在以前的源码解析文章中也屡次提到了,这里就不展开了
EurekaDashboardProperties
这个类比较简单,主要是Eureka的控制台的相关配置
//控制台默认路径 private String path = "/"; //是否开启控制台 private boolean enabled = true;
InstanceRegistryProperties
,这个类是控制Eureka的注册时的配置信息
//每分钟续约次数 @Value("${eureka.server.expectedNumberOfRenewsPerMin:1}") private int expectedNumberOfRenewsPerMin = 1; //默认打开的通讯数量 @Value("${eureka.server.defaultOpenForTrafficCount:1}") private int defaultOpenForTrafficCount = 1;
相信你们比较熟悉这个注解,加载Eureka的配置文件而已
配置文件中也仅仅只包含这个信息
spring.http.encoding.force=false
EurekaServerAutoConfiguration
类上几个注解就解析完了,接着看一下这个类中注入的几个比较重要的类吧
EurekaServerConfig 若是当前应用容许注册到其余Eureka服务中时,也就是属性eureka.client.fetch-registry
为true时。就设置属性registrySyncRetries
的值为5,这个属性的意思是当Eureka服务器启动时尝试去获取集群里其余服务器上的注册信息的次数
这个就是Eureka本身的controller了,控制台的相关信息就是从这里获取的
设置Eureka的序列化工具
集群注册信息同步相关的类,请期待后续深刻解析文章
EurekaServer接受请求的一个拦截器,感兴趣的同窗能够研究一下