SpringCloud升級之路2020.0.x版-7.從Bean到SpringCloud


image

本系列為之前系列的整理重啟版,隨着項目的發展以及項目中的使用,之前系列里面很多東西發生了變化,並且還有一些東西之前系列並沒有提到,所以重啟這個系列重新整理下,歡迎各位留言交流,謝謝!~

在理解 Spring Cloud 之前,我們先了解下 Spring 框架、Spring Boot、Spring Cloud 這三者的關系,從一個簡單的 Bean,是如何發展出一個具有微服務特性的 Spring Cloud 的呢?

image

Spring bean 是 Spring 框架在運行時管理的對象。Spring bean 是任何Spring應用程序的基本構建塊。你編寫的大多數應用程序邏輯代碼都將放在Spring bean 中。之后我們就用 Bean 來簡稱 Spring bean

image

BeanFactory 是 Spring 容器的核心,是一個管理着所有 Bean 的容器。通常情況下,BeanFactory 的實現是使用懶加載的方式,這意味着 Bean 只有在我們通過 getBean() 方法直接調用獲取它們時才進行實例化

image

ApplicationContext 在 BeanFactory 的基礎上,增加了:

  • 資源定位與加載,基於 ResourcePatternResolver(其實就是帶通配符的 ResourceLoader),用來定位並加載各種文件或者網絡資源
  • 所處環境,基於 EnvironmentCapable。每個 ApplicationContext 都是有 Environment 的,這個 Environment,包括 Profile 定義還有 Properties。Profile 配置是一個被命名的、bean 定義的邏輯組,這些 bean 只有在給定的 profile 配置激活時才會注冊到容器。Properties 是 Spring 的屬性組,這些屬性可能來源於 properties 文件、JVM properties、system環境變量、JNDI、servlet context parameters 上下文參數、專門的 properties 對象,Maps 等等。
  • Bean 的初始化
  • 更加完整的 Bean 生命周期,包括 BeanPostProcessor 以及 BeanFactoryPostProcessor 的各種處理
  • 國際化,核心類MessageSource
  • 事件發布,基於 ApplicationEventPublisher:將 ApplicationEvent 或者其他類型的事件,發給所有的 Listener

可以理解為 ApplicationContext 內部包含了一個 BeanFactory,並增加了其他的組件,實現了更豐富的功能,並且,與 BeanFactory 懶加載的方式不同,它是預加載,所以,每一個 Bean 都在 ApplicationContext 啟動之后實例化。

image

在 ApplicationContext 的基礎上,Spring 框架引入了很多特性。其中最常見的就是 Spring Web 程序。在過去,Spring Web 應用程序被嵌入到 servlet 容器中運行,大多數的企業應用都是在 servlet 容器上配置並部署運行的。這對於開發人員來說,又增加了關於對應 servlet 容器的學習曲線,這包括:

  • web.xml 和其他面向 servlet 的配置概念
  • .war 文件目錄結構
  • 不同容器的特定配置(例如暴露端口配置,線程配置等等)
  • 復雜的類加載層次
  • 在應用程序之外配置的監控管理相關設施
  • 日志相關
  • 應用程序上下文配置等等

以上配置不同容器並不統一,開發者需要在知道 spring 相關配置的基礎上,還要了解容器這些配置特性。這些復雜的配置特性導致學習門檻變高,並且隨着技術發展掌握 Servlet 原理的開發者越來越少了。在企業應用開發的時候,應用程序框架越簡單,開發人員就越有可能采用該框架。於是,Mike Youngstrom 提出 Improved support for 'containerless' web application architectures,意圖通過內置 Servlet 容器以及預設加載某些類組成特定的 ApplicationContext,來簡化 Spring 應用開發的配置。

Spring Boot,在 ApplicationContext 的基礎上,實現了 Spring Boot 特有的 ApplicationContext,並通過添加不同 ApplicationEvent 的 Listener 實現了特有的生命周期配置SPI 加載機制(spring.factoriesapplication.properties),在此基礎上進而實現了如下功能:

  1. 內置 servlet 容器,提供了容器的統一抽象,即 WebServer。目前包括:Tomcat(TomcatWebServer),Jetty(JettyWebServer),Undertow(UndertowWebServer),Netty(NettyWebServer)
  2. 不同 servlet 容器的配置都可以用相同的 key 在 application.yml 中配置。例如暴露端口不用再在不同的 servlet 容器中配置,而是直接在 application.yml 中配置 server.port 即可。
  3. 不再需要構造 war 包部署到 servlet 容器中,而是直接打包成一個 jar 包直接運行。
  4. 用戶不用關心 ApplicationContext 的創建與管理,而是可以直接使用。
  5. 只存在一個 ClassLoader,而不是像 servlet 容器那樣有獨立的 ClassLoader

image

Spring Cloud 在 Spring Boot 的基礎上,增加微服務相關組件的接口與實現,不同的 Spring Cloud 體系組件接口與實現不同。但是公共的組件接口在 spring-cloud-commons 這個項目中,其中關於微服務組件的接口包括:

  • 服務注冊接口
  • 服務發現接口
  • 負載均衡接口
  • 斷路器接口

實現這些接口的組件,會基於 Spring Cloud 的 NamedContextFactory,對於不同微服務的調用或者控制,以微服務名稱區分,產生不同的子 ApplicationContext。對於這個 NamedContextFactory,我們這個系列會專門有一節進行分析。

image

我們這一節梳理清楚了從 Bean 到 BeanFactory,在 BeanFactory 基礎上封裝的 ApplicationContext,以及主要基於注解的 ApplicationContext 以及 Spring factory SPI 的 Spring Boot,以及在 Spring Boot 基礎上增加微服務抽象的 Spring Cloud 的這一系列關系。接下來我們會詳細分析下 Spring Cloud 中很重要的抽象 - NamedContextFactory

微信搜索“我的編程喵”關注公眾號,每日一刷,輕松提升技術,斬獲各種offer

image


免責聲明!

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



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