新聞中心
唐朝第二位皇帝唐太宗為了擴(kuò)張領(lǐng)土,到處攻打周邊的小國(guó),即使有不服的小國(guó)也被唐太宗打服了。這些小國(guó)后來就都需要向唐太宗朝貢。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),滑縣企業(yè)網(wǎng)站建設(shè),滑縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,滑縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,滑縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
朝貢就是朝拜和進(jìn)貢。是兩國(guó)或者說是兩個(gè)政府之間的一種承認(rèn)對(duì)方尊卑關(guān)系的禮節(jié)性外交。
唐朝朝貢圖,來源百度百科
“貞觀之治” 說的就是當(dāng)時(shí)唐朝的鼎盛時(shí)期, 周圍小國(guó)都被打趴下了,國(guó)內(nèi)繁榮發(fā)展,以十分驚人的速度成為世界頂級(jí)強(qiáng)國(guó)。唐人街中的“唐”就是說的唐朝,足以說明唐朝對(duì)世界的影響。
小國(guó)定期向唐朝進(jìn)行朝貢這不就是微服務(wù)的心跳機(jī)制嗎?
他們是在告訴唐朝,我還是服你管教的。然后唐朝就會(huì)把這些小國(guó)的名字、地址、服飾外貌等特征放到一個(gè)朝貢國(guó)列表中。萬一哪天這些小國(guó)不服管了,就把他們從列表中移除掉,后期可能還會(huì)攻打他們~
下面是一張多國(guó)朝貢的示例圖:
朝貢示例圖
在微服務(wù)領(lǐng)域,心跳機(jī)制出現(xiàn)得太頻繁了,比如 Eureka、Naocs 中的客戶端和服務(wù)端的服務(wù)續(xù)約、Redis 的主從復(fù)制等等,其實(shí)原理都很相似。
本篇會(huì)通過 Eureka 中的服務(wù)續(xù)約功能作為示例來剖析心跳機(jī)制。
對(duì)于 Eureka,會(huì)涉及到兩個(gè)端,客戶端和服務(wù)端。客戶端就相當(dāng)于我們的訂單服務(wù)、商品服務(wù)等。而 Eureka 服務(wù)端則是指 Eureka 注冊(cè)中心這個(gè)服務(wù)。而保持續(xù)約就是客戶端隔一段時(shí)間就向服務(wù)端發(fā)送一次心跳,告訴 Eureka 服務(wù)端自己的狀態(tài)是存活的。
主要涉及以下知識(shí)點(diǎn):
- ① 誰(shuí)發(fā)送的心跳請(qǐng)求?
- ② 多久發(fā)送一次?
- ③ 如何發(fā)送的?
- ④ 如何接收心跳請(qǐng)求的?
- ⑤ 接收后做了什么事情?
誰(shuí)發(fā)送的心跳請(qǐng)求
Eureka 采用的是客戶端發(fā)送心跳請(qǐng)求給 Eureka 服務(wù)端。如下圖所示:
上圖中有三個(gè)微服務(wù):訂單服務(wù)、商品服務(wù)、優(yōu)惠券服務(wù),都已經(jīng)成功注冊(cè)到 Eureka 服務(wù)端了(注冊(cè)中心)。
然后每個(gè)微服務(wù)自己會(huì)單獨(dú)發(fā)送心跳請(qǐng)求給注冊(cè)中心。
多久發(fā)送一次
DIscoveryClient 初始化時(shí),會(huì)調(diào)度一些定時(shí)任務(wù)。Eureka 初始化了發(fā)送心跳請(qǐng)求的線程池 heartbeatExecutor,用來創(chuàng)建發(fā)送心跳的線程 HeartbeatThread。原理如圖所示:
線程池 heartbeatExecutor 源碼如下所示:
線程池
線程池有核心參數(shù):
- maximumPoolSize:最大線程數(shù)。線程池允許創(chuàng)建的最大線程數(shù)。
- corePoolSize:核心線程數(shù)。當(dāng)提交一個(gè)任務(wù)到線程池時(shí),線程池會(huì)創(chuàng)建一個(gè)線程來執(zhí)行任務(wù),即使其他空閑的核心線程能夠執(zhí)行新任務(wù)也會(huì)創(chuàng)建線程,等到 需要執(zhí)行的任務(wù)數(shù)大于線程池基本大小時(shí)就不再創(chuàng)建。如果調(diào)用了線程池的 prestartAllCoreThreads() 方法,則線程池會(huì)提前創(chuàng)建并啟動(dòng)所有基本線程。
- keepAliveTime:線程活動(dòng)保持時(shí)間 ,線程池的工作線程空閑后,保持存活的時(shí)間。
- runnableTaskQueue:任務(wù)隊(duì)列,用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列。有四種:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。
然后將這個(gè)線程池用來執(zhí)行定時(shí)調(diào)度任務(wù),源碼如下所示,在定時(shí)任務(wù)開始后,延遲 30s 開始執(zhí)行發(fā)送心跳請(qǐng)求,然后每隔 30秒執(zhí)行一次發(fā)送心跳請(qǐng)求。這里可以看到 new 了一個(gè) HeartbeatThread 線程。更多線程相關(guān)知識(shí),請(qǐng)看這篇:多線程核心知識(shí)點(diǎn)
定時(shí)任務(wù)
如何發(fā)送心跳請(qǐng)求的?
HeartbeatThread 線程繼承自 Runnable 類,實(shí)現(xiàn)了 run 方法,這個(gè)里面就會(huì)執(zhí)行發(fā)送心跳請(qǐng)求的具體邏輯了。
直接進(jìn)到 renew() 方法里面,核心邏輯就這一行:
eurekaTransport.registrationClient.sendHeartBeat(
instanceInfo.getAppName(),
instanceInfo.getId(),
instanceInfo,
null);
調(diào)用 EurekaHttpClient 的 sentHeartBeat 方法,將實(shí)例信息發(fā)送給注冊(cè)信息。
拼接的請(qǐng)求 URL 示例如下:
http://localhost:8080/v2/apps/order/i-000000-1
而且這個(gè)請(qǐng)求是 PUT 請(qǐng)求。
如何接收心跳請(qǐng)求的?
請(qǐng)求從客戶端發(fā)出心跳請(qǐng)求后,服務(wù)端就要接收這個(gè)請(qǐng)求了。
負(fù)責(zé)接受請(qǐng)求的類為 ApplicationsResource,它相當(dāng)于 MVC 中的 Controller。
根據(jù)請(qǐng)求的 URL 格式和請(qǐng)求方式(PUT),我們可以找到服務(wù)端的方法為 InstanceResource.renewLease()。
ApplicationsResource->ApplicationResource->InstanceResource
接收后做了什么事情
里面的核心代碼就是 renew 方法,將實(shí)例的一個(gè)字段給更新了,這個(gè)字段叫做 lastupdateTimestamp,也就是最后更新時(shí)間。
public void renew() {
lastUpdateTimestamp = System.currentTimeMillis() + duration;
}心跳機(jī)制
這個(gè)實(shí)例其實(shí)是從服務(wù)端注冊(cè)表 registry 中拿到的,它是一個(gè) ConcurrentHashmap,實(shí)例名當(dāng)做 key,來獲取 value(實(shí)例),也就是說實(shí)例信息是存在內(nèi)存中的。
拿到的是一個(gè) Lease 實(shí)例,數(shù)據(jù)結(jié)構(gòu)是這樣的:Lease,它有一個(gè) volatile 修飾的字段 lastUpdateTimestamp。通過更新這個(gè)字段來記錄實(shí)例信息確實(shí)存活著在,而且剛剛還跟 Eureka 通信了。
這就像古代唐朝的朝貢,唐朝周邊的小國(guó)是需要定期進(jìn)貢給唐朝的,目的是告訴唐朝,我現(xiàn)在還是依附唐朝的。
那么有了這個(gè)字段更新,Eureka Server 自身還會(huì)有個(gè)定時(shí)任務(wù),去檢查服務(wù)實(shí)例的最后更新時(shí)間,如果過期了,則認(rèn)為該實(shí)例狀態(tài)異常,需要進(jìn)行服務(wù)下線,這個(gè)是下一篇要講的內(nèi)容。
文章名稱:唐太宗把微服務(wù)的“心跳機(jī)制”玩到了極致!
文章起源:http://www.5511xx.com/article/ccssjdd.html


咨詢
建站咨詢
