溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何深入實(shí)踐Spring Boot

發(fā)布時(shí)間:2021-10-12 09:32:39 來(lái)源:億速云 閱讀:170 作者:柒染 欄目:云計(jì)算

如何深入實(shí)踐Spring Boot,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

簡(jiǎn)單易用的 Spring Boot,無(wú)疑是 Java 開(kāi)發(fā)初學(xué)者的指路明燈,更是資深 Java 開(kāi)發(fā)者的得力助手??焖匍_(kāi)發(fā)是研發(fā) Spring Boot 的初衷,這不但是一個(gè)開(kāi)發(fā)團(tuán)隊(duì)的終生追求,也是一個(gè)企業(yè)解放生產(chǎn)力、提高生產(chǎn)效率的保障。

Spring Boot 的組件化整合規(guī)則,完美地整合了云應(yīng)用開(kāi)發(fā)工具,使其在云計(jì)算領(lǐng)域中處于領(lǐng)先地位,為創(chuàng)建高可用和高性能的服務(wù)提供了更加簡(jiǎn)便和快捷的方法。

Spring Boot 是從 Spring 框架發(fā)展起來(lái)的,所以對(duì)于使用 Spring 框架的龐大用戶群體來(lái)說(shuō),隨著 Spring Boot 的普及使用,將使眾多開(kāi)發(fā)者成為它的擁躉。

一、Spring Boot 適用場(chǎng)景

1. 企業(yè)項(xiàng)目開(kāi)發(fā)的時(shí)候,Spring Boot 有哪些使用場(chǎng)景呢,已知的坑是什么呢?

SSO,分布式文件系統(tǒng),微服務(wù)使用等等,在企業(yè)版應(yīng)用中,這些都是非常頂用的。如果硬說(shuō)有坑的話,就是服務(wù)多了,服務(wù)部署和運(yùn)維管理必須要上一個(gè)檔次,否則就會(huì)顯得混亂起來(lái)。

2. 個(gè)人感覺(jué),從快速構(gòu)建方面確實(shí)很高效,而且這樣框架也是經(jīng)過(guò)了很多實(shí)踐之后,結(jié)晶的產(chǎn)品。但是,對(duì)于新人來(lái)說(shuō),直接應(yīng)用 Spring Boot,還是感覺(jué)不是很理想,可能會(huì)使新人對(duì)于 Spring 框架的理解上產(chǎn)生阻礙。對(duì)于 Spring Boot 本身,還是非常不錯(cuò)的,云部署,快速構(gòu)建都很不錯(cuò)。我的問(wèn)題是,公司對(duì)于 Spring Boot 的應(yīng)用有什么要求嗎?一般開(kāi)發(fā)會(huì)在什么情況下使用它?對(duì)于企業(yè)級(jí)的開(kāi)發(fā)是否也有要求?

Spring Boot 對(duì)背景知識(shí)沒(méi)有特別要求,對(duì)于新人來(lái)說(shuō),搭建好項(xiàng)目讓其跟隨開(kāi)發(fā),更加容易入手。對(duì)于公司的要求,主要看工程的規(guī)模和部署的方式,如果使用 Docker 部署并需要設(shè)置負(fù)載均衡等對(duì)運(yùn)維人員和服務(wù)器的要求會(huì)高一些。

3. 經(jīng)??吹?Spring Boot 和微服務(wù)關(guān)聯(lián)起來(lái),是因?yàn)?Spring Boot 開(kāi)發(fā)和部署比較快么,能具體說(shuō)說(shuō)么?

Spring Boot 確實(shí)是以快速開(kāi)發(fā)為目標(biāo)而設(shè)計(jì)的,它的簡(jiǎn)單易用的特性確實(shí)減輕了開(kāi)發(fā)者的負(fù)擔(dān),從而可以提高開(kāi)發(fā)的生產(chǎn)率。你的問(wèn)題需要全面理解一下 Spring Boot,可以通過(guò)它的官方網(wǎng)站進(jìn)行一些了解。

