服务注册流程解析

本文主要介绍服务注册的基本流程

起手式

接上面的继续说,服务注册是一门至高无上的武学,招式千变万化 ,九曲十八弯打得你找不到北。可正所谓这顺藤摸瓜,瓜不好找,可是这藤长得地方特别显眼。那么今天,就让老师先带大家顺着这个藤往上摸,让大家看看想要打出一套王八拳,哦不,服务注册拳,它的起手式都有哪些。
在这里插入图片描述

  1. 扫描注解高手过招之前,招式未出,先得把招式名称报上来,还要喊得响亮。整个服务注册流程,这@EnableDiscoveryClient注解就是这一声自报家门,就像黑夜里的萤火虫那么耀眼,挂在我们的SpringBoot启动类上。随着这一声叫喊,真气上涌,这人已经暗地里运起了@EnableDiscoveryClient注解里内置的autoRegister心法。
  2. 发起注册此刻,真气经任督二脉行至一个关键穴位,·DiscoveryClient类的register方法,大家可以把这个类当做一个类似Facade模式的门面类,他是服务节点很多操作的入口。就像所有招式总要先气沉丹田一般,服务注册也要经过这个门户来向外发功。在这一步中DiscoveryClient运起了设计模式中的无上功法,代理+装饰器模式,现在执行到了SessionedEurekaHttpClient装饰器。
  3. 装饰器+代理话说SessionedEurekaHttpClient还有个师父(父类),江湖人称EurekaHttpClientDecoratorEureka的一众连接器全部师从(继承)自这个类。从名字中的Decorator就可以看出它用了装饰器设计模式,简单的说,装饰器就像一层套一层的俄罗斯娃娃,每一层都会给本体加上一层Buff(假定大家都玩过王者荣耀,知道Buff是什么意思),所以你也尽可称呼它为装B模式。JDK里使用装B模式的还有大名鼎鼎的输入输出流框架(InputStreamOutputStream)。
  4. 代理注册Eureka的注册流程其实是用代理+回调的方式,实现了类似装饰器的效果,也就是说虽然这个祖师爷EurekaHttpClientDecorator名字里带了个Decorator,但并不是完全体的装B模式,他没有上一步提到的JDK Stream框架装B的彻底。接下来,就要看Eureka大显神通,运用一层层代理,给注册器加上各种装饰器的Buff。

你以为这就开始注册了?那就大错特错了,到目前为止,整个注册过程只是完成了起手式的准备动作。真正的注册,还在后头呢。正所谓越厉害的招数,出手前的吟唱时间也就越长。
图片来源于电影《叶问》

一个支线剧情

很多小伙伴看到这里已经被绕晕了,为什么单单一个注册功能还要准备这么多起手招式,而且还需要这么多类的配合,其实这都是为了达到组件化设计,职责划分,开闭原则等设计理念,这就要说道业务系统和开源项目孵化的不同。

所谓业务系统,在保证可扩展性的基本要求下,尽可能支持公司业务的快速增长,往往不会特别在意系统架构层面的清晰度和组件化。这点在互联网公司表现的更加直接,大型互联网公司业务增长迅速,制约业务发展的往往是IT系统跟不上业务的奔跑速度,比如老师曾经在阿里工作的时候,由于业务增长速度超乎想象,各方需求纷纷而至但现有系统无法支撑,后来2个月的时间我们把整个商品中心重做了2次,这感觉就像给飞行中的飞机换引擎,才撑过了业务量爆发阶段。在这个过程中,首要任务是满足业务发展,留给系统设计架构思考的时间,少之又少。这就是为什么大公司也会有质量很低的代码的原因,缺少code review和架构设计的时间。

在互联网公司做业务团队,老板只会关注你是不是能及时满足业务发展的要求,何曾见到业务团队把架构设计当做一项KPI?正所谓大家只关心你飞的高不高,而不关心你飞的累不累。

而对于开源项目孵化来说,站在Spring组织的角度,对接口规范的履约程度和组件化的划分是有明确要求的。打一个比方,不管你是使用Spring Portlet规范做一套项目,还是使用SpringMVC做项目,你会发现这些组件都严格执行了一套Spring封装的Servlet接口规范在做技术栈变更的时候只用替换具体模块组件就好,对自身业务代码的影响会很小。也就是说,Spring治理下所有开源项目都是一种可插拔的组件模式,当你从一个组件切换到另一个组件的时候由于遵循同一套接口规范,这种迁移变得十分容易。这也就是为什么一个进入Apache或Spring的开源项目,要经过官方指导的漫长的孵化器,一方面是为了稳定功能和版本,另一方面也是为了做好组件化的划分。

注册的一击

现在回到我们的主线上来。刚才我们说到起手式已经结束了,那么接下来我们就要开打了,我只想说“我要打10个”!

  1. 代理模式注册前面说到了装饰器模式就像层层嵌套的洋娃
    娃,我们抽丝剥茧之后发现,总共有4层洋娃娃,每一层装饰器都有特殊的功能,正所谓我走过的最长的路是Eureka的套路。这里我们选- -层最重要的娃娃来展开, 那就是RetryableEurekaHttpClient (注意,这不是最里层的那个)。从名字Retryable我们不难看出,它自带了“失败重试”的功能,这就是它的特殊的Buf-原地复活。
  2. 获取HttpClient这里的HttpClientRetryableEurekaHttpClient里面的代理对象,也是下一层的洋娃娃,它里面封装了上次同步成功的注册中心地址等信息。假如代理对象为空,那我们就不知道该连向哪个注册中心了,这时候我们就要从Server列表中找一台 服务器。
  3. 获取Server列表 在之前的章节我们提到过,客户端的Server列表是开发人员通过上帝视角直接配置的,那么第一步就是获取这些已经配置好的Server列表信息。当然真正的代码在这一步骤的处理,上可谓煞费苦心,后面在源码阅读环节老师会带大家一同探个究竟。
    • 什么?没有找到可用服务器?此处招式转为扁鹊三连-治不了,等死吧,告辞。-个异常直接扔出,等待后台定时服务在一定时间后 重新启动服务注册流程
    • 发现可用服务器列表?那太好了,直接取列表中的第x台机器作为目标注册机器(大家记着这个x,后面有用)
  4. 发送注册请求 最里层的装饰器发起了真正的杀招,调用了J erseyApplicationCLient的register方法向注册中心发起最后一击。同学们一定好奇都注册了哪些信息,那场面真是人山人海红旗招展,几十个属性依次排开,这我哪能记得住,但是大家不必记在心上。就比如看水浒传,梁山一百单八将你非得都记全了才敢说自己看过水浒?不对吧,咱就记住几个主线剧情常露脸的就行了。同理,这里你只要记住注册信息中的三大金刚:服务名称,服务节点IP,节点状态,就完成任务了。接下来看看注册中心返回什么response:
    • 注册成功,那便深藏功与名,出门左转慢走不送
    • 注册失败,胜败乃兵家常事,大侠请重新来过。咱不是有个原地复活的Buff吗?那我们可以换一个注册节点再来Retry。还记得上一步获取Server列表时,当有可用服务器时取第x台机器吗?这里就用到了,这里咱就把x自增一,然后重新走一遍注册流程取下一台机器就好了。什么?复活次数达到上限了所有机器全都注册失败?那此处再次转为扁鹊三连,等下次后台定时Task来注册吧。
      在这里插入图片描述

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/334894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLMs之Vanna:Vanna(利用自然语言查询数据库的SQL工具+底层基于RAG)的简介、安装、使用方法之详细攻略

LLMs之Vanna:Vanna(利用自然语言查询数据库的SQL工具底层基于RAG)的简介、安装、使用方法之详细攻略 目录 Vanna的简介 1、用户界面 2、RAG vs. Fine-Tuning 3、为什么选择Vanna? 4、扩展Vanna Vanna的安装和使用方法 1、安装 2、训练 (1)、使用…

航空飞行器运维VR模拟互动教学更直观有趣

传统的二手车鉴定评估培训模式存在实践性不强、教学样本不足、与实际脱节等一些固有的不足。有了VR虚拟仿真技术的加持,二手车鉴定评估VR虚拟仿真实训系统逐渐进入实训领域,为院校及企业二手车检测培训提供了全新的解决方案。 高职院校汽车专业虚拟仿真实…

手写Vue3源码

Vue3核心源码 B站视频地址:https://www.bilibili.com/video/BV1nW4y147Pd?p2&vd_source36bacfbaa95ea7a433650dab3f7fa0ae Monorepo介绍 Monorepo 是管理项目代码的一种方式,只在一个仓库中管理多个模块/包 一个仓库可以维护多个模块,…

鸿蒙开发系列教程(五)--ArkTS语言:组件开发

1、基础组件 组件API文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…

项目实战———苍穹外卖(DAY12)

课程内容 工作台 Apache POI 导出运营数据Excel报表 功能实现:工作台、数据导出 工作台效果图: 数据导出效果图: 在数据统计页面点击数据导出:生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原型 工作台是系统运营…

SpringBoot的yml多环境配置3种方法

文章目录 SpringBoot的yml多环境配置3种方法1、多个yml文件1.1、创建多个配置文件applicaiton.yml中指定配置 2、单个yml文件3、在pom.xml中指定环境配置3.1、创建多个配置文件3.2、在application.yml中添加多环境配置属性3.3、在pom.xml中指定使用的配置3.4、问题:…

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言(GDL) 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

VB6.0报错:操作符AddressOf使用无效

VB调试,尝试调用DLL中的方法并带有回调函数,报错提示: 操作符AddressOf使用无效 代码: Private Sub btnScan_Click()... WCHBLEStartScanBLEDevices AddressOf callBackEnd Sub This function is called from the dll Public Fu…

蓝桥杯-最少刷题数

📑前言 本文主要是【算法】——最少刷题数的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&#x…

IaC基础设施即代码:Terraform 创建 docker 网络与容器资源

目录 一、实验 1.环境 2.Terraform查看版本 3.Linux主机安装Docker 4.Terraform使用本地编译(In-house)的Providers 5.Docker-CE 开启远程API 6. Linux主机拉取镜像 7.Terraform 创建docker 网络资源 8.Terraform 创建docker 容器资源 一、实验 …

Tensorflow2.0笔记 - 不使用layer方式,简单的MNIST训练

本笔记不使用layer相关API,搭建一个三层的神经网络来训练MNIST数据集。 前向传播和梯度更新都使用最基础的tensorflow API来做。 import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets import numpy as npdef load_mnist(…

Modern C++ 条件变量

今天无意中看到一篇帖子&#xff0c;关于条件变量的&#xff0c;不过仔细看看发现它并达不到原本的目的。 程序如下&#xff0c;读者可以先想想他的本意&#xff0c;以及有没有问题&#xff1a; #include <iostream> #include <thread> #include <condition_v…

无刷电机学习-原理篇

一、无刷电机的优点 使用一项东西首先就要明白为什么要使用它&#xff0c;使用它有什么优点。与有刷电机相比无刷电机除了控制繁琐几乎全是优点。 1、应用范围广&#xff1a;家用电器&#xff08;冰箱空调压缩机、洗衣机、水泵等&#xff09;、汽车、航空航天、消费品工业自动…

STM32之002--软件安装 Keil

文章目录&#xff1a; 一、安装 Keil 二、注册 三、安装芯片支持包 一、安装 Keil 重点 1&#xff1a; 安装时&#xff0c;不能使用中文路径&#xff0c;否则无法正常使用!! 重点 2&#xff1a; 不要安装 V5.36 及以上的版本&#xff0c;其默认AC6编译器&#xff0c…

(二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真

一、创建工作空间 mkdir catkin_ws cd catkin_ws mkdir src cd src 二、下载wpr_simulation源码 git clone https://github.com/6-robot/wpr_simulation.git 三、编译 ~/catkin_make 目录下catkin_makesource devel/setup.bash 四、运行 roslaunch wpr_simulation wpb_s…

priority_queue的使用与模拟实现(容器适配器+stack与queue的模拟实现源码)

priority_queue的使用与模拟实现 引言&#xff08;容器适配器&#xff09;priority_queue的介绍与使用priority_queue介绍接口使用默认成员函数 size与emptytoppush与pop priority_queue的模拟实现构造函数size与emptytoppush与pop向上调整建堆与向下调整建堆向上调整建堆向下调…

ssh: connect to host github.com port 22: Connection refused

ssh: connect to host github.com port 22: Connection refused 问题现象 本文以Windows系统为例进行说明&#xff0c;在个人电脑上使用Git命令来操作GitHub上的项目&#xff0c;本来都很正常&#xff0c;突然某一天开始&#xff0c;会提示如下错误ssh: connect to host gith…

通讯录项目的实现以及动态顺序表(基于顺序表)

首先我们要知道什么是顺序表: 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝,顺序表分为静态顺序表(使⽤定⻓数组存储元素)和动态顺序表(按需申请) 静态顺序表缺点: 空间给少了不够⽤,给多了造成空间浪费 拿出来我之前以及写好了的顺序表的代码:…

LeetCode、162. 寻找峰值【中等,最大值、二分】

文章目录 前言LeetCode、162. 寻找峰值【中等&#xff0c;最大值、二分】题目及类型思路及代码思路1&#xff1a;二分思路2&#xff1a;寻找最大值 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿…

微信小程序(七)navigator点击效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.默认效果 2.无效果 3.激活效果 源码&#xff1a; index.wxml //如果 <navigator url"/pages/logs/logs">跳转到log页面&#xff08;默认&#xff09; </navigator><navigator url&q…