在開始本篇文章以前,我想你對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接受請求的一個攔截器,感興趣的同窗能夠研究一下