完整的參考 DEMO — 不寫(xiě)一行代碼即運(yùn)行一個(gè)應(yīng)用

4. 這個(gè)框架適合開(kāi)發(fā)什么類型的項(xiàng)目

最適合用來(lái)開(kāi)發(fā) Web 應(yīng)用項(xiàng)目。

二、Spring Boot 與 jar

1. 已經(jīng)使用 Spring Boot 有幾個(gè)月了,也開(kāi)始在使用 Spring Boot 搭建公司的基礎(chǔ)系統(tǒng)。我理解的 Spring Boot 應(yīng)該是提倡以 jar 的形式部署,但這種方式在包的體積過(guò)大的情況下部署太慢了,之前我們的業(yè)務(wù)和服務(wù)器都在國(guó)外,上傳的時(shí)候速度慢得一塌糊涂,除了改成 war 發(fā)布,還有什么其他辦法么?

其實(shí)最好的方式,還是使用 jar,然后結(jié)合使用 Docker 來(lái)發(fā)布。如果一個(gè)項(xiàng)目的 jar 包過(guò)大的話,要看看造成這種情況的主要原因是什么。是不是 jar 包中包含的資源文件太多,還是項(xiàng)目包含的業(yè)務(wù)太復(fù)雜,如果是前種原因,考慮優(yōu)化一些圖片資源,或者使用分布式文件系統(tǒng)來(lái)存儲(chǔ)圖片資源。如果是后一種原因,是不是考慮將原項(xiàng)目使用模塊化方式進(jìn)行細(xì)分。

@采蘑菇的大叔 貢獻(xiàn)的 DEMO http://git.oschina.net/icer/iblog。用 SpringBoot 搭了個(gè)架子,整合了 freemarker 和 mybatis。

2. Spring Boot 集成了服務(wù)器,以 jar 文件發(fā)布,減少對(duì)外部文件和環(huán)境依賴。但長(zhǎng)期集成導(dǎo)致體積過(guò)大,這的確是個(gè)問(wèn)題,能不能考慮做一些工具對(duì) jar 進(jìn)行減肥呢?

這就要分析一下造成 jar 過(guò)大的原因是什么,如果是因?yàn)橘Y源文件太多造成的,那就要優(yōu)化一些圖片的設(shè)計(jì),或使用其它方式來(lái)鏈接資源文件,如果是因?yàn)橐粋€(gè)項(xiàng)目包含的業(yè)務(wù)太多太復(fù)雜造成的,就要考慮是否可以將項(xiàng)目進(jìn)行拆分。

3. 如果是用 Spring Boot 來(lái)做成 jar 服務(wù)啟動(dòng),怎么衡量服務(wù)粒度。因?yàn)槊總€(gè)服務(wù)都要運(yùn)行 Spring,或者也會(huì)加個(gè) dubbo 的依賴等等。跑起多個(gè)實(shí)例,這就重復(fù)了。其實(shí)就是單體應(yīng)用跟分布式應(yīng)用的點(diǎn)。

主要還是看你怎樣配置服務(wù),如果使用 Spring Cloud 的服務(wù)發(fā)現(xiàn)來(lái)管理服務(wù),可以通過(guò)負(fù)載均衡的配置支持多個(gè)服務(wù)同時(shí)對(duì)外提供服務(wù)。

4. Spring Boot 同樣支持以標(biāo)準(zhǔn)的 war 方式部署應(yīng)用,只是在啟動(dòng)類上需要進(jìn)行細(xì)微的調(diào)整,并不強(qiáng)調(diào)始終以 jar 方式部署。

Spring Boot 應(yīng)該是鼓勵(lì)以 jar 的方式部署,隨著 Spring Boot 一起來(lái)的應(yīng)該是想推動(dòng)微服務(wù)。個(gè)人見(jiàn)解,僅供討論。(@采蘑菇的大叔)

