張峰
摘 要:SpringBoot給Spring項目以及web開發(fā)帶來了非常大的影響和改變,文章通過對SpringBoot項目介紹分析了其各個應用方面,得出了SpringBoot對web開發(fā)影響重大的結(jié)論。
關(guān)鍵詞:SpringBoot;JavaEE;web開發(fā);Docker
中圖分類號:TP311 文獻標志碼:A 文章編號:2095-2945(2017)23-0193-02
1 概述
近年來Spring項目的流行使開發(fā)者放棄笨重的JavaEE體系,開源社區(qū)發(fā)展壯大。SpringBoot的出現(xiàn)又使Spring變得易于開發(fā)和維護。本文介紹了SpringBoot和分析其與JavaEE開發(fā)體系的不同。分析以SpringBoot為核心的開發(fā)框架組成。最后分析部署、測試、監(jiān)控和管理生產(chǎn)環(huán)境等問題。
2 SpringBoot技術(shù)介紹
SpringBoot是由Pivotal團隊開發(fā)的全新的開源開發(fā)框架[1],從誕生初期它就著有明確的目的,簡化應用Spring開發(fā)項目。最突出的特點是配置方式,大大簡化了Spring應用各個方面的配置。另外SpringBoot能夠集成大量的框架,解決了之前很重要的項目之間包的版本依賴和穩(wěn)定性問題。同時有了SpringBoot使springcloud眾多的組件項目得以良好地被應用,從而改變了web應用的開發(fā)模式。
SpringBoot技術(shù)的特點有以下幾點[2]:可以類似點菜一樣地選配、組裝、生成一個獨立的開發(fā)初始項目;在內(nèi)部內(nèi)置了Tomcat服務器和Jetty服務器,直接把項目打成jar包,這應該是為Docker特意設(shè)計的;使用叫做starterPOMs的配置方式使Maven配置大幅度簡化;SpringBoot還為大中型項目提供了經(jīng)常用到的非業(yè)務功能型的特點。比如:健康狀態(tài)檢測,外部配置、指標、安全等;在項目中不再推薦使用xml的方式。
3 SpringBoot與傳統(tǒng)JavaEE項目開發(fā)模式比較
Javaweb應用開發(fā)從最早的Servlet技術(shù)開始已經(jīng)經(jīng)歷了很多變化,在這段歷史中產(chǎn)生了獨立的一整套的生態(tài)系統(tǒng)和大量的開源項目。EJB2.0改變了很多,但也還是保留了權(quán)威、官方和學術(shù)化的整體風格。在這個時候Spring等大批輕量級框架開始產(chǎn)生,發(fā)展到今天已經(jīng)和JavaEE的開發(fā)模式形成有明顯區(qū)別的一派。真正讓我們看到開源社區(qū)改變JavaEE的應該是JAP,它的標準明顯傾向于Hibernate。Java被Oracle收購后對JavaEE不斷發(fā)展但開發(fā)模式?jīng)]有很大的發(fā)展。
SpringBoot是在Spring的大框架下,離不開兩項關(guān)鍵技術(shù)依賴注入和面向方面編程AOP。在JDK5引入的Annotation出現(xiàn)后Spring大量采用這種配置方式,但之前都是采用配置xml文件的形式。xml文件在webservice流行的時期被推崇的很高。開發(fā)人員漸漸發(fā)現(xiàn)xml文件越來越多,書寫困難(可以對比YAML文件的書寫),調(diào)試困難等等。所以Spring當初被人的批評很多都是因為xml配置過多。而SpringBoot的改變不是僅僅采用了更好的配置文件格式那么簡單。SpringBoot是采用了最初在Maven中看到的“約定大于配置”(Convention over configuration)的思想,也叫慣例優(yōu)先原則。簡單地解釋就是絕大多數(shù)配置信息按約定采用缺省配制,用戶需要的個性配置采用properties文件或yaml文件的格式寫在統(tǒng)一的文件中。其他在開發(fā)中的配置信息要么采用Annotation要么采用配置類形式。也就是說SpringBoot可以達到免xml文件配置。這點區(qū)別于傳統(tǒng)項目開發(fā)的特點也是給開發(fā)效能提升帶來巨大效果的。
SpringBoot的項目開發(fā)以上的改變?nèi)绻€不算很大,SpringBoot是如何打包部署的:
@SpringBootApplication
publicclassApplication {
publicstaticvoid main(String[] args) {
SpringApplication.run(Application.class, args);}}
這段代碼雖然簡單但反映出幾個關(guān)鍵問題。SpringBoot的運行方式是main方法。另外這個項目是Javaweb項目,它必然需要web容器,但這不是war包形式部署。實際上SpringBoot改變了傳統(tǒng)開發(fā)模式,將其開發(fā)的javaweb項目內(nèi)部內(nèi)嵌了一個Tomcat,而關(guān)鍵是最終的打包形式是一個包含了所有項目文件和內(nèi)嵌web容器的jar包。這個jar包的打包形式為將來部署到Docker上提供了良好的條件,這個后面還會提到。SpringBoot使Javaweb項目開發(fā)變得輕松很多,當然它的貢獻也不止以上這些,當項目真正采用它來開發(fā)一般不會再退回原來的開發(fā)方式了。
4 SpringBoot 應用系統(tǒng)開發(fā)模板架構(gòu)設(shè)計
從前臺到后臺的順序進行分析。從頁面來看,現(xiàn)在的主流已經(jīng)淘汰了jsp技術(shù)。前臺常使用模板引擎,主要有FreeMarker,它是一個用Java語言編寫的模板引擎,基于模板來生成文本輸出。還有Thymeleaf,它和FreeMarker的原理類似,可以達到頁面圖形設(shè)計和應用邏輯的分離。但SpringBoot推薦使用Thymeleaf,原因首先是它可以和SpringMVC很好結(jié)合,其次和其他模板引擎相比它的模板可以直接用瀏覽器正確顯示,這也稱為自然的模板技術(shù)。但其使用的DOM解析所以不適合處理大XML文件。在前端開發(fā)還常用到BootStrap、AngularJS、JQuery等。接下來在瀏覽器數(shù)據(jù)傳輸上采用Json的格式RESTful傳輸。在數(shù)據(jù)到達服務器后接受請求的是SpringMVC框架,這個框架已經(jīng)取代Struts2成為控制層絕對的主流了。到持久層框架現(xiàn)在的主流技術(shù)有Hibernate、Mybatis、JPA,各有優(yōu)缺點不再贅述。SpringBoot推薦使用Spring Data+JPA的方式,當然引擎常用Hibernate,數(shù)據(jù)庫使用MySQL。開發(fā)工具推薦用IntelliJ IDEA。endprint
5 SpringBoot部署和測試帶來的變革
SpringBoot項目能夠很好地部署于Docker類的虛擬容器中。Docker是2013年DotCloud公司發(fā)起,開源后快速發(fā)展。已經(jīng)形成以Docker為中心的生態(tài)體系。Docker加入了Linux基金會,遵循Apache2.0協(xié)議。Docker的受歡迎程度很高,應用該項技術(shù)的大型互聯(lián)網(wǎng)公司幾乎占據(jù)主流市場的三分之一以上。SpringBoot也針對Docker技術(shù)做了很多設(shè)計和優(yōu)化以適應容器技術(shù)。Docker引擎的基礎(chǔ)組件是Linuxcontainers(LXC)。各種工具的豐富使Docker應用迅速普及,正如Solomon Hykes所說:Docker在正確的地點、正確的時間順應了正確的趨勢——即高效地構(gòu)建應用。隔離是Docker的重點,正如JavaVM隔離了硬件資源環(huán)境影響一樣,Docker將容器外環(huán)境的改變變得不那么重要了,程序的移植變得象拷貝文件一樣簡單了。這給運維帶來了極大的方便。利用SpringB
oot Maven plugin將Maven引入SpringBoot項目是一個關(guān)鍵,Spotify 的 docker-maven-plugin 插件可以用來構(gòu)建Maven的Docker鏡像。可以編寫Dockerfile來指定特定的鏡像層。之后可以將鏡像推送到DockerHub上,DockerHub是一個類似GitHub原理的鏡像托管平臺。在項目開發(fā)階段最好的做法是使用持續(xù)集成的做法,即使用Jenkins來結(jié)合Git Hooks,當代碼Push到Git服務器后,Jenkins自動去執(zhí)行shell腳本文件Pull的代碼,又Maven變異打包生成最新的鏡像文件。最后再push到DockerHub上。裝有Docker的服務器從DockerHub上的到鏡像運行該鏡像的所屬容器從而完成整個部署過程。另外由于在SpringBoot中的模板引擎默認開啟緩存,利用Spring Loaded實現(xiàn)類文件修改熱部署,利用JRebel可以實現(xiàn)開發(fā)熱部署,這樣會極大提高開發(fā)調(diào)測效率。
SpringBoot在測試方面也帶了很多的改變[3]。首先,在SpringBoot項目中按照其一慣的starter做法在項目中加入spring-boot-starter-test的依賴,其他的關(guān)于測試的依賴就不用再管理了。根據(jù)SpringBoot的最佳實踐在項目src/test/java目錄下添加測試類。其次,測試類SpringBoot使用@springapplicationconfiguration代替了@contextConfiguration配置SpringBoot的應用上下文,還有兩個常用的Annotation是@RunWith(SpringJUnit4ClassRunner.class)和@WebAppConfiguration,使用@transactional保證測試操作的回滾,具體的測試方法就完全按照Junit的方式做了。在controller層測試類為了MockMvc而注入了WebApplicationContext。這里充分利用了SpringMVC的測試功能。測試的過程可以總結(jié)歸納為以下過程,為項目準備測試的環(huán)境;通過MockMvc來模擬執(zhí)行http請求;增加驗證的JUnit Assert還有處理結(jié)果Assert。收到MvcResult后進行自定義Assert又從新進行下一步的異步請求;最后卸載掉測試用的MockMvc環(huán)境,完成測試??傊甋pringBoot利用和SpringMVC的關(guān)系將測試變得簡單實用,為后期自動化集成測試奠定良好的基礎(chǔ)。
6 SpringBoot監(jiān)控和管理生產(chǎn)環(huán)境
SpringBoot給web系統(tǒng)開發(fā)帶來的改變中一個重要的方面就是監(jiān)控和管理生產(chǎn)環(huán)境。如何實時監(jiān)控應用系統(tǒng)信息的各項功能是否健康,就要通過系統(tǒng)各方面的性能安全指標數(shù)值來評估。這樣可以在系統(tǒng)變得不穩(wěn)定的時期就發(fā)現(xiàn)或解決問題,而不是系統(tǒng)功能停止時刻才發(fā)現(xiàn),從而避免業(yè)務遭受打擊。大規(guī)?;ヂ?lián)網(wǎng)應用一定會有專門的網(wǎng)管系統(tǒng),但應用系統(tǒng)內(nèi)部情況就不會監(jiān)控得那么細致了。Spring可以監(jiān)控到什么信息呢,如:當前應用的所有配置、當前應用中所有的Bean的信息、所有配置屬性、線程狀態(tài)信息、當前環(huán)境信息、應用健康狀況、當前應用的各項指標信息、所有@RequestMapping映射的路徑、顯示追蹤信息以及所有EndPoint列表??梢钥吹絻?nèi)容非常豐富而且實用。這些監(jiān)控信息通過監(jiān)控和管理端點的形式提供給開發(fā)者。而前提是在POM文件中加入spring-boot-starter-actuator這個依賴。在創(chuàng)建項目時可以選擇Actuator、web和HATEOAS這幾個模塊。當項目部署完成可以通過http URL地址訪問到這些監(jiān)控信息,如:http://localhost:8080/actuator可以看到所有EndPoint列表;http://localhost:8080/beans可以看到所有Beans列表等。甚至還可以自定義端點對一些業(yè)務指標進行監(jiān)控,這是任何市場盒裝系統(tǒng)監(jiān)控產(chǎn)品也做不到的。另外SpringBoot在web系統(tǒng)監(jiān)控開發(fā)的提升開可以利用JMX(Java Management Extensions,即Java管理擴展)進行。
7 結(jié)束語
SpringBoot對于Spring平臺無疑是巨大的提升。無論在開發(fā)階段還是部署測試階段,甚至系統(tǒng)在線運行階段,SpringBoot都在發(fā)揮著他的作用。使web系統(tǒng)開發(fā)在多方面整體提升。隨著微框架的推廣,作為底層支持的SpringBoot正在改變web應用開發(fā)模式。
參考文獻:
[1]Pivotal團隊.Spring Boot Reference Guide1.5.3.RELEASE[OL].2017.
[2]王永和,張勁松,鄧安明,等.Spring Boot研究和應用[J].信息通信,2016(10):91-94.
[3]汪云飛.JavaEE開發(fā)的顛覆者Spring Boot實戰(zhàn)[Z].2016.endprint