源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

1. 概述

老话说的好:要善于思考,有创新意识。

言归正传,之前聊了 Springboot 的启动过程,今天来聊聊 Eureka Client 的注册过程。

2. Eureka Client 的注册过程

2.1 找入口

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

Eureka Client 留给我们的线索不多,似乎只有这个 @EnableDiscoveryClient 注解,我们进去看看

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

看到了一个 @Import 注解,进入到
EnableDiscoveryClientImportSelector 类看看

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

从逻辑看,后面会实例化
AutoServiceRegistrationConfiguration 这个类,进去这个类看看

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

有点高深。。。,似乎只有
AutoServiceRegistrationProperties 这个类有点用,翻译过来是 自动服务注册属性,应该和注册有关,来看看哪里调用它了吧。

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

进入
AbstractAutoServiceRegistration 类

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

实例化的时候用到了,跟它一起注入的有个 ServiceRegistry 对象,似乎这个对象和服务注册关系更大

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

这 ServiceRegistry 是个接口,里面有 register 方法,进入子类方法看看

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

好在只有一个子类 EurekaServiceRegistry,设置个断点,我们验证一下

2.2 EurekaServiceRegistry

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

断点果然到这里了,但从逻辑看,似乎并没有请求 Eureka Server 的代码出现。

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

我们把断点的方法栈往上跳一层,会看到下一步是向上下文中发布一个 InstanceRegisteredEvent 事件,看来之后某个监听器会调用这个事件

2.3 再次寻找线索

发布事件后,似乎断线了,我们到 jar 包里看看。(从监听器找线索也可以)

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

看到了 EurekaDiscoveryClient 这个类,根据经验应该是由这个类请求 Eureka Server 吧

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

似乎类里也没有请求 Eureka Server 的逻辑,但里面注入了一个 EurekaClient

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

打开 EurekaClient,是个接口,上面有一行 @ImplementedBy 注解,参数是 DiscoveryClient.class,进去看看

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

里面有个 register(注册)方法,设置个断点,试试

2.4 各种装饰

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

果然走到了,但似乎又去调了 SessionedEurekaHttpClient 的 register 方法

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

来到 SessionedEurekaHttpClient 类,我们发现 register 在它的父类 EurekaHttpClientDecorator 中,从名称就能看出这是个装饰器模式

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

父类的 register 方法,调用子类的 execute 方法,参数是一个匿名内部类,匿名内部类中实现的 execute 方法,参数是一个 EurekaHttpClient 的子类,然后再调用这个类的 register 方法

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

进入到 SessionedEurekaHttpClient 类的 excute 方法,果然加了装饰

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

相同的包下,有 RetryableEurekaHttpClient、
RedirectingEurekaHttpClient、MetricsCollectingEurekaHttpClient、SessionedEurekaHttpClient 4个装饰器类。

然后跟断点,发现是一系列的装饰。。。

2.5 真正注册

经过一系列的装饰,终于找到了
RestTemplateEurekaHttpClient 这个非装饰类

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

这个方法里要真正的发起请求了,urlPath 都有了

urlPath:
http://localhost:35000/eureka/apps/MY-EUREKA-CLIENT,应该就是这里了

源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程
源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程
源码分析 SpringCloud 2020.0.4 版本 EurekaClient 的注册过程

最终,使用 httpClient 完成了请求的调用

2.6 总结

整个流程中用到了类的自动装载,上下文事件,装饰器模式,反射等知识,多看看确实能学到不少平时不常用的技术。

3. 综述

今天聊了一下 EurekaClient 的注册过程,希望可以对大家的工作有所帮助

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

推荐阅读更多精彩内容