springcloudalibaba与nacos服务注册流程图

springboot + springcloud + springcloudalibaba + nacos 服务注册流程图:

 

springboot

  

  ①WebApplicationContext

  ②start tomcat     --->  启动tomcat

  ③spring context refresh   --->  初始化spring容器

  ④发布各种事件,就是spring 事件发布

spring cloud-commons 

  

  AbstractAutoServiceRegistration.java----顾名思义、完成自动注册

  ①在springboot初始化的时候也就是第③步的时候回去load
  这个抽象类是首先一个监听器;主要监听WebServerInitializedEvent的事件,在springboot项目启动的过程中④就会发布这个事件、但是这个类是抽象类,由子类去响应监听,像spring cloud这种顶级准一流项目,他永远只定义标准、抽象,由此子路老师想到一句话——程序员的能力体现在于他的抽象能力;
  ②如果一个对象想要监听spring的事件必须是一个bean;也就是必须得被spring容器管理、或者叫做被spring容器初始化;那么问题来了这个AbstractAutoServiceRegistration什么时候被初始化的呢?spring-cloud-commons\META-INF\spring.factories配置了一个 AutoServiceRegistrationAutoConfiguration;这个类中注入了AbstractAutoServiceRegistration子类NacosAutoServiceRegistration而他提供了唯一的构造方法,其中注入了ServiceRegistry的实现NacosServiceRegistry---感受一下标准的魅力吧。
  ③NacosAutoServiceRegistration和NacosServiceRegistry为什么可以注入成功?没有被扫描啊;其实这两个类不属于spring cloud项目的;是属于nacos项目的类;故而nacos会去完成这个事情;记住sc只定义标准

  ServiceRegistry.java

  spring cloud 提供的一个接口;主要是为了统一编程;该接口抽象了对注册中心的各种api;比如服务注册、服务销毁、服务更新
 

spring-cloud-alibaba

  

  spring-cloud-starter-alibaba-nacos-discovery

  这个项目是nacos为了能够和spring cloud配合工作而开发的一个starter;
  说白了就是①对springboot做扩展和②对spring cloud做实现;
  首先我们说对sc实现吧;上图说到spring cloud提供两个类;一个抽象类一个是接口;
  都在这个项目当中实现的;分别是:
    一:NacosServiceRegistry ---完成nacos的注册功能--发一个http给服务器
    二:NacosAutoServiceRegistration--- 完成自动调用nacos的注册方法
  至于上文提到的他们如何实例化的;也是在这个项目当中完成的;也就是对spring boot扩展spring.factories当中定义了一个NacosServiceRegistryAutoConfiguration;这个类当中定义了@Bean NacosAutoServiceRegistration 所以这个自动注册类能够被实例化;同时还定义了NacosRegistration,故而他能被注入到NacosAutoServiceRegistration
  spring-cloud-starter-alibaba-nacos-discovery 这个项目会自动依赖 nacos的客户端
 

至此我们来做个总结;看看每个项目的大概意图

  

  一:springboot作为项目的基本依赖;主要提供自动配置的功能、初始化容器、发布事件等等。
 
  二:sc说我很牛逼我定标准吧;既然你是微服务肯定得有注册中心;于是我提供一个接口来规范对注册中心操作的api,比如提供一个register()方法来想注册中心注册服务;可能有人会问要你规范个蛋蛋;我们不能自己定义api?当然可以,只不过sc已经对springboot做了很优秀的扩展,你如果不按照人家的规范来;那么他做的这些扩展你就用不到;你必须得自己写;可能有人会说自己写就写;有james带着我们;分分钟的事呀;首先我不确定james能写;即使他能写,写出来了spring官方肯定不会收入;那么sc对springboot做了哪些牛逼的扩展呢?比较多;不一一列举;这里需要关心的就是他会监听springboot的事件;严格意义不是他会监听;他是要求产品方自己监听事件然后完成对事件的响应;在响应事件的时候完成服务注册;注意这是他要求的。
 
  三:然后是naocs 他作为一款独立产品其实已经具备他该有的功能;比如服务注册;但是他的注册方式肯定不符合spring cloud的要求;比如他不能自动注册,比如他的注册方法不是regitster可能叫zhuce;那怎么办呢?为了能和sc苟合alibaba开发了spring-cloud-alibaba;
 
  四:spring-cloud-alibaba的组件很多;这里只说和注册有关的;首先为了迎合sc他只能开发一个类去实现sc提供的注册接口;然后在这个实现类当中调用自己的api;接着还要完成人家的自动注册功能;只能继承他提供的监听器去响应springboot的事件完成自动注册;但是这一切的前提是他自己写的这些个类必须被spring容器管理;那怎么办呢?只能对springboot做扩展;提供配置文件。
 

nacos

  NacosAutoServiceRegistration extends AbstractAutoServiceRegistration

    能够监听到WebServerInitializedEvent事件;继而做出相应调用 NacosServiceRegistry当中的register方法完成服务注册。

  NacosServiceRegistry impliments ServiceRegistry

    实现了服务中心的各种api,比如服务注册register()。

  发送http请求注册服务

    通过JDK提供的java.net包下面的提供的Http技术发送了一个htt请求,把客户端的信息发送给服务器,完成注册。

 

 
 
 

 

posted @ 2020-04-17 09:56  SoyWang  阅读(1152)  评论(0编辑  收藏  举报