5. 使用 Spring Boot 的時(shí)候,頁(yè)面文件會(huì)被打包到 jar 中,如果只更新頁(yè)面文件,又要對(duì) jar 進(jìn)行打包上傳。有沒(méi)有簡(jiǎn)單的方法?類似原先的 Tocmat 部署就可以直接修改頁(yè)面文件。不需要重啟的方法?

可以使用 war 方式部署 。

6. Spring Boot 項(xiàng)目如何做到 libs jar 和  app jar 分開(kāi),很多時(shí)候,我只是更新應(yīng)用層代碼,本地編譯好上傳上去,啟動(dòng)的時(shí)候通過(guò)腳本啟動(dòng),那么如何將 libs 和 app 分別打包并啟動(dòng)呢?

使用 war 方式發(fā)布就可以實(shí)現(xiàn)你的要求。

三、Spring Boot 與 Docker

1. 請(qǐng)簡(jiǎn)單介紹一下 Spring Boot 和 Docker 結(jié)合

真要簡(jiǎn)單地說(shuō):將 Spring Boot 項(xiàng)目打包成 jar,然后通過(guò) Docker 進(jìn)行部署。用 Spring Boot 開(kāi)發(fā)的項(xiàng)目,非常適合用 Docker 來(lái)部署。

這兩個(gè)東西之間沒(méi)有任何關(guān)系。Spring Boot 主要的目的是簡(jiǎn)化開(kāi)發(fā)和部署過(guò)程中配置文件的使用,使用了很多約定俗成的規(guī)則,按照這些約定的規(guī)則來(lái)開(kāi)發(fā),可以大大減少配置文件的使用,甚至完全不使用配置文件都是可能的。Docker 只是把運(yùn)行環(huán)境,像 OS、JVM、Nginx 等等打包到一起的個(gè)工具而已。把 Spring Boot 生成的可執(zhí)行的 jar 包放進(jìn)這個(gè)運(yùn)行環(huán)境中來(lái)運(yùn)行。這兩個(gè)工具都只是簡(jiǎn)化了開(kāi)發(fā)和運(yùn)維的繁雜過(guò)程,使用了很多自動(dòng)化處理的技術(shù)而已。(@清靜無(wú)虞)

2. Spring Boot 從開(kāi)發(fā)到部署的最佳實(shí)踐 ,是否必須依賴容器技術(shù),如何平滑過(guò)渡到 Docker 容器上?

Spring Boot 并不依賴 Docker 容器,也可以使用 war 方式或者按照傳統(tǒng)的方式直接使用文件系統(tǒng)來(lái)發(fā)布,只是使用 Docker,更能發(fā)揮它在各個(gè)方面優(yōu)勢(shì)。

3. 能分享下 Spring Cloud 和 Docker 部署方面的經(jīng)驗(yàn)嗎?

