自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

唐太宗把微服務(wù)的“心跳機(jī)制”玩到了極致!

開發(fā) 架構(gòu)
在微服務(wù)領(lǐng)域,心跳機(jī)制出現(xiàn)得太頻繁了,比如 Eureka、Naocs 中的客戶端和服務(wù)端的服務(wù)續(xù)約、Redis 的主從復(fù)制等等,其實(shí)原理都很相似。

你好,我是悟空。

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

朝貢就是朝拜和進(jìn)貢。是兩國或者說是兩個政府之間的一種承認(rèn)對方尊卑關(guān)系的禮節(jié)性外交。

圖片

唐朝朝貢圖,來源百度百科

“貞觀之治” 說的就是當(dāng)時唐朝的鼎盛時期, 周圍小國都被打趴下了,國內(nèi)繁榮發(fā)展,以十分驚人的速度成為世界頂級強(qiáng)國。唐人街中的“唐”就是說的唐朝,足以說明唐朝對世界的影響。

小國定期向唐朝進(jìn)行朝貢這不就是微服務(wù)的心跳機(jī)制嗎?

他們是在告訴唐朝,我還是服你管教的。然后唐朝就會把這些小國的名字、地址、服飾外貌等特征放到一個朝貢國列表中。萬一哪天這些小國不服管了,就把他們從列表中移除掉,后期可能還會攻打他們~

下面是一張多國朝貢的示例圖:

圖片

朝貢示例圖

在微服務(wù)領(lǐng)域,心跳機(jī)制出現(xiàn)得太頻繁了,比如 Eureka、Naocs 中的客戶端和服務(wù)端的服務(wù)續(xù)約、Redis 的主從復(fù)制等等,其實(shí)原理都很相似。

本篇會通過 Eureka 中的服務(wù)續(xù)約功能作為示例來剖析心跳機(jī)制。

對于 Eureka,會涉及到兩個端,客戶端和服務(wù)端??蛻舳司拖喈?dāng)于我們的訂單服務(wù)、商品服務(wù)等。而 Eureka 服務(wù)端則是指 Eureka 注冊中心這個服務(wù)。而保持續(xù)約就是客戶端隔一段時間就向服務(wù)端發(fā)送一次心跳,告訴 Eureka 服務(wù)端自己的狀態(tài)是存活的。

主要涉及以下知識點(diǎn):

  • ① 誰發(fā)送的心跳請求?
  • ② 多久發(fā)送一次?
  • ③ 如何發(fā)送的?
  • ④ 如何接收心跳請求的?
  • ⑤ 接收后做了什么事情?

誰發(fā)送的心跳請求

Eureka 采用的是客戶端發(fā)送心跳請求給 Eureka 服務(wù)端。如下圖所示:

圖片

上圖中有三個微服務(wù):訂單服務(wù)、商品服務(wù)、優(yōu)惠券服務(wù),都已經(jīng)成功注冊到 Eureka 服務(wù)端了(注冊中心)。

然后每個微服務(wù)自己會單獨(dú)發(fā)送心跳請求給注冊中心。

多久發(fā)送一次

DIscoveryClient 初始化時,會調(diào)度一些定時任務(wù)。Eureka 初始化了發(fā)送心跳請求的線程池 heartbeatExecutor,用來創(chuàng)建發(fā)送心跳的線程 HeartbeatThread。原理如圖所示:

圖片

線程池 heartbeatExecutor 源碼如下所示:

圖片

線程池

線程池有核心參數(shù):

  • maximumPoolSize:最大線程數(shù)。線程池允許創(chuàng)建的最大線程數(shù)。
  • corePoolSize:核心線程數(shù)。當(dāng)提交一個任務(wù)到線程池時,線程池會創(chuàng)建一個線程來執(zhí)行任務(wù),即使其他空閑的核心線程能夠執(zhí)行新任務(wù)也會創(chuàng)建線程,等到 需要執(zhí)行的任務(wù)數(shù)大于線程池基本大小時就不再創(chuàng)建。如果調(diào)用了線程池的 prestartAllCoreThreads() 方法,則線程池會提前創(chuàng)建并啟動所有基本線程。
  • keepAliveTime:線程活動保持時間 ,線程池的工作線程空閑后,保持存活的時間。
  • runnableTaskQueue:任務(wù)隊(duì)列,用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列。有四種:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。

然后將這個線程池用來執(zhí)行定時調(diào)度任務(wù),源碼如下所示,在定時任務(wù)開始后,延遲 30s 開始執(zhí)行發(fā)送心跳請求,然后每隔 30秒執(zhí)行一次發(fā)送心跳請求。這里可以看到 new 了一個 HeartbeatThread 線程。更多線程相關(guān)知識,請看這篇:多線程核心知識點(diǎn)

圖片

定時任務(wù)

如何發(fā)送心跳請求的?

HeartbeatThread 線程繼承自 Runnable 類,實(shí)現(xiàn)了 run 方法,這個里面就會執(zhí)行發(fā)送心跳請求的具體邏輯了。

圖片

直接進(jìn)到 renew() 方法里面,核心邏輯就這一行:

eurekaTransport.registrationClient.sendHeartBeat(
instanceInfo.getAppName(),
instanceInfo.getId(),
instanceInfo,
null);

調(diào)用 EurekaHttpClient 的 sentHeartBeat 方法,將實(shí)例信息發(fā)送給注冊信息。

拼接的請求 URL 示例如下:

http://localhost:8080/v2/apps/order/i-000000-1

而且這個請求是 PUT 請求。

如何接收心跳請求的?

請求從客戶端發(fā)出心跳請求后,服務(wù)端就要接收這個請求了。

負(fù)責(zé)接受請求的類為 ApplicationsResource,它相當(dāng)于 MVC 中的 Controller。

根據(jù)請求的 URL 格式和請求方式(PUT),我們可以找到服務(wù)端的方法為 InstanceResource.renewLease()。

ApplicationsResource->ApplicationResource->InstanceResource

接收后做了什么事情

里面的核心代碼就是 renew 方法,將實(shí)例的一個字段給更新了,這個字段叫做 lastupdateTimestamp,也就是最后更新時間。

public void renew() {
lastUpdateTimestamp = System.currentTimeMillis() + duration;
}

圖片

心跳機(jī)制

這個實(shí)例其實(shí)是從服務(wù)端注冊表 registry 中拿到的,它是一個 ConcurrentHashmap,實(shí)例名當(dāng)做 key,來獲取 value(實(shí)例),也就是說實(shí)例信息是存在內(nèi)存中的。

拿到的是一個 Lease 實(shí)例,數(shù)據(jù)結(jié)構(gòu)是這樣的:Lease,它有一個 volatile 修飾的字段 lastUpdateTimestamp。通過更新這個字段來記錄實(shí)例信息確實(shí)存活著在,而且剛剛還跟 Eureka 通信了。

這就像古代唐朝的朝貢,唐朝周邊的小國是需要定期進(jìn)貢給唐朝的,目的是告訴唐朝,我現(xiàn)在還是依附唐朝的。

那么有了這個字段更新,Eureka Server 自身還會有個定時任務(wù),去檢查服務(wù)實(shí)例的最后更新時間,如果過期了,則認(rèn)為該實(shí)例狀態(tài)異常,需要進(jìn)行服務(wù)下線,這個是下一篇要講的內(nèi)容。

責(zé)任編輯:武曉燕 來源: 悟空聊架構(gòu)
相關(guān)推薦

2020-10-29 07:17:37

雪崩系統(tǒng)服務(wù)

2022-08-14 09:00:00

JWT 令牌憑證微服務(wù)

2020-09-30 14:07:05

Kafka心跳機(jī)制API

2012-05-31 02:54:07

HadoopJava

2024-01-22 04:15:00

Vue3組件開發(fā)

2019-11-14 15:28:21

管理崗組織技術(shù)

2024-06-26 12:45:00

2020-10-15 18:31:36

理解Netty編解碼

2024-12-23 06:00:00

TCPC#網(wǎng)絡(luò)

2018-08-02 10:00:00

商派

2023-01-14 17:36:39

微服務(wù)注冊中心數(shù)據(jù)

2020-04-14 10:06:20

微服務(wù)Netflix語言

2017-07-20 16:21:52

UICountDownTidelay

2020-09-26 10:56:33

服務(wù)器熔斷服務(wù)隔離

2024-03-19 11:41:12

2020-11-18 09:37:44

微服務(wù)

2022-05-06 07:44:10

微服務(wù)系統(tǒng)設(shè)計(jì)重試機(jī)制

2021-10-17 20:38:30

微服務(wù)內(nèi)存組件

2011-11-21 10:58:01

Java遞歸分形幾何

2023-11-29 09:09:27

OceanBase底層
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號