eureka client進(jìn)行注冊(cè)的關(guān)鍵類在DiscoveryClient愈捅,初始化了定時(shí)調(diào)度線程池遏考、心跳檢查線程池、緩存刷新線程池蓝谨,還初始化了進(jìn)行和eureka server通信的相關(guān)組件
在initScheduledTasks()方法中灌具,執(zhí)行定時(shí)調(diào)度任務(wù)(CacheRefreshThread),每隔30S會(huì)刷新注冊(cè)表;執(zhí)行定時(shí)調(diào)度任務(wù)(HeartbeatThread)譬巫,每隔30S發(fā)送一次心跳咖楣;
真正進(jìn)行發(fā)起注冊(cè)的邏輯在實(shí)例化InstanceInfoReplication,在構(gòu)造方法中并沒發(fā)現(xiàn)什么蛛絲馬跡,直到看到instanceInfoReplication.start()方法芦昔,它自己本身就實(shí)現(xiàn)Runable接口诱贿,是一個(gè)可執(zhí)行的線程類,通過定時(shí)任務(wù)進(jìn)行調(diào)用咕缎,我們發(fā)現(xiàn)首次調(diào)用是延遲40S后才會(huì)執(zhí)行線程的run()方法珠十,此后每30S進(jìn)行一次調(diào)用,在run()方法終于看到了注冊(cè)的方法凭豪,discoveryClient.register()方法焙蹭,這個(gè)方法里面看到了所謂的http調(diào)用,所以才真正從源碼角度知道eureka client發(fā)起注冊(cè)是基于http協(xié)議墅诡。不過eureka并沒有采用國(guó)內(nèi)spring mvc框架壳嚎,最終會(huì)進(jìn)入ApplicationResource.addInstance()方法桐智,跟著核心調(diào)用路徑走到AbstractInstanceRegistry.reginster()方法,看到了注冊(cè)表的存儲(chǔ)結(jié)構(gòu)為Map<String,Map<String,Least<InstanceInfo>>?
每注冊(cè)一個(gè)服務(wù)實(shí)例烟馅,期望每分鐘發(fā)送心跳次數(shù)的應(yīng)該加2(因?yàn)槊?0S發(fā)送一次心跳)说庭,默認(rèn)服務(wù)續(xù)約時(shí)間為90S
這次需要注冊(cè)的服務(wù)會(huì)加入recentRegisteredQueue和recentlyChangeQuene隊(duì)列
小結(jié):這里可能有個(gè)疑問,40S后才發(fā)起注冊(cè)郑趁,不是立刻就注冊(cè)嗎刊驴,因?yàn)槲覀兤綍r(shí)使用的是Spring Cloud Eureka框架,對(duì)原生eureka框架進(jìn)行了改造