使用 Docker 發(fā)布 Spring Boot 項(xiàng)目(https://my.oschina.net/syic/blog/799656)

四、舊的項(xiàng)目遷移至 Spring Boot

1. 舊的項(xiàng)目轉(zhuǎn)到 Spring Boot 有什么條件?

不需要什么條件,使用 Spring Boot,最好是對(duì)原來(lái)的項(xiàng)目進(jìn)行重新設(shè)計(jì),或者使得原來(lái)的邏輯進(jìn)行重建。

2. 是不是微服務(wù)架構(gòu)比較適合用 Spring Boot?那對(duì)于老的系統(tǒng)或代碼,怎么轉(zhuǎn)到 Spring Boot?

所有使用 Web 方式開(kāi)發(fā)的項(xiàng)目都適合使用 Spring Boot 框架,并從中獲益,微服務(wù)開(kāi)發(fā)是它的一大特色。舊系統(tǒng)的代碼不能轉(zhuǎn)換,可以使用原來(lái)的業(yè)務(wù)邏輯進(jìn)行重建。

五、與相關(guān)的項(xiàng)目對(duì)比

1. 幾年前做開(kāi)發(fā)還是用的 Spring,包括 Spring 的 Bean 工廠方案還有 SpringMVC,現(xiàn)在主要業(yè)務(wù)的開(kāi)發(fā)一般用的公司自研框架,所以對(duì) Spring 感覺(jué)比較生疏了,我就想了解了解,Spring Boot 同幾年前的 Spring 相比,都有哪些方面的發(fā)展和變化,能大概講講嗎?

Spring Boot 是在 Spring 的基礎(chǔ)建立起來(lái)的,保留了 Spring 的一些精髓,同時(shí)也摒棄了一些糟粕,表現(xiàn)在:

  1. 統(tǒng)一工程配置,可以不使用 XML 配置

  2. 使用一些組件,具有自動(dòng)配置的功能

  3. 內(nèi)嵌了 Tomcat,性能指標(biāo)等服務(wù)

  4. 更方便獨(dú)立部署或使用 Docker 配置成高可用和高性能的平臺(tái)

2. Spring Boot 與傳統(tǒng) SSH 框架的主要區(qū)別在哪些方面?

Spring Boot 能最大限度地簡(jiǎn)化配置,也可以嵌入 Tcomcat 等服務(wù),并且在開(kāi)發(fā)企業(yè)級(jí)應(yīng)用、分布式應(yīng)用等方面更加得心應(yīng)手,更加難能可貴的是使用非常簡(jiǎn)單,非常適合快速開(kāi)發(fā)的需要,符合軟件工程構(gòu)件化發(fā)展的目標(biāo)。

3. Spring Boot 和 Spring MVC 有什么區(qū)別?

Spring MVC 還是屬于 Spring 框架的,Spring Boot 是在 Spring 的基礎(chǔ)之上建立的一個(gè)全新開(kāi)發(fā)框架。

4. Spring Boot 構(gòu)建微服務(wù),和目前一些新的例如 light java framework , sparkjava 在構(gòu)建微服務(wù)上有什么優(yōu)勢(shì)?

在 Spring Boot 家族中,使用云應(yīng)用開(kāi)發(fā)工具集 Spring Cloud 開(kāi)發(fā)微服務(wù)應(yīng)用,具有得天獨(dú)厚的優(yōu)勢(shì)。這里所說(shuō)的微服務(wù),是指功能強(qiáng)大,業(yè)務(wù)單一的分布式應(yīng)用系統(tǒng),并非簡(jiǎn)單指項(xiàng)目的微型結(jié)構(gòu)。

5. 用了 Spring Boot 是不是就不用再搞 Spring、SpringMVC、Hibernate、Struts、MyBatis 這些了?

對(duì)的,十分正確。對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),使用 JPA 就能一網(wǎng)打盡了。

6. Spring Boot 還是很喜歡的,簡(jiǎn)化了不少配置,但實(shí)際中微服務(wù)的劃分是個(gè)問(wèn)題。

服務(wù)的劃分這個(gè)和 Spring Boot 沒(méi)有任何關(guān)系。微服務(wù)的一個(gè)難點(diǎn)就是服務(wù)的劃分,有些服務(wù)是按技術(shù)特點(diǎn)來(lái)劃分,比如像 push 服務(wù)、sms 服務(wù)等。有些是按業(yè)務(wù)特點(diǎn)來(lái)劃分,像訂單服務(wù)等,有些根據(jù)實(shí)際情況還進(jìn)行服務(wù)的分層。

7. 使用 Spring Boot,其他的必須框架還需要配置嗎?

如果使用 Maven 或其它項(xiàng)目管理工具,都可以在工程配置引用依賴包。

六、使用中遇到的問(wèn)題

1. Spring Boot 有多種 Web 容器如默認(rèn)的 Tomcat, Undertow 等,從綜合上使用哪一個(gè)性能更好。Undertow 如何像 Tomcat一樣配置 http 自動(dòng)跳轉(zhuǎn)到 https?

跟 Tomcat 相比,Jetty 會(huì)顯得更加小巧一些,但是綜合來(lái)看,還是使用默認(rèn)的 Tomcat 比較實(shí)在。

Undertow 比 Tomcat 性能要好得多,https 一般不需要在 Undertow 這一層來(lái)配。一般都會(huì)在 Undertow 之前加一個(gè) Nginx,在 Nginx中配置就行了。(@清靜無(wú)虞)

性能測(cè)試 Undertow 比 Tomcat 稍好一些。穩(wěn)妥可以用 Tomcat,想改換一下思路可以用 Undertow。http redirect to https 用 Undertow 有折中的辦法是引入 Spring Security。不過(guò)一般還是應(yīng)該前端配 Nginx 或者 Apache Http Server 對(duì)外開(kāi)放 https 服務(wù),內(nèi)部用 http 做反向代理通道協(xié)議。(@二的基本算合格)

http://menelic.com/2016/01/06/java-rest-api-benchmark-tomcat-vs-jetty-vs-grizzly-vs-undertow/看了這個(gè)博客,雖然 Tomcat 慢一些,但是實(shí)際業(yè)務(wù)中 Tomcat 并不會(huì)是瓶頸,使用 Tomcat 也是一個(gè)很好的選擇,畢竟使用了這么多年了,對(duì)各項(xiàng)配置也比較熟悉了。(@夢(mèng)朝思夕)

2.

  1. 我用 Spring Boot 很久了,從 1.2.5 開(kāi)始用,最近一個(gè)項(xiàng)目預(yù)計(jì)使用分布式高可用,我也把該弄的框架都弄好了,可是最后客戶取消分布式高可用,采用傳統(tǒng)模式。Java 只負(fù)責(zé)后臺(tái)接口,APP 接受數(shù)據(jù),我現(xiàn)在有個(gè)權(quán)限問(wèn)題,原來(lái)用的 Spring Security 做的權(quán)限前后端分離,現(xiàn)在只有接口,這個(gè)權(quán)限怎么進(jìn)行管理,我看里面有回答說(shuō)用 Spring Cloud 進(jìn)行權(quán)限控制,這個(gè) Cloud 對(duì)傳統(tǒng)模式是否繁重?

  2. 定時(shí)任務(wù)的調(diào)度,自有 Quartz 調(diào)度是否支持集群,多個(gè)節(jié)點(diǎn)(非集群 ng 分發(fā)),但是定時(shí)任務(wù)我想讓他集群,不允許多個(gè)節(jié)點(diǎn)都啟動(dòng)調(diào)度任務(wù),只能某一節(jié)點(diǎn)不能執(zhí)行其他節(jié)點(diǎn)才能觸發(fā),這個(gè)需要用 zookeeper 之類工具進(jìn)行監(jiān)測(cè)么?

對(duì)于企業(yè)級(jí)應(yīng)用來(lái)說(shuō),權(quán)限管理建議使用 SSO 的方式來(lái)實(shí)現(xiàn),這在《深入實(shí)踐 Spring Boot》一書(shū)中有實(shí)際的使用實(shí)例,主要也是使用了 Spring Security 和 OAuth3 的技術(shù)。

Zookeeper 和 Spring-Cloud-Eureka 一樣,都是一個(gè)服務(wù)注冊(cè)和發(fā)現(xiàn)的管理工具,而 Spring-Cloud-Eureka 在 Spring Boot 中使用,更加適合用來(lái)調(diào)度使用 Spring Cloud 開(kāi)發(fā)的微服務(wù)。至于你所說(shuō)的定時(shí)任務(wù)調(diào)度,應(yīng)該不屬于這個(gè)范圍吧。

折騰權(quán)限會(huì)有個(gè) csrf 的問(wèn)題,樓主要是弄好了分享一下心得唄。問(wèn)題:開(kāi)啟 csrf 的話,渲染頁(yè)面模版的時(shí)候,會(huì)生成一個(gè) csrf 字符串,如果 post 提交可以帶上,但如果寫(xiě)出是 json 的接口,就取不到這個(gè) csrf 了,那么在提交 post 請(qǐng)求的時(shí)候就會(huì)報(bào)一個(gè) csrf 相關(guān)的錯(cuò)誤。(@朋也)

3. Spring Boot 如何更好的更簡(jiǎn)潔的實(shí)現(xiàn)多表關(guān)聯(lián)查詢?

在實(shí)體建模時(shí)為多表建立關(guān)聯(lián)關(guān)系,這樣查詢一個(gè)實(shí)體對(duì)象時(shí)就可以連帶查出它關(guān)聯(lián)的其它對(duì)象,即實(shí)現(xiàn)多表關(guān)聯(lián)查詢。

4.

  1. 使用 Spring Boot 搭建的微服務(wù)是否考慮服務(wù)之間的權(quán)限,例如訪問(wèn)權(quán)限,若需要,Spring Boot 本身有提供比較好的解決方案嗎?

  2. Spring Boot 目前對(duì)于 Spring Cloud 生態(tài)有很好的支持和定制化嗎?

Spring Boot 及其前身 Spring,對(duì)于任何第三方都能提供很好的支持,更不用說(shuō)對(duì) Spring Cloud 的支持了。對(duì)于系統(tǒng)的安全管理和訪問(wèn)控制,推薦使用 Spring Cloud 的 SSO,它與 Spring Boot 框架能夠達(dá)到非常融洽的效果。

5. 在使用 Spring Boot 來(lái)開(kāi)發(fā)公司產(chǎn)品的時(shí)候,根據(jù)業(yè)務(wù)進(jìn)行拆分,這樣最后部署的時(shí)候會(huì)出現(xiàn) N 個(gè) jar。這樣的情況下,除了用 Docker 來(lái)部署還有別的什么方式嗎?在部署方面有沒(méi)有哪些需要注意的地方?

N 好像有點(diǎn)大吧,原來(lái)的工程分成十幾個(gè)項(xiàng)目,已經(jīng)很不錯(cuò)了。使用 Spring Boot 的好處是,可以統(tǒng)一項(xiàng)目配置,和使用發(fā)現(xiàn)服務(wù),并更好地管理負(fù)載均衡,提高系統(tǒng)的高可用性。

6. 請(qǐng)問(wèn)用 jar 的方式發(fā)布,如何在系統(tǒng)重啟后能自動(dòng)啟動(dòng)?

Spring Boot 打包的是個(gè)可運(yùn)行的 jar,使用 Java 命令來(lái)啟動(dòng)。寫(xiě)個(gè) shell 腳本來(lái)啟動(dòng)就行了,把 shell 腳本設(shè)置為開(kāi)機(jī)運(yùn)行。不管使用哪種方式部署,自動(dòng)啟動(dòng)都需要編寫(xiě)腳本來(lái)實(shí)現(xiàn)。(@清靜無(wú)虞)

7. 在 Spring Boot 中,如何通過(guò)參數(shù)配置,設(shè)置 Tomcat 的 maxConnections 屬性?

在 Spring Boot 的配置文件中好像沒(méi)有這個(gè)配置參數(shù),如果一定要這個(gè)配置,也可以將項(xiàng)目用 war 方式發(fā)布,然后像以前配置 Tomcat 一樣配置。

8. Spring Boot 做 REST API 開(kāi)發(fā)如何?如果 Controller 接受的參數(shù)模型比較復(fù)雜,基本是對(duì)象一層套一層,那如何定制這類的 API 接口?

  1. 在存儲(chǔ)庫(kù)接口中使用注解 @RepositoryRestResource,就能直接提供 Rest API

  2. 在控制器中使用 @RestController,其中所定義的 URL 就同時(shí)是一個(gè) Rest 資源

9. Spring Boot 在開(kāi)發(fā)階段有熱部署嗎?類似 JRebel 那種

如果設(shè)置成連接 Tomcat 服務(wù)器來(lái)啟動(dòng)應(yīng)用,可以設(shè)置成熱部署的方式。

關(guān)于如何深入實(shí)踐Spring Boot問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI