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