服务注册流程解析

news2024/11/15 8:41:25

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

起手式

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

  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学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【极问系列】springBoot集成elasticsearch出现Unable to parse response body for Response

【极问系列】 springBoot集成elasticsearch出现Unable to parse response body for Response 如何解决? 一.问题 #springboot集成elasticsearch组件,进行增删改操作的时候报异常Unable to parse response body for Response{requestLineDELETE /aurora-20240120/…

HarmonyOS4.0系列——07、自定义组件的生命周期、路由以及路由传参

自定义组件的生命周期 允许在生命周期函数中使用 Promise 和异步回调函数,比如网络资源获取,定时器设置等; 页面生命周期 即被Entry 装饰的组件生命周期,提供以下生命周期接口: onPageShow 页面加载时触发&#xff…

UE5 C++ 学习笔记 UBT UHT 和 一些头文件

总结一些似懂非懂的知识点,从头慢慢梳理。 任何一个项目都有创建这些三个.cs。 这个是蓝图转C 这个是本身就是C项目,应该就是多了一个GameModeBase类 Build.cs包含了每个模块的信息,表明了这个项目用到了哪一些模块。该文件里的using UnrealBuilTool 是…

路由器结构

路由器是连接互联网的设备,本文主要描述路由器的结构组成。 如上所示,OSI(Open System Interconnect)开放系统互联参考模型是互联网架构的标准协议栈,由ISO标准组织制定。自底向上,互联网架构分为7层&#…

Gitee作为远程仓库保存Vue项目

1.先在gitee上创建仓库 2.本地创建vue项目 3. 将本地项目与远程仓库进行关联 依次执行以下命令 # 进入到项目所在目录 cd vue-rabbit # 将项目变成git项目, 运行命令会在该目录下生成 .git文件 git init# 本地仓库与远程仓库进行关联 git remote add origin 你项目的远程地址…

vue+springboot(前后端分离项目)

目录 JAVA后端项目 一、创建项目 1、使用aliyun的server url 2、初始化项目结构 3、添加依赖 4、创建文件夹 5、把mapper类交给spring容器管理 5.1、方法1 5.2、方法2 6、在yaml文件中配置数据库信息 7、在yaml文件中配置mapper的xml文件的路径 8、配置mapper的xml文…

Django开发_13_静态资源、cookie/session/token

一、在html文件下的操作 (一)在html中添加{% load static %}标签,加载static模块 (二)使用{%static "图片地址" %}动态生成静态资源URL 二、csrf跨站请求伪造 在账号登录的html文件中相应位置要加上{% csr…

转转交易猫自带客服多模板全开源完整定制版源码

商品发布; 请在后台商品添加成功后, 再点击该商品管理,可重新编辑当前商品的所有信息及配图以及支付等等相关信息 可点击分享或者跳转,将链接地址进行发布分享 请在手机端打开访问 访问商品主要模板文件路径目录 咸鱼&#…

K8S-YAML

一、Kubernetes对象的描述 kubernetes中资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON。其内容可以分为如下四个部分: typeMeta:对象类型的元信息,声明对象…

软件是什么?前端,后端,数据库

软件是什么? 由于很多东西没有实际接触,很难理解,对于软件的定义也是各种各样。但是我还是不理解,软件开发中的前端,后端,数据库到底有什么关系呢! 这个问题足足困扰了三年半,练习时…

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…

基于Mcrosemi M2S090T FPGA 的 imx991 SWIR的SLVS解码(一)

目录 一、平台介绍 二、器件的简介 1、imx991 SWIR Image Sensor 2、M2S090T 三、工程 1、imx991寄存器配置 一、平台介绍 工程开发平台:Libero Version:20231.0.6 Release:v2023.1 文本编辑器:Sublime text3 二、器件的简介 1、imx991 SWIR I…

K8s调试积累

文章目录 一、K8S 集群服务访问失败?二、K8S 集群服务访问失败?三、K8S 集群服务暴露失败?四、外网无法访问 K8S 集群提供的服务?五、pod 状态为 ErrImagePull?六、探测存活 pod 状态为 CrashLoopBackOff?七…

postman导入https证书

进入setting配置中Certificates配置项 点击“Add Certificate”,然后配置相关信息 以上配置完毕,如果测试出现“SSL Error:Self signed certificate” 则将“SSL certificate verification”取消勾选

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1)Dcm和PduR的交互2)Dcm和ComM模块的交互3)Dcm和Dem的交互4&a…

Maven(五)如何只打包项目某个模块及其依赖模块?

目录 一、背景二、解决方案三、补充3.1 提出疑问3.2 解答 一、背景 在 SpringCloud 微服务框架下,会存在多个模块。当我们需要对其中某一个服务打包的时候,需要将该服务依赖的模块一起打包更新,如果项目比较小的话我们可以直接将项目中的所有…

C++ memmove 学习

memmove&#xff0c;将num字节的值从源指向的位置复制到目标指向的内存块。 允许目标和源有重叠。 当目标区域与源区域没有重叠则和memcpy函数功能相同。 宽字符版本是wmemmove&#xff0c;安全版本加_s&#xff1b; #include "stdafx.h" #include<iostream&g…

Addressables(2) ResourceLocation和AssetReference

IResourceLocation var op Addressables.LoadResourceLocationsAsync(key); var result op.WaitForCompletion(); 把加载的Key塞进去&#xff0c;不难看出&#xff0c;IResourceLocation可以用来获得资源的详细信息 很适合用于更新分析&#xff0c;或者一些检查工具 AssetR…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

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

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