[springcloud]eureka基本原理理解-server端

简单理解eureka的基本概念,实现原理和核心组件,基于自己对源码阅读的理解,可能会有些理解偏差。会比较少涉及源码解读,更多的是流程的认识,辅助阅读源码。

  • eureka版本:1.10.17

基本概念

Eureka 分为server端和client端。

  • server端负责实例的注册,实例信息的查询,实例的状态维护,实例的集群间同步。eureka的高可用相对于zookeeper来说,简单粗暴,就是依靠多副本间的信息同步,某台server实例挂了就挂了,整个server集群不会受到影响;信息同步可能会出现不一致,也同样不影响server集群的服务,一言以蔽之,(CAP理论中)eureka提供的是AP的特性,而zk提供的是CP的特性。
  • client端没啥,就是注册,查询,维护心跳。

原理理解

Eureka server 原理理解

这里的原理当然都是围绕着注册来的,所以会先介绍数据结构,其次是实例如何注册以及如何维护管理。最后会介绍下集群的高可用背景下集群间的信息同步。

数据结构

eureka是基于application来做不同应用业务的隔离,所以顶层是application,每个application下面就会包含很多的应用实例:instance,这些instance本身会包含比如ip地址等信息,因为还涉及到实例的状态管理这些外部信息:lease(比如实例是否已经过期了),这些信息就存储在一个Map当中。
eureka server的所有功能就是围绕着这个数据结构来进行的了。

核心类:com.netflix.eureka.registry.AbstractInstanceRegistry
核心数据结构:ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry,翻译下=> Map<ApplicationName, Map<InstanceId, Lease<InstanceInfo>

当然,eureka还做了一层缓存优化,以提高对外的查询速度(比如客户端来查询服务实例列表的时候),也可以理解为以上的map不会被外部直接访问。当有实例信息更新时,会把缓存清空掉。

缓存实现类:com.netflix.eureka.registry.ResponseCacheImpl

实例注册的实现

eureka的通信是基于http协议,具体默认实现是Jersey。
怎么实现呢,入口在哪?wireshark分析下客户端向服务器发送了哪些请求(这里我的注册中心端口是8081)。


服务端请求

所以入口就是:
POST /eureka/apps/{application-name}
方法入口:com.netflix.eureka.resources.ApplicationResource#addInstance
流程最终一路走到:com.netflix.eureka.registry.AbstractInstanceRegistry#register
注册完成

这里面当然会涉及到lease的创建,二级缓存CacheResponse的清空等操作。

实例的维护管理

如上图也可以看到,客户端会有心跳,然后最终还是通过AbstractInstanceRegistry来进行心跳的维护。

入口方法:com.netflix.eureka.resources.InstanceResource#renewLease

接下来,就是server端自身的状态维护了。毫无疑问,AbstractInstanceRegistry肯定会有一个定时任务EvictionTask,这个任务干什么的呢,自然就是捞出所有的注册的实例,然后判断状态,比如读取对应的Lease信息,超时无心跳的就干掉。

集群间信息同步

服务器集群间的每个实例对于其它实例来说,也是做为一个eureka client进行通行,当然信息间的同步都是基于推的方式俩俩间通信,即已有的服务实例把自身信息推送给其它新加入的实例,或者把自身有变动的信息推送告知其它实例。

这里简单提下,在服务集群中,每个服务实例都会保存所有其它服务实例列表,每个服务的实例会保存在PeerEurekaNode对象中,这个对象包含HttpReplicationClient用来实现peer通信。

直观看wireshark记录的请求,其中8081端口的是已经运行的实例,8071端口是新加入的实例。


服务集群间的通信
  • 接收同步信息
    可以看到,新服务实例B启动后,同样地向某一台已有的服务实例A进行注册。(前面提到,Application是Eureka中用来区分业务应用的对象,因此所有服务实例都属于比如:EUREKASERVER这个应用。)
    随后服务实例A就向B发送了一个batch请求,这个batch请求会包含所有已注册的实例的列表,每个注册的实例对象除了会包括自身的信息,还会包括当前实例向服务实例A执行的操作。简单理解,batch中的列表记录的是所有实例A受到的eureka client的请求,比如心跳,注册等。然后实例B获取到list后,根据信息dispatch不同操作。

http请求:POST /eureka/peerreplication/batch
方法入口:com.netflix.eureka.resources.PeerReplicationResource#batchReplication

  • 推送同步信息
    通过以上我们大致知道信息的同步过程,那服务实例A是怎么同步的呢。其实就是在客户端实例发起请求的时候,看文提到一个注册的核心类AbstractInstanceRegistry,这里eureka对这个类进行了继承装饰,叫PeerAwareInstanceRegistryImpl。顾名思义,这里的peer就是服务集群的其它实例。每次除了执行实例的注册等操作外,还会让peer感知到这次操作。

这里还有一个问题,难道每一次有客户端实例向服务器实例发起请求,服务器实例都要同步广播一次吗。
默认实现当然不是,不然也不会叫batch了。
PeerEurekaNode 对象中有一个成员叫batchingDispatcher,这个dispatcher里面有两个对象AcceptorExecutorTaskExecutors,TaskExecutors会不断地拉取AcceptorExecutor的工作队列来执行batch任务(这里给个提示:com.netflix.eureka.util.batcher.AcceptorExecutor#requestWorkItems)。而AcceptorExecutor内部会间隔地把任务添加到工作队列。

springcloud是如何集成eureka server的

核心配置类:org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration

该配置类中会自动配置比如比较核心的EurekaClient,PeerAwareInstanceRegistry,还会创建一个jerseyApplication发布Eureka的各种对外Resource接口。
而EurekaClient本身是因为server starter这个包邮引了spring cloud eureka client这个包,这个包会导出EurekaClient组件实例。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容