簡單易用的 Spring Boot,無疑是 Java 開發初學者的指路明燈,更是資深 Java 開發者的得力助手。快速開發是研發 Spring Boot 的初衷,這不可是一個開發團隊的終生追求,也是一個企業解放生產力、提升生產效率的保障。前端
Spring Boot 的組件化整合規則,完美地整合了雲應用開發工具,使其在雲計算領域中處於領先地位,爲建立高可用和高性能的服務提供了更加簡便和快捷的方法。java
Spring Boot 是從 Spring 框架發展起來的,因此對於使用 Spring 框架的龐大用戶羣體來講,隨着 Spring Boot 的普及使用,將使衆多開發者成爲它的擁躉。git
所以,在 OSC 第 135 期高手問答中,咱們策劃了「深刻實踐 Spring Boot」的主題,並邀請了@快意開發(陳韶健)做爲高手嘉賓。shell
本文整理了本期高手問答中一些與 Spring Boot 相關的精彩問答。數據庫
1. 企業項目開發的時候,Spring Boot 有哪些使用場景呢,已知的坑是什麼呢?json
SSO,分佈式文件系統,微服務使用等等,在企業版應用中,這些都是很是頂用的。若是硬說有坑的話,就是服務多了,服務部署和運維管理必需要上一個檔次,不然就會顯得混亂起來。後端
2. 我的感受,從快速構建方面確實很高效,並且這樣框架也是通過了不少實踐以後,結晶的產品。可是,對於新人來講,直接應用 Spring Boot,仍是感受不是很理想,可能會使新人對於 Spring 框架的理解上產生阻礙。對於 Spring Boot 自己,仍是很是不錯的,雲部署,快速構建都很不錯。個人問題是,公司對於 Spring Boot 的應用有什麼要求嗎?通常開發會在什麼狀況下使用它?對於企業級的開發是否也有要求?api
Spring Boot 對背景知識沒有特別要求,對於新人來講,搭建好項目讓其跟隨開發,更加容易入手。對於公司的要求,主要看工程的規模和部署的方式,若是使用 Docker 部署並須要設置負載均衡等對運維人員和服務器的要求會高一些。tomcat
3. 常常看到 Spring Boot 和微服務關聯起來,是由於 Spring Boot 開發和部署比較快麼,能具體說說麼?安全
Spring Boot 確實是以快速開發爲目標而設計的,它的簡單易用的特性確實減輕了開發者的負擔,從而能夠提升開發的生產率。你的問題須要全面理解一下 Spring Boot,能夠經過它的官方網站進行一些瞭解。
4. 這個框架適合開發什麼類型的項目
最適合用來開發 Web 應用項目。
1. 已經使用 Spring Boot 有幾個月了,也開始在使用 Spring Boot 搭建公司的基礎系統。我理解的 Spring Boot 應該是提倡以 jar 的形式部署,但這種方式在包的體積過大的狀況下部署太慢了,以前咱們的業務和服務器都在國外,上傳的時候速度慢得一塌糊塗,除了改爲 war 發佈,還有什麼其餘辦法麼?
其實最好的方式,仍是使用 jar,而後結合使用 Docker 來發布。若是一個項目的 jar 包過大的話,要看看形成這種狀況的主要緣由是什麼。是否是 jar 包中包含的資源文件太多,仍是項目包含的業務太複雜,若是是前種緣由,考慮優化一些圖片資源,或者使用分佈式文件系統來存儲圖片資源。若是是後一種緣由,是否是考慮將原項目使用模塊化方式進行細分。
@採蘑菇的大叔 貢獻的 DEMO http://git.oschina.net/icer/iblog。用 SpringBoot 搭了個架子,整合了 freemarker 和 mybatis。
2. Spring Boot 集成了服務器,以 jar 文件發佈,減小對外部文件和環境依賴。但長期集成致使體積過大,這的確是個問題,能不能考慮作一些工具對 jar 進行減肥呢?
這就要分析一下形成 jar 過大的緣由是什麼,若是是由於資源文件太多形成的,那就要優化一些圖片的設計,或使用其它方式來連接資源文件,若是是由於一個項目包含的業務太多太複雜形成的,就要考慮是否能夠將項目進行拆分。
3. 若是是用 Spring Boot 來作成 jar 服務啓動,怎麼衡量服務粒度。由於每一個服務都要運行 Spring,或者也會加個 dubbo 的依賴等等。跑起多個實例,這就重複了。其實就是單體應用跟分佈式應用的點。
主要仍是看你怎樣配置服務,若是使用 Spring Cloud 的服務發現來管理服務,能夠經過負載均衡的配置支持多個服務同時對外提供服務。
4. Spring Boot 一樣支持以標準的 war 方式部署應用,只是在啓動類上須要進行細微的調整,並不強調始終以 jar 方式部署。
Spring Boot 應該是鼓勵以 jar 的方式部署,隨着 Spring Boot 一塊兒來的應該是想推進微服務。我的看法,僅供討論。(@採蘑菇的大叔)
5. 使用 Spring Boot 的時候,頁面文件會被打包到 jar 中,若是隻更新頁面文件,又要對 jar 進行打包上傳。有沒有簡單的方法?相似原先的 Tocmat 部署就能夠直接修改頁面文件。不須要重啓的方法?
可使用 war 方式部署 。
6. Spring Boot 項目如何作到 libs jar 和 app jar 分開,不少時候,我只是更新應用層代碼,本地編譯好上傳上去,啓動的時候經過腳本啓動,那麼如何將 libs 和 app 分別打包並啓動呢?
使用 war 方式發佈就能夠實現你的要求。
1. 請簡單介紹一下 Spring Boot 和 Docker 結合
真要簡單地說:將 Spring Boot 項目打包成 jar,而後經過 Docker 進行部署。用 Spring Boot 開發的項目,很是適合用 Docker 來部署。
這兩個東西之間沒有任何關係。Spring Boot 主要的目的是簡化開發和部署過程當中配置文件的使用,使用了不少約定俗成的規則,按照這些約定的規則來開發,能夠大大減小配置文件的使用,甚至徹底不使用配置文件都是可能的。Docker 只是把運行環境,像 OS、JVM、Nginx 等等打包到一塊兒的個工具而已。把 Spring Boot 生成的可執行的 jar 包放進這個運行環境中來運行。這兩個工具都只是簡化了開發和運維的繁雜過程,使用了不少自動化處理的技術而已。(@清靜無虞)
2. Spring Boot 從開發到部署的最佳實踐 ,是否必須依賴容器技術,如何平滑過渡到 Docker 容器上?
Spring Boot 並不依賴 Docker 容器,也可使用 war 方式或者按照傳統的方式直接使用文件系統來發布,只是使用 Docker,更能發揮它在各個方面優點。
3. 能分享下 Spring Cloud 和 Docker 部署方面的經驗嗎?
使用 Docker 發佈 Spring Boot 項目(https://my.oschina.net/syic/blog/799656)
1. 舊的項目轉到 Spring Boot 有什麼條件?
不須要什麼條件,使用 Spring Boot,最好是對原來的項目進行從新設計,或者使得原來的邏輯進行重建。
2. 是否是微服務架構比較適合用 Spring Boot?那對於老的系統或代碼,怎麼轉到 Spring Boot?
全部使用 Web 方式開發的項目都適合使用 Spring Boot 框架,並從中獲益,微服務開發是它的一大特點。舊系統的代碼不能轉換,可使用原來的業務邏輯進行重建。
1. 幾年前作開發仍是用的 Spring,包括 Spring 的 Bean 工廠方案還有 SpringMVC,如今主要業務的開發通常用的公司自研框架,因此對 Spring 感受比較生疏了,我就想了解了解,Spring Boot 同幾年前的 Spring 相比,都有哪些方面的發展和變化,能大概講講嗎?
Spring Boot 是在 Spring 的基礎創建起來的,保留了 Spring 的一些精髓,同時也摒棄了一些糟粕,表如今:
- 統一工程配置,能夠不使用 XML 配置
- 使用一些組件,具備自動配置的功能
- 內嵌了 Tomcat,性能指標等服務
- 更方便獨立部署或使用 Docker 配置成高可用和高性能的平臺
2. Spring Boot 與傳統 SSH 框架的主要區別在哪些方面?
Spring Boot 能最大限度地簡化配置,也能夠嵌入 Tcomcat 等服務,而且在開發企業級應用、分佈式應用等方面更加駕輕就熟,更加難能難得的是使用很是簡單,很是適合快速開發的須要,符合軟件工程構件化發展的目標。
3. Spring Boot 和 Spring MVC 有什麼區別?
Spring MVC 仍是屬於 Spring 框架的,Spring Boot 是在 Spring 的基礎之上創建的一個全新開發框架。
4. Spring Boot 構建微服務,和目前一些新的例如 light java framework , sparkjava 在構建微服務上有什麼優點?
在 Spring Boot 家族中,使用雲應用開發工具集 Spring Cloud 開發微服務應用,具備得天獨厚的優點。這裏所說的微服務,是指功能強大,業務單一的分佈式應用系統,並不是簡單指項目的微型結構。
5. 用了 Spring Boot 是否是就不用再搞 Spring、SpringMVC、Hibernate、Struts、MyBatis 這些了?
對的,十分正確。對於數據庫來講,使用 JPA 就能一網打盡了。
6. Spring Boot 仍是很喜歡的,簡化了很多配置,但實際中微服務的劃分是個問題。
服務的劃分這個和 Spring Boot 沒有任何關係。微服務的一個難點就是服務的劃分,有些服務是按技術特色來劃分,好比像 push 服務、sms 服務等。有些是按業務特色來劃分,像訂單服務等,有些根據實際狀況還進行服務的分層。
7. 使用 Spring Boot,其餘的必須框架還須要配置嗎?
若是使用 Maven 或其它項目管理工具,均可以在工程配置引用依賴包。
1. Spring Boot 有多種 Web 容器如默認的 Tomcat, Undertow 等,從綜合上使用哪個性能更好。Undertow 如何像 Tomcat同樣配置 http 自動跳轉到 https?
跟 Tomcat 相比,Jetty 會顯得更加小巧一些,可是綜合來看,仍是使用默認的 Tomcat 比較實在。
Undertow 比 Tomcat 性能要好得多,https 通常不須要在 Undertow 這一層來配。通常都會在 Undertow 以前加一個 Nginx,在 Nginx中配置就好了。(@清靜無虞)
性能測試 Undertow 比 Tomcat 稍好一些。穩妥能夠用 Tomcat,想改換一下思路能夠用 Undertow。http redirect to https 用 Undertow 有折中的辦法是引入 Spring Security。不過通常仍是應該前端配 Nginx 或者 Apache Http Server 對外開放 https 服務,內部用 http 作反向代理通道協議。(@二的基本算合格)
http://menelic.com/2016/01/06/java-rest-api-benchmark-tomcat-vs-jetty-vs-grizzly-vs-undertow/看了這個博客,雖然 Tomcat 慢一些,可是實際業務中 Tomcat 並不會是瓶頸,使用 Tomcat 也是一個很好的選擇,畢竟使用了這麼多年了,對各項配置也比較熟悉了。(@夢朝思夕)
2.
對於企業級應用來講,權限管理建議使用 SSO 的方式來實現,這在《深刻實踐 Spring Boot》一書中有實際的使用實例,主要也是使用了 Spring Security 和 OAuth2 的技術。
Zookeeper 和 Spring-Cloud-Eureka 同樣,都是一個服務註冊和發現的管理工具,而 Spring-Cloud-Eureka 在 Spring Boot 中使用,更加適合用來調度使用 Spring Cloud 開發的微服務。至於你所說的定時任務調度,應該不屬於這個範圍吧。
折騰權限會有個 csrf 的問題,樓主要是弄好了分享一下心得唄。問題:開啓 csrf 的話,渲染頁面模版的時候,會生成一個 csrf 字符串,若是 post 提交能夠帶上,但若是寫出是 json 的接口,就取不到這個 csrf 了,那麼在提交 post 請求的時候就會報一個 csrf 相關的錯誤。(@朋也)
3. Spring Boot 如何更好的更簡潔的實現多表關聯查詢?
在實體建模時爲多表創建關聯關係,這樣查詢一個實體對象時就能夠連帶查出它關聯的其它對象,即實現多表關聯查詢。
4.
Spring Boot 及其前身 Spring,對於任何第三方都能提供很好的支持,更不用說對 Spring Cloud 的支持了。對於系統的安全管理和訪問控制,推薦使用 Spring Cloud 的 SSO,它與 Spring Boot 框架可以達到很是融洽的效果。
5. 在使用 Spring Boot 來開發公司產品的時候,根據業務進行拆分,這樣最後部署的時候會出現 N 個 jar。這樣的狀況下,除了用 Docker 來部署還有別的什麼方式嗎?在部署方面有沒有哪些須要注意的地方?
N 好像有點大吧,原來的工程分紅十幾個項目,已經很不錯了。使用 Spring Boot 的好處是,能夠統一項目配置,和使用發現服務,並更好地管理負載均衡,提升系統的高可用性。
6. 請問用 jar 的方式發佈,如何在系統重啓後能自動啓動?
Spring Boot 打包的是個可運行的 jar,使用 Java 命令來啓動。寫個 shell 腳原本啓動就好了,把 shell 腳本設置爲開機運行。無論使用哪一種方式部署,自動啓動都須要編寫腳原本實現。(@清靜無虞)
7. 在 Spring Boot 中,如何經過參數配置,設置 Tomcat 的 maxConnections 屬性?
在 Spring Boot 的配置文件中好像沒有這個配置參數,若是必定要這個配置,也能夠將項目用 war 方式發佈,而後像之前配置 Tomcat 同樣配置。
8. Spring Boot 作 REST API 開發如何?若是 Controller 接受的參數模型比較複雜,基本是對象一層套一層,那如何定製這類的 API 接口?
- 在存儲庫接口中使用註解 @RepositoryRestResource,就能直接提供 Rest API
- 在控制器中使用 @RestController,其中所定義的 URL 就同時是一個 Rest 資源
9. Spring Boot 在開發階段有熱部署嗎?相似 JRebel 那種
若是設置成鏈接 Tomcat 服務器來啓動應用,能夠設置成熱部署的方式。
有關 Spring Boot 的相關問答內容至此結束。開源中國的技術問答區上面活躍着不少技術大牛,歡迎各位在上面踊躍提問和回答。