本文首發(fā)于微信公眾號【程序員黃小斜】
成都創(chuàng)新互聯(lián)公司總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計、網(wǎng)站維護、公眾號搭建、小程序定制開發(fā)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動行銷領(lǐng)域創(chuàng)造價值而不懈努力!本文作者:黃小斜
轉(zhuǎn)載請務(wù)必在文章開頭注明出處和作者。
上期我們講了spring和springmvc兩個框架的基礎(chǔ)知識和學(xué)習(xí)路線,而這期內(nèi)容,我們將圍繞著spring全家桶展開來討論。
大家應(yīng)該都知道,按照出現(xiàn)的順序,spring全家桶大概包含了spring、springmvc、springboot以及springcloud,從開胃小菜spring到滿漢全席springcloud,spring全家桶可謂Java工程師的必備大餐,那么,我們不妨先來看看,spring全家桶是如何從光桿司令spring發(fā)展到如今的龐大家族的。
目前,Spring生態(tài)中包含22個主要活躍的項目。
你會發(fā)現(xiàn),這些項目幾乎涵蓋了日常開發(fā)所有的場景,只不過你不一定會用到而已,除了spring和springmvc,springcloud和springboot之外,還有很多開源的spring生態(tài)項目持續(xù)在spring社區(qū)維護,比如springdata,用于解決spring中的統(tǒng)一數(shù)據(jù)方案,spring integration,顧名思義,適用于集成外部服務(wù)。
還有我們在一些項目中可能用到的spring security,通常用來解決一些安全問題,這個框架在業(yè)界用的也比較多。
除此之外,spring AMQP以及spring Kafka則是在spring框架中集成了對應(yīng)的消息中間件,讓消息收發(fā)在框架中更容易地被使用。
在整個Spring生態(tài)中包含了許多應(yīng)用在特定場景的具體框架,如:“Spring Framework”,“Spring Security”,“Spring Boot”,“Spring Cloud”等等,其中“Spring Framework”框架是整個生態(tài)的核心基礎(chǔ),其他框架都需要依賴“Spring Framework”提供的基礎(chǔ)功能,而且每個框架都有自己獨立的代碼倉庫。
想起我第一次上手做Java項目的時候,就是在網(wǎng)上尋找教程,那個時候就已經(jīng)看到了很多spring框架應(yīng)用的項目,基本上網(wǎng)上入門的項目都是基于的SpringMVC,可能是ssm或者ssh。
總之,教程里會叫你寫一個controller,返回簡單的“hello world”,復(fù)雜點的,可能要接入數(shù)據(jù)庫,使用一下mybatis,當然了,很多時候網(wǎng)上都能找到源碼,你只要下載下來run一遍就好了,當然,前提是你已經(jīng)安裝好了JDK,并你會使用maven和ide,否則下載下來了你可能run不起來,各種報錯。雖然這些問題對于老司機來說是不存在的,但是相信我,這對于小白來說是經(jīng)常遇到的問題。
我最早寫博客的時候,就是在上手做一個簡單的ssm項目,當時笨手笨腳地配置好了各種東西,好不容易把整個工程跑了起來,于是高興地記錄起了實戰(zhàn)過程,后來時間一久,再回去看當初的那幾篇博客,覺得自己真是菜的摳腳。
但是這都是新手程序員需要經(jīng)歷的,你需要想搞懂Java基礎(chǔ),再去搞懂Java Web,要完全了解了Java Web,你就必須要會spring,會了spring之后,請把它相關(guān)的組件也都搞懂,特別是那些你在工作中可能要用到的。
如今我在阿里做Java,每天用的技術(shù)都是自研的中間件,這些中間件技術(shù)其實很多也是吸取了開源技術(shù)的精髓,你可以經(jīng)常在它們的源代碼中看到spring的影子,這就是spring生態(tài)系統(tǒng)強大的影響力,即使是國內(nèi)一流的Java技術(shù)團隊,都會花大量時間去研究和學(xué)習(xí)spring框架源碼。
做Java開發(fā)的人一提起Spring,首先在腦海中浮現(xiàn)出的就是“IoC”,“AOP”,“Spring MVC”,“Spring Security”等等這些名詞,甚至大有“無Spring不Java”的感慨。
實際上,時至今日Spring已不再是一個簡單的編程框架了,從最初的“SSH框架”發(fā)展到今天,Struts和Hibernate都幾乎快要從程序員視野中消失了,而Spring卻發(fā)展成了一個非常龐大且完整的生態(tài)。
所以說,除非特別指明是Spring生態(tài)中的某個具體框架,否則提起“Spring”應(yīng)該指的是整個Spring生態(tài)。
說句不夸張的話,Java程序員只要精通了Spring,也就掌握了Java開發(fā)的精髓。
上一期內(nèi)容中我們已經(jīng)介紹了spring和springmvc,這里為了內(nèi)容的完整性,請允許我再贅述一遍。
Spring Framework項目是整個Spring生態(tài)的基礎(chǔ),包含了Spring最核心的功能,如:IoC,AOP,Spring MVC等,其他項目都需要依賴Spring Framework。
另外,還需要注意的是Spring Framework項目又包含多個子模塊,如:spring-core,spring-beans,spring-context,spring-aop,spring-web,spring-webmvc等等。實際上,Spring Framework項目是一個模塊化的架構(gòu),各模塊之間又存在依賴關(guān)系。我們在Java Web后臺項目中使用得最多的Spring MVC實際上就是模塊spring-webmvc,它與其他模塊的依賴關(guān)系如下所示:
顯然,spring-webmvc模塊依賴spring-context,spring-aop和spring-web。
spring-webmvc模塊的依賴關(guān)系
我第一次是接觸springboot的時候,還是在某度實習(xí)的時候,當時我們做的是私有云,使用的正是開源項目OpenStack,OpenStack本身包含很多組件,有的負責網(wǎng)絡(luò),有的負責存儲,有的負責調(diào)度等等,所有它的整體部署方式就是分布式的,因此做微服務(wù)拆分也是很正常的。
當然,那個時候我對微服務(wù)還沒有什么概念,對springboot也只有一面之緣,只知道當時我?guī)煾蹈嬖V我說,springboot是用來作微服務(wù)的,讓我看看某個springboot項目的代碼,于是我一愣一愣地就去看了,結(jié)果發(fā)現(xiàn),這個東西和spring好像長得也沒啥區(qū)別啊,除了啟動方式奇怪了點,xml配置文件少了點,好像也沒啥太大的不同。
實際上,也確實如此,Spring Boot是一個開發(fā)基于Spring的腳手架項目,它簡化了很多spring的和springmvc的特性,讓新手更加容易地上手spring開發(fā)。
比如,它默認集成了嵌入式Tomcat,配置注解化,支持快速集成第三方開發(fā)組件(如MyBatis),大大降低了使用Spring的門檻,而且內(nèi)置了許多可以直接用于生產(chǎn)環(huán)境的功能。
簡單來看,springboot就是在springmvc外又包了一層,屏蔽了springmvc一些復(fù)雜的實現(xiàn)細節(jié),以及繁瑣的配置及開發(fā)流程,轉(zhuǎn)而把一些約定俗成的東西做成規(guī)范,形成了所謂的springboot starter。
這種支持快速開發(fā)、快速繼承的框架,顯然是非常提升開發(fā)效率的,所以,它是目前用于開發(fā)微服務(wù)架構(gòu)項目的不二選擇。
不過這里要強調(diào)一點,springboot并不等同于微服務(wù),它充其量只是一個應(yīng)用容器而已,如果把微服務(wù)比作一張大網(wǎng),那么springboot應(yīng)用只是這張網(wǎng)中的一個個小點,而微服務(wù)還需要通過服務(wù)網(wǎng)關(guān)、負載均衡、注冊中心等手段把這些點連接起來,并且在這張網(wǎng)的運行中支持服務(wù)的降級和熔斷(切斷到某個點的連接
值得注意的是: 許多人剛接觸Spring Boot的人把它神話了,固然使用Spring Boot能快速開發(fā)一個健壯的、可直接運行的項目,但是它的核心和基礎(chǔ)來源于Spring Framework。
對于重度依賴Spring的開發(fā)人員,應(yīng)該先去吃透Spring Framework,只要真正掌握了Spring Framework中各個模塊的實現(xiàn)原理,對于在實際開發(fā)中使用Spring Boot遇到的問題也就迎刃而解了。
不瞞您說,我到現(xiàn)在都沒有真正意義上地接觸過springcloud,原因很簡單,我開發(fā)工作用的技術(shù)棧已經(jīng)被阿里內(nèi)部的中間件承包了,所有你在springcloud里用到的技術(shù),在阿里內(nèi)部都有對應(yīng)的一套甚至是幾套實現(xiàn),它們有的已經(jīng)開源了,有的只在內(nèi)部使用,反正,在阿里你是用不到開源的技術(shù)的,即使強如springcloud的也是一樣。
其實除了阿里,類似美團、京東等Java大廠,一樣也會維護自己的一套自研技術(shù)棧,畢竟自己的東西自己說了算,出現(xiàn)問題也能第一時間修復(fù),如果用的是開源技術(shù),萬一哪天出了bug,還得到開源社區(qū)求爺爺告奶奶,豈不是很尷尬。
雖然沒有嚴格意義上地接觸過springcloud,但是微服務(wù)這一套東西其實是換湯不換藥的。
讓我們來看看百度百科對于微服務(wù)和springcloud的介紹吧。
所謂的微服務(wù)是SOA架構(gòu)下的最終產(chǎn)物,該架構(gòu)的設(shè)計目標是為了肢解業(yè)務(wù),使得服務(wù)能夠獨立運行。微服務(wù)設(shè)計原則:1、各司其職 2、服務(wù)高可用和可擴展性。
微服務(wù)是一個新興的軟件架構(gòu),就是把一個大型的單個應(yīng)用程序和服務(wù)拆分為數(shù)十個的支持微服務(wù)。一個微服務(wù)的策略可以讓工作變得更為簡便,它可擴展單個組件而不是整個的應(yīng)用程序堆棧,從而滿足服務(wù)等級協(xié)議。
其實這里已經(jīng)說得比較明白了,微服務(wù)的作用是把以往龐大的單個應(yīng)用拆分成多個組件,每個組件各司其職,比起單個大型服務(wù),微服務(wù)的好處實在太多了,比如它們可以單獨部署,單獨測試,更好地支持DevOps,更有效利用機器資源,同時更容易保證擴展性和可用性。下圖就是微服務(wù)架構(gòu)的變遷過程。
如果還是沒理解,那我就一點一點地給你解釋。
1、在部署和研發(fā)效率方面,一個大型應(yīng)用,部署本身就很慢,改動一點代碼就要部署半天,研發(fā)迭代效率可想而知,而微服務(wù)應(yīng)用本身體量就小,部署快,每個微服務(wù)可以獨立開發(fā)迭代,效率自然高。
2、在使用資源和測試效率方面,一個大型應(yīng)用,往往占用的資源上下限差距很大,很多時候我們不得不給他分配大量的資源,而微服務(wù)應(yīng)用如今都支持容器化部署,容器化部署的大好處就是支持資源的彈性伸縮,提高資源利用效率。而對于測試來說,一個大型應(yīng)用,往往一點點改動就需要回歸這個應(yīng)用的代碼,代價可想而知,而微服務(wù)拆分后,測試的量將大大降低。
除此之外,微服務(wù)的優(yōu)點還很多,比如更容易排查問題,更容易進行擴容和伸縮,更能夠避免單點的問題。
下面這張圖,把我們?nèi)粘5纳畋茸魑⒎?wù),其實,我們的生活不就是由這么一個個齒輪組成的么。
當然,微服務(wù)也不全都是優(yōu)點,缺點自然也是有的。
比如,微服務(wù)的拆分需要花很大代價,首先應(yīng)用要拆分,原來的本地服務(wù)要變成分布式服務(wù),而分布式服務(wù)要面臨的問題比本地服務(wù)的多得多,不過幸好微服務(wù)框架已經(jīng)解決了其中一些問題。
另外,微服務(wù)的拆分不僅是應(yīng)用的拆分,相應(yīng)的數(shù)據(jù)源也要進行拆分,這就涉及到了分布式數(shù)據(jù)庫的一些解決方案,比如分庫分表,比如分布式事務(wù)等等,也就是說,微服務(wù)的拆分必然引入很多分布式環(huán)境下才有的問題,包括數(shù)據(jù)一致性、網(wǎng)絡(luò)分區(qū)等等。
那么,既然微服務(wù)拆分會帶來這么多問題,那么微服務(wù)框架的研發(fā)者自然也想到了,于是它們會用各種辦法來幫助開發(fā)者解決這些問題,下面就讓我們來看看springcloud是怎么做的吧。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊、配置中心、消息總線、負載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用Spring
Boot的開發(fā)風格做到一鍵啟動和部署。
Spring Cloud并沒有重復(fù)制造輪子,它只是將各家公司開發(fā)的比較成熟、經(jīng)得起實際考驗的服務(wù)框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復(fù)雜的配置和實現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂、易部署和易維護的分布式系統(tǒng)開發(fā)工具包。
顯然,springcloud是有備而來的,微服務(wù)拆分引起的問題,它都可以一一化解。
比如,把本地服務(wù)拆分成分布式服務(wù),springcloud提供了服務(wù)注冊中心和配置中心,以及統(tǒng)一的服務(wù)網(wǎng)關(guān),讓分布式服務(wù)像本地服務(wù)一樣簡單易用
與此同時,消息總線、負載均衡等技術(shù)解決了分布式環(huán)境中的一些高并發(fā)問題。
除此之外,像是數(shù)據(jù)監(jiān)控、熔斷和限流、分布式鏈路追蹤、集群容錯等功能,都在springcloud中有對應(yīng)的解決方案。
再次強調(diào)一下,springcloud才是微服務(wù)框架,而springboot只是一個快速開發(fā)web應(yīng)用的腳手架,Spring Cloud的基礎(chǔ)是Spring Boot,基于Spring Boot可以大大簡化開發(fā)各微服務(wù)組件的流程。
至此,我們已經(jīng)介紹完了spring全家桶的大部分內(nèi)容,希望這些內(nèi)容對于你日后學(xué)習(xí)spring生態(tài)技術(shù)有所幫助。
其實,spring最好的技術(shù)資源就在官方: https://spring.io/
英文好的同學(xué)不妨直接去看官方文檔。
Spring Boot實戰(zhàn) ,丁雪豐 (譯者)
Spring源碼深度解析
這里我整理了一些還算不錯的視頻資源分享給大家,具體請在公眾號【程序員黃小斜】內(nèi)回復(fù)“spring”即可查看
Java技術(shù)倉庫《Java程序員復(fù)習(xí)指南》
https://github.com/h3pl/Java-Tutorial
整合全網(wǎng)優(yōu)質(zhì)Java學(xué)習(xí)內(nèi)容,幫助你從基礎(chǔ)到進階系統(tǒng)化復(fù)習(xí)Java
全網(wǎng)最熱的Java面試指南,共200多頁,非常實用,不管是用于復(fù)習(xí)還是準備面試都是不錯的。
在公眾號【Java技術(shù)江湖】回復(fù)“PDF”即可免費領(lǐng)取。
如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉(zhuǎn)發(fā)朋友圈就是對我大的支持啦,你們的支持是對我大的鼓勵。
對本系列文章有什么建議和意見,也歡迎留言告訴我,期待你的回饋。