位置:首页历史解密>唐太宗把微服务的“心跳机制”玩到了极致!

唐太宗把微服务的“心跳机制”玩到了极致!

所属分类:历史解密 编辑:莫笑少年梦 访问量:1618 更新时间:2024/2/6 12:23:47

朝贡就是朝拜进贡。是两国或者说是两个政府之间的一种承认对方尊卑关系的礼节性外交。

唐朝朝贡图,来源百度百科

“贞观之治” 说的就是当时唐朝的鼎盛时期, 周围小国都被打趴下了,国内繁荣发展,以十分惊人的速度成为世界顶级强国。唐人街中的“唐”就是说的唐朝,足以说明唐朝对世界的影响。

小国定期唐朝进行朝贡这不就是微服务的心跳机制吗?

他们是在告诉唐朝,我还是服你管教的。然后唐朝就会把这些小国的名字、地址、服饰外貌等特征放到一个朝贡国列表中。万一哪天这些小国不服管了,就把他们从列表中移除掉,后期可能还会攻打他们~

下面是一多国朝贡的示例图:

上图中有三个微服务:订单服务、商品服务、优惠券服务,都已经成功注册到 Eureka 服务端了(注册中心)。

然后每个微服务自己会单独发送心跳请求给注册中心。

多久发送一次

DIscoveryClient 初始化时,会调度一些定时任务。Eureka 初始化了发送心跳请求的线程池 heartbeatExecutor,用来创建发送心跳的线程 HeartbeatThread。原理如图所示:

线程池 heartbeatExecutor 源码如下所示:

线程池

线程池有核心参数:

  1. maximumPoolSize:最大线程数。线程池允许创建的最大线程数。
  2. corePoolSize:核心线程数。当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的核心线程能够执行新任务也会创建线程,等到 需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的 prestartAllCoreThreads() 方法,则线程池会提前创建并动所有基本线程。
  3. keepAliveTime:线程活动保持时间 ,线程池的工作线程空闲后,保持存活的时间。
  4. runnableTaskQueue:任务队列,用于保存等待执行的任务的阻塞队列。有四种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。

然后将这个线程池用来执行定时调度任务,源码如下所示,在定时任务开始后,延迟 30s 开始执行发送心跳请求,然后每隔 30秒执行一次发送心跳请求。这里可以看到 new 了一个 HeartbeatThread 线程。更多线程相关知识,请看这篇:多线程核心知识点

定时任务

发送心跳请求的?

HeartbeatThread 线程继承自 Runnable 类,实现了 run 方法,这个里面就会执行发送心跳请求的具体逻辑了。

直接进到 renew() 方法里面,核心逻辑就这一行

eurekaTransport.registrationClient.sendHeartBeat(

instanceInfo.getAppName(),

instanceInfo.getId(),

instanceInfo,

null);

调用 EurekaHttpClient 的 sentHeartBeat 方法,将实例信息发送给注册信息。

拼接的请求 URL 示例如下:

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

而且这个请求是 PUT 请求。

如何接收心跳请求的?

请求从客户端发出心跳请求后,服务端就要接收这个请求了。

负责接受请求的类为 ApplicationsResource,它相当于 MVC 中的 Controller。

根据请求的 URL 格式和请求方式(PUT),我们可以找到服务端的方法为 InstanceResource.renewLease()。

ApplicationsResource->ApplicationResource->InstanceResource

接收后做了什么事情

里面的核心代码就是 renew 方法,将实例的一个字段给更新了,这个字段叫做 lastupdateTimestamp,也就是最后更新时间。

public void renew() <{p> lastUpdateTimestamp = System.currentTimeMillis() + duration;

}

心跳机制

这个实例其实是从服务端注册表 registry 中拿到的,它是一个 ConcurrentHashmap,实例名当做 key,来获取 value(实例),也就是说实例信息是存在内存中的。

拿到的是一个 Lease 实例,数据结构是这样的:Lease,它有一个 volatile 修饰的字段 lastUpdateTimestamp。通过更新这个字段来记录实例信息确实存活着在,而且刚刚还跟 Eureka 通信了。

这就像古代唐朝的朝贡,唐朝周边的小国是需要定期进贡给唐朝的,目的是告诉唐朝,我现在还是依附唐朝的。

那么有了这个字段更新,Eureka Server 自身还会有个定时任务,去检查服务实例的最后更新时间,如果过期了,则认为该实例状态异,需要进行服务下线。

更多文章

  • 1965年南京出土一东晋贵族小姐墓,陪葬有200粒红丸,它是何物?

    历史解密编辑:伸手摘星星标签:南京出土东晋墓,南京发现东晋时的古墓,南京明代公主墓出土全过程

    突然间,一位农民手中的锄头锄到了一个非常坚硬的东西,随后这位农民便俯下身去观看。当看清锄头碰到的东西后,他的后背都开始发凉。虽然早已开展反封建迷信宣传,但是作为文化水平不高的农民,猛然间看到眼前的一幕还是被吓住了。他竟然挖到了一座青砖堆砌起来的坟墓!通过砖体的颜色来看,这座坟墓应该是一座年代久远的古

  • 唐朝的一代名将,坚持在敌军地盘建造城池,几十年后才发现高明

    历史解密编辑:笑红尘标签:唐朝全部名将排名,唐朝守城的名将,唐朝城池分布图

    但是在唐朝,就有一位大将,在敌方地盘建造了三座城池,他的举动引起了人们的不解和议论,但在几十年后,人们发现了其中的高明之处。建造城池的张仁愿唐中宗时期,张仁愿上奏请求在黄河以北的位置,修筑三座“受降池”。当奏表在朝堂上念出之时,大臣们面面相觑,因为修筑受降池的位置处于敌国之中,这在大臣眼中简直是不可

  • 唐隆政变后,李隆基为何要杀掉上官婉儿,专家:换做是你也忍不了

    历史解密编辑:异世邪君标签:李隆基杀上官婉儿原因,李隆基为什么不能杀上官婉儿,历史上的上官婉儿和李隆基

    上官婉儿是唐朝宰相上官仪的孙女,出生于官宦之家。上官婉儿含着金钥匙出生,但是一场宫廷斗争,让她的人生跌入了谷底。李治当上皇帝后,皇权处处遭受长孙无忌、褚遂良等重臣的掣肘。李治将性格强势的武则天放在了皇后的位置上,借助武则天之手扳倒了长孙无忌等人。屠龙少年也会变成恶龙。武则天成为皇后之后,由于李治患有

  • 清朝真的很弱吗?实际控制疆域最大,军事不弱于强秦、唐朝、汉朝

    历史解密编辑:莫笑少年梦标签:九分钟看懂清朝的实力,清朝是最弱的王朝吗,汉朝能打败清朝吗

    尽管如此,它们最终都被汉文化所同化,加入到了中原地区的文化发展和传承当中。就是靠着这两个方法,帝国制度风雨兼程地走了2000多年,一直走到了20世纪初,这其实是一件让人意想不到的事情,因为帝国在2000多年的历史长河里,其并没有真正地改变自身的发展核心,没有从内部产生颠覆自己的力量,更加没有认为自己

  • 三国:同样是面对曹军,为何赵云的杀出重围,而吕布却不能?

    历史解密编辑:伸手摘星星标签:吕布顶几下赵云会哭,三国演义赵云大战吕布,马超赵云吕布谁更厉害

    原因有两个:一,是因为曹操惜才,老实说,如果五虎将在曹操之手的话,能发挥出他们更大的作用。曹操敬重赵云的才能,更加佩服他的忠义,所以虽然围困住了赵云却没有下杀手,并不是因为赵云有万夫不当之勇,一个人再厉害也不可能在冷兵器时代以一当百。即使是吕布也不行。二,是因为吕布此人自视甚高,几乎很少能听进他人的

  • 刘备若夺取天下,第一个要杀的便是这3人,诸葛亮看破却不点破

    历史解密编辑:不惹红尘标签:刘备死前最狠一计,刘备得天下之后杀了哪些功臣,刘备两句话害死两个名将

    先不说后世赵匡胤杯酒释兵权,就说刘邦得了天下之后对自己的开国功臣也是忌惮万分,杀了一大批人才。刘备自称是有着一百多个儿子的中山靖王之后,如果是真的,那这血脉里传承下来的东西肯定是改不了的,如果是假的,从他有胆子冒充皇亲国戚这一事件来看,就能够发现刘备的胆量和心机,《三国志》里也说过,刘备少言语,善下

  • 三国时期为什么张飞是死的最憋屈,而魏延最富喜剧性?

    历史解密编辑:黑姑娘标签:张飞魏延黄忠盾兵战法,张飞魏延,历史上的魏延和张飞

    这货估计是三国历史上死的最搞笑的一位了。魏延,字文长,义阳人。三国时期蜀汉名将,深受刘备器重。刘备入川时因数有战功被任命为牙门将军,刘备攻下汉中后又将其破格提拔为镇远将军,领汉中太守,镇守汉中,成为独当一方的大将。魏延镇守汉中近十年,之后又屡次随诸葛亮北伐,功绩显著。期间魏延多次请诸葛亮给他统领一万

  • 三国时期有哪些宁死不屈让人叹息的名将哪?

    历史解密编辑:做你的英雄标签:三国历史上最惨的十大名将,三国宁死不屈的名将,三国乱世名将

    庞德,本为马腾帐下将领,后降曹操。公元219年,庞德协助曹仁抵御关羽。庞德说:“我受国恩,义在效死。我欲身自击羽。今年我不杀羽,羽当杀我。”后庞德与关羽交战,射中关羽的额头。关羽军称其白马将军,对他十分忌惮。后来,庞德战败,被关羽所擒,见到关羽时立而不跪。关羽对庞德说:“卿兄在汉中,我欲以卿为将,不

  • 拿破仑几乎打下整个欧洲,为什么不像秦始皇一样统一整个欧洲成为一个国家呢?

    历史解密编辑:与世无争标签:拿破仑为什么没能统一欧洲,拿破仑是怎么统一欧洲的,拿破仑统一欧洲会失败吗

    但听老梁唠叨的这帮小伙伴都属于民科系的,不是啥专家学者,所以也不追究的那么详细,那么小伙伴在老梁的带领下,咱粗略的了解一下还是能做到的。 首先咱先了解一下欧洲的文化。 为毛咱先了解文化呢?很简单文化是每一个国家的基因,大家伙都知道这基因的好与坏最终决定这个人的发展方向。举个例子您这基因强化了大长腿,

  • 为何说陈胜、吴广领导的大泽乡起义,有其历史必然性?

    历史解密编辑:语文霸霸标签:陈胜大泽乡在哪里,陈胜吴广起义背后的故事,陈胜为什么要绕道安徽大泽乡

    众所周知,大泽乡起义是我国历史上的第一次由农民作为领导者的起义,领导者是陈胜和吴广。这次起义虽然没有摧毁大秦帝国的根基,但是在相当程度上动摇了大秦的统治。那么问题来了,为什么领导者会是陈胜和吴广?被压迫了一辈子的农民,为何敢于起义反抗了?或许我们可以从史书和文人著作中得出结果,就比如《陈涉世家》中写