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請求,把客戶端的信息發送給服務器,完成注冊。

 

 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM