微服務[v1.0.0][Spring生態概述]
Spring的由來
Java是一種物件導向的跨平臺的程式語言,其引入了JVM,能夠一次編譯處處執行,開發者無須再擔心作業系統和處理器的不同而導致應用出錯,就應用開發而言,無論使用哪種語言,為保證應用程式碼的可讀性、可靠性就需要在單一原則、開閉原則、里氏替換原則、依賴倒置原則、介面隔離原則、迪米特法則等設計原則的指導下,遵循設計模式進行設計和開發,就設計模式而言,最著名的當屬GoF的23種設計模式
- Java自1995年以JDK1.0釋出為誕生標誌,迅速成為企業級應用平臺開發的主流,尤其作為Android系統的開發語言更是助推了Java語言的發展
- JDK(Java Development Kit)是一個Java開發工具包,是官方提供的Java執行和開發軟體包,主要包含Java執行環境(JRE)、Java基礎類庫及工具
- 為促進Java的發展1998年Sun成立了一個開放組織JCP(Java Community Process)
- 從JDK1.2開始Java技術體系拆分為J2SE/J2EE/J2ME/Swing/Java Plug-in/EJB
- 後來為了統一Java開發的標準,JCP定義了JavaEE的開發框架,作為企業級應用開發的規範和指南,也包括中介軟體的標準,包括Servlet、JSP(Java Server Pages)、JDBC(Java Database Connectivity)、JNDI(Java Naming and Directory Interface)、RMI(Remote Method Invocation)、Java IDL/CORBA、XML、JMS(Java Message Service)、JTA(Java Transaction API)、JTS(Java Transaction Service)、Java Mail、JAF(JavaBeans Activation Framework)和EJB(Enterprise JavaBean)
- EJB是JavaEE服務端元件模型,其目標與核心是開發和部署分散式應用程式,通過將業務邏輯從客戶端抽取出來,封裝在一個元件中並執行在一個獨立的伺服器上,客戶端軟體通過網路呼叫服務端的元件實現業務邏輯,這個執行在獨立伺服器上且封裝了業務邏輯的元件被稱為EJB,對於開發者來說這裡的元件可簡單的理解為類,也就是把執行業務邏輯的類打包放在伺服器上,通過網路進行呼叫,實現EJB的技術核心是RMI(Remote Method Invocation),更底層的技術是Socket程式設計和TCP
- Spring的出現,EJB除了善於處理分散式應用外,還有一個關鍵作用就是簡化了程式碼開發、開發者無須處理低階事務、狀態管理、多執行緒和連線池等,全全交給EJB容器管理,但EJB比較複雜,除錯困難,內容多學習成本高,並且頻繁的序列化和反序列化導致效能不佳,因此逐漸出現了替代的元件和框架,例如遠端呼叫上Web Service標準逐漸盛行出現了Apache CXF框架而Java Bean的管理上則出現了Spring,自2004年Spring釋出1.0至今已經到了Spring5.x.x
Spring框架是為了解決企業應用開發的複雜性而誕生的,它簡化了Java應用開發,提高了可測性和可重用性;其核心理念之一是通過依賴注入(DI)的方式來實現控制反轉(loC),核心理念之二便是面向切面程式設計(AOP);作為輕量級的IoC容器,Spring框架可輕鬆實現與其他多種框架的整合,其逐步成為Java企業級開發最流行的框架,形成了以框架為核心的生態圈,成為Java應用開發的一站式解決方案
它是一個分層的JavaSE/EE一站式輕量級框架,以IoC(Inversion of Control控制反轉)和AOP(Aspect Oriented Programming面向切面程式設計)為核心,在Spring中認為一切Java類都是資源,而資源都是類的例項物件(Bean),容納並管理這些Bean的是Spring所提供的IoC容器,因此Spring也是基於Bean的程式設計,使用JavaBean來完成以前只有EJB才能完成的工作
他致力於JavaEE應用各層的解決方案,而不僅僅專注於一層
Spring框架原則和理念
- Spring的目標是提供一個一站式輕量級的應用開發平臺,抽象應用開發遇到的共性問題,提供了更個層級的支援,包括MVC框架、資料持久層、事務處理、訊息中介軟體等
- Spring提供了與其他中介軟體的廣泛支援,開發者可以儘可能晚地決定使用哪種方案,以資料持久層為例,可以通過配置切換持久層框架,無須修改程式碼,其他的基礎框架和第三方API的整合也是如此
- 強大的向後相容,功能升級的同時對舊版本保持了很好的相容性
- Spring官方提供了全面和易用的API文件,這些API文件穩定性較高,在多個版本中維持不變,Spring框架強調有意義的、及時的和準確的Java Doc,而這得益於Spring清晰乾淨的程式碼結構,包之間不存在迴圈依賴
Spring框架體系結構
Spring框架包含20多個模組,每個模組由3個左右JAR包組成,而這20多個模組被分成了7大類
- 容器核心:它提供了Spring的基本功能,容器是Spring框架的基礎,負責Bean的建立、拼接、管理和獲取
- Beans模組:提供了BeanFactory,BeanFactory是容器的核心介面,是工廠模式實現的經典,Spring將管理物件稱為Bean
- Core模組:提供了Spring框架的基本組成部分,實現了IoC/DI等核心功能
- Context模組:在核心模組上進行了功能的擴充套件,增加了國際化、框架事件體系、Bean生命週期管理和資源載入透明化等功能此外該模組還提供了其他企業級服務的支援,包括郵件服務、JNDI訪問、任務排程和EJB整合等,它是訪問定義配置的任何物件的媒介,擴充套件了BeanFactory的功能,其中ApplicationContext是Context模組的核心介面
- Spring EL模組:它是Spring3.0後新增的模組,提供了Spring Expression Language支援,它是表示式語言模組是統一語言表示式(Unified EL)的一個擴充套件,用於查詢和管理容器、管理物件、獲取和設定物件屬性、呼叫物件方法、運算元據等,此外SpEL表示式還可具備邏輯表示式運算和變數定義等功能,基於此表示式,就可以通過字串與容器進行互動
- 資料訪問/整合:包括JDBC、ORM、OXM、JMS和事務處理5個模組
- JDBC模組:實現了對JDBC的抽象,簡化了JDBC連線資料庫和操作的編碼
- ORM模組:對多個流行的ORM框架提供了統一的資料操作方式,提供了與多個第三方持久層框架的良好整合,包括Hibernate、MyBatis、Java Persistence API和JDO
- OXM模組:提供了對OXM實現的支援(提供了一個支援物件/XML對映的抽象層實現),比如JAXB、Castor、XML Beans、JiBX和XStream等
- JMS模組:提供了對訊息功能的支援,可以生產和消費訊息,自Spring4.1後提供了與Spring-messaging模組的整合
- 事務處理模組:提供了程式設計式和宣告式事務管理,支援JDBC和所有ORM框架
- Spring在DAO的抽象層面對不同的資料訪問技術進行了統一和封裝,建立了一套面向DAO的統一異常體系
- Web與遠端呼叫
- Servlet模組:也稱作Spring-webmvc模組,提供了一個強大的MVC框架,用於Web應用實現檢視層與邏輯層的分離和REST Web Services實現的Web應用程式
- Web模組:提供了面向Web的基本功能和Web應用的上下文,例如使用Servlet監聽器的IoC容器初始化、檔案上傳功能等,且此模組還包括HTTP客戶端和Spring遠端呼叫等
- Portlet模組:提供了用於Portlet環境的MVC實現
- WebSocket模組:支援在Web應用中客戶端和服務端基於WebSocket雙向通訊,也提供了SockJS的實現,以及對STOMP的支援
- 其他模組
- AOP模組:Spring提供了面向切面程式設計的支援,類似於事務和安全等關注點從應用中解耦出來,允許定義方法攔截器和切入點,將程式碼按照功能進行分離,從而降低耦合
- Aspects模組:提供了與AspectJ的整合,它是一個面向切面程式設計的框架
- Instrumentation(檢測) :該模組提供了在應用伺服器中類工具的支援和類載入器實現,Instrument Tomcat是針對於Tomcat的Instrument實現
- 訊息:Messaging模組用於訊息處理,它包含了一系列用於對映訊息的註解,提供了對訊息傳遞體系結構和協議的支援
- 測試:Test模組通過JUnit和TestNG框架支援的單元測試和整合測試,提供了一系列的模擬物件輔助單元測試,另外Spring提供了整合測試的框架,可以很容易的載入和獲取應用的上下文
- 同時Spring提供了與其他流行MVC框架的整合,包括Struts、JSF和WebWork等
- 此外Spring還提供了對REST API的支援,Spring自帶一個遠端呼叫框架HTTP invoker,它整合了RMI、Hessian、Burlap和JAX-WS
以上模組均在Maven中可以找到,組名(groupId)是org.springframework,各模組分別對應不同的專案(artifactId),如下表所示
模組名 | Maven專案名 | 描述 |
---|---|---|
Core | spring-core | 核心庫 |
Beans | spring-beans | Bean支援 |
Context | spring-context | 應用的上下文 |
Context | spring-context-support | 整合第三方庫到上下文 |
SpEL | spring-expression | Spring表示式語言 |
AOP | spring-aop | 基於代理的AOP |
Aspects | spring-aspects | 與AspectJ整合 |
Instrumentation | spring-instrument | JVM引導的檢測代理 |
instrumentation Tomcat | spring-instrument-tomcat | Tomcat的檢測代理 |
Messaging | spring-messaging | 訊息處理 |
JDBC | spring-jdbc | JDBC的支援和封裝 |
Transaction | spring-tx | 事務處理 |
ORM | spring-orm | 物件關係對映,支援JPA和Hibernate |
OXM | spring-oxm | 物件XML對映 |
JMS | spring-jms | JMS訊息支援 |
Servlet | spring-webmvc | MVC框架及REST Web |
Portlet | spring-webmvc-portlet | Portlet環境的MVC實現 |
Web | spring-web | 客戶端及Web遠端呼叫 |
WebSocket | spring-websocket | WebSocket和SockJS實現 |
Test | spring-test | 測試模擬物件和測試框架 |
Spring的優勢
Spring作為實現JavaEE的一個全方位應用程式框架,具備以下特點:
- 非侵入式:指的是Spring框架的API不會在業務邏輯上出現,換句話說業務邏輯應該是純淨的,不能出現與業務邏輯無關的程式碼,如此才能將業務邏輯從當前應用中剝離出來,從而在其他的應用中實現複用,從框架角度而言,做到業務邏輯中沒有Spring的API,所以業務邏輯也可以從Spring框架快速地移植到其他框架
- 容器:Spring提供了容器功能,容器可以管理物件的生命週期,以及物件與物件之間的依賴關係,可以寫一個配置檔案(通常是xml),在上面定義物件名字,是否單例,以及設定與其他物件的依賴關係,容器啟動後這些物件就被例項化好了,直接就可以用,並且依賴關係也建立好了
- IoC:控制反轉,也就是依賴關係的轉移,如果以前都是依賴於實現,那麼現在反轉為依賴於抽象,核心思想就是面向介面程式設計
- 依賴注入:物件與物件之間依賴關係的實現,包括介面注入、構造注入、屬性setter方法注入,Spring中支援後兩種注入
- AOP:面向切面程式設計或者叫面向方面程式設計,將日誌、安全、事務管理等服務或功能理解成一個“方面”以前這些服務通常是直接寫在業務邏輯的程式碼中,導致業務邏輯不純淨且無法做到複用,AOP將這些服務剝離出來形成一個“方面”,實現複用,然後將“方面”動態地插入到業務邏輯中,讓業務邏輯能夠方便地使用“方面”提供的服務
- 對JDBC的封裝和簡化
- 對事務的管理
- 對O/R mapping工具(Hibernate、MyBatis)的整合
- MVC解決方案
- 與其他Web框架(Struts、JSF)進行整合
- 對JNDI、mail等服務進行封裝
Spring生態
Spring是一個發展和開放的體系,提供了企業應用級開發的一站式服務,包括基於Spring Framework之上的快速開發框架Spring Boot、對服務進行管理和治理的Spring Cloud、以及通過Spring Cloud Data Flow進行服務的連線,從配置到安全,從Web應用到大資料專案,Spring幾乎都覆蓋
- Spring Framework(Core):Spring的核心,其中包含了一系列的IoC容器設計,提供了依賴反轉模式的實現,此外Spring框架還包括MVC、JDBC、事務處理及AOP等模組
- Spring Boot:簡化了基於Spring的應用開發,簡化了配置,通過少量的程式碼就可以建立一個獨立的、產品級的Spring應用,Spring Boot為Spring平臺及第三方庫提供了開箱即用的設定,可以快速的搭建專案並開始開發
- Spring Cloud Data Flow:用於開發和執行大資料處理、批量運算的統一程式設計模型和託管服務,簡化了大資料應用開發
- Spring Cloud:一系列框架的有序集合,包括分散式/版本化配置Spring Cloud Config、服務註冊和發現、Spring Cloud Eureka、路由Spring Cloud Zuul、服務到服務的呼叫Spring Cloud Feign、負載均衡Spring Cloud Ribbon、斷路器Spring Cloud Hystrix、分散式訊息傳遞Spring Cloud Bus
- Spring Data:提供了對JDBC和ORM很好的支援,同時實現對非關係型資料庫、MapReduce框架等統一的方式進行資料訪問
- Spring Integration:體現了“企業整合模式”的具體實現,併為企業的資料整合提供解決方案,它為企業資料整合提供了各種介面卡,通過這些介面卡來轉換各種訊息格式,並幫助Spring應用完成與企業應用系統的整合
- Spring Batch:提供構建批處理應用和自動化操作的框架,簡化並優化大量資料的批處理操作,支援事務、併發、流程、監控、縱向和橫向擴充套件,提供統一的介面管理和任務管理
- Spring Security:廣泛使用的基於Spring的認證和安全工具,其前身是Acegi框架,用於認證和授權;他是用Servlet規範中的Filter限制URL級別的訪問,保護Web請求,還可以使用AOP保護方法的呼叫
- Spring HATEOAS(Hypermedia as the engine of application state):即超媒體即應用狀態引擎,相對於REST的最大區別是返回結果中包含下一步的連結
- Spring REST Docs:快速生成可讀的RESTful Service文件
- Spring AMQP:基於Spring框架的AMQP訊息解決方案,它使得在Spring應用中使用AMQP訊息伺服器變得更為簡單,支援Java和.NET
- Spring Mobile:基於Spring MVC構建,為移動端的伺服器應用開發提供支援,它可以在伺服器端自動識別連結到伺服器的移動端的相關資訊,從而為特定的移動端實現應用定製
- Spring Android:提供了一個在Android應用環境中工作的基於Java的REST客戶端
- Srping Web Flow:構建在Spring MVC基礎上,用於開發包含流程的應用程式,定義了一個特定的語言來描述工作流,同時高階的工作流控制器引擎可以管理會話狀態,支援AJAX來構建豐富的客戶端體驗,並提供對JSF的支援
- Spring Web Service:Spring Boot的Web Service專案
- Spring LDAP:用於操作LDAP框架,基於Spring的JdbcTemplate模式,簡化輕量目錄訪問協議功能的開發
- Spring Session:用來建立和管理Servlet HttpSession方案,提供了叢集Session的功能,預設使用Redis來儲存Session資料,可以解決Session共享等問題
- Spring Shell:提供互動式Shell,使用簡單的命令來開發
- Spring FIo:一個JavaScript庫,基於Spring Cloud Data Flow中的流構建器
- Spring Kafka:Kafka是一種高吞吐的分散式釋出訂閱訊息系統,是Apache開發的一個開源流處理平臺,Spring Kafka對其提供了封裝和整合
- Spring StateMachine:用於簡化狀態機的開發過程
- Spring IO Platform:一個依賴包的維護平臺,用於解決依賴包的版本衝突問題,在引入第三方依賴的時候,不需要寫版本號,該平臺會自動選擇一個對應的版本
- Spring Roo:用於快速建立Spring專案的命令工具
- Spring Scala:用於在Scala語言中使用的Spring框架
還有一些不在維護的專案,例如與Adobe Flex技術整合的Spring BlazeDS Integration;
用於JVM代理的Spring Loaded、與REST互動的命令列REST Shell、大資料產品Spring XD
與FB、Twitter和LinkedIn等社交網路服務整合的Spring Social
Spring資源
- Spring官方網站:官方提供了於版本對應的參考文件和API文件,有些專案還有例項程式碼,例如Spring Boot、Spring Cloud、Spring AMQP等
- Spring Framework的參考和API地址
- Spring及相關專案的原始碼GitHub
相關文章
- 微服務Spring Cloud17_Spring Cloud概述3微服務SpringCloud
- Spring Cloud Alibaba微服務生態的基礎實踐SpringCloud微服務
- Sentinel x Spring Cloud,打造更好用的微服務生態SpringCloud微服務
- 微服務架構:構建PHP微服務生態微服務架構PHP
- 微服務生態元件之Spring Cloud OpenFeign詳解和原始碼分析微服務元件SpringCloud原始碼
- 微服務生態元件之Spring Cloud LoadBalancer詳解和原始碼分析微服務元件SpringCloud原始碼
- 首次直播揭祕 Dubbo Ecosystem:從微服務框架到微服務生態微服務框架
- 構建Spring Boot應用的微服務服務動態路由Spring Boot微服務路由
- Spring原始碼剖析8:Spring事務概述Spring原始碼
- 從建好到用好,阿里雲原生微服務生態的演進阿里微服務
- spring cloud 微服務實戰SpringCloud微服務
- 2018主流雲提供商微服務技術動態盤點:生態之爭!微服務
- spring cloud分散式微服務:Spring Cloud ConfigSpringCloud分散式微服務
- spring cloud 和 阿里微服務spring cloud AlibabaSpringCloud阿里微服務
- 愛奇藝在 Dubbo 生態下的微服務架構實踐微服務架構
- 微服務:spring-cloud-archaius 起步微服務SpringCloudAI
- Spring Cloud Alibaba微服務實戰SpringCloud微服務
- Nacos Go微服務生態系列(一) | Dubbo-go 雲原生核心引擎探索Go微服務
- Nacos Go 微服務生態系列(一)| Dubbo-go 雲原生核心引擎探索Go微服務
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- Spring Cloud 微服務的那點事SpringCloud微服務
- Spring Cloud微服務運營配置教程SpringCloud微服務
- 微服務Spring Cloud Alibaba之我見微服務SpringCloud
- Spring Cloud 微服務架構進階SpringCloud微服務架構
- 微服務架構:Dubbo VS Spring Cloud微服務架構SpringCloud
- 理解Spring Cloud微服務框架核心元件SpringCloud微服務框架元件
- spring cloud微服務架構設計SpringCloud微服務架構
- 微服務Spring Cloud17_Feign9微服務SpringCloud
- Spring Cloud 微服務開發系列整理SpringCloud微服務
- Spring Cloud Stream微服務訊息框架SpringCloud微服務框架
- 微服務閘道器 Spring Cloud Gateway微服務SpringCloudGateway
- 基於Spring Cloud的微服務落地SpringCloud微服務
- 微服務 Spring cloud 各元件介紹微服務SpringCloud元件
- 微服務 Spring Cloud 2020 重大變革微服務SpringCloud
- 部署Azure Spring Cloud微服務應用SpringCloud微服務
- spring 核心概述Spring
- Spring Cloud構建微服務架構-spring cloud服務監控中心SpringCloud微服務架構
- Spring系列之初識Spring Spring概述Spring