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