給大家聊一聊雲收藏從 Spring Boot 1.0 更新到 2.0 所踩的坑
先給大家曬一下雲收藏的幾個資料,作為一個 Spring Boot 的開源項目(https://github.com/cloudfavorites/favorites-web)目前在 Github 上面已經有1600多個 Star,如果按照 SpringBoot 标簽進行篩選的話也可以排到第五位。
當雲收藏1.0開發完成之後,同步将雲收藏部署到了伺服器上,申請了一個域名www.favorites.ren友善大家使用,到目前為止:網站的注冊使用者4000多人,共計收藏文章100000多條,在百度上搜尋:雲收藏,排在第一的就是雲收藏的官網。2年多的時間這個資料其實也并不是很耀眼,但是作為一個學習 Spring Boot 的開源軟體來講,已經不錯了。
雲收藏的部署之路也挺曲折,剛開始的時候部署在我以前公司的伺服器上,後來離職的時候在阿裡雲買了個1核1G的雲伺服器,因為安裝了 Mysql、Redis、還有其它小軟體導緻伺服器非常卡,那段時間通路雲收藏的時候需要等待2-3秒才會有響應。
終于有一天自己也不能忍了,花錢把伺服器更新到2核2G,通路速度雖有所提升但還是很不理想,那段時間工作很忙也沒時間優化。網站的 Bug 也是一片,有時候還會突然中斷服務幾個小時,流失了一大批使用者,甚至有人在 Github 上面留言說:看來微笑哥已經放棄雲收藏了,我看了之後隻能苦笑。
到了今年 Spring Boot 2.0 釋出的時候,我就計劃着把雲收藏全面更新到2.0,順便做一些優化讓通路速度快一點。但一拖就是2個月,終于在前幾個周末抽出了一點時間,将雲收藏更新到了 Spring Boot 2.0 同時修複了一批顯而易見的 Bug ,使用 Nginx 将靜态圖檔等資源做了代理,當這些工作完全做完的時候,雲收藏的通路速度明顯得到了提升,大家可以通路www.favorites.ren體驗一下。
将雲收藏從 Spring Boot 1.0 更新到 2.0 的時候也遇到了一些問題,在修改的過程中記錄下來,今天整理一下分享出來,友善後續更新的朋友少踩一些坑。
1、第一個問題:啟動類報錯
Spring Boot 部署到 Tomcat 中去啟動時需要在啟動類添加<code>SpringBootServletInitializer</code>,2.0 和 1.0 有差別。
這個問題好解決隻需要重新導包就行。
2、日志類報錯:Spring Boot 2.0 預設不包含 log4j,建議使用 slf4j 。
改為:
這個也比較好改動,就是需要替換的檔案比較多。
3、Spring Boot 2.0 去掉了<code>findOne()</code>方法。
以前的<code>findOne()</code>方法其實就是根據傳入的 Id 來查找對象,是以在 Spring Boot 2.0 的 Repository 中我們可以添加<code>findById(long id)</code>來替換使用。
例如:
改為手動在<code>userRepository</code>手動添加<code>findById(long id)</code>方法,使用時将<code>findOne()</code>調用改為<code>findById(long id)</code>
<code>delete()</code>方法和<code>findOne()</code>類似也被去掉了,可以使用<code>deleteById(Long id)</code>來替換,還有一個不同點是<code>deleteById(Long id)</code>預設實作傳回值為<code>void</code>。
改為
當然我們還有一種方案可以解決上述的兩種變化,就是自定義 Sql,但是沒有上述方案簡單不建議使用。
4、雲收藏更新到 2.0 之後,插入資料會報錯,錯誤資訊如下:
這個問題稍稍花費了一點時間,報錯提示的是主鍵沖突,跟蹤資料庫的資料發現并沒有主鍵沖突,最後才發現是 Spring Boot 2.0 需要指定主鍵的自增政策,這個和 Spring Boot 1.0 有所差別,1.0 會使用預設的政策。
改動也比較簡單,需要在所有的主鍵上面顯示的指明自增政策。
5、Thymeleaf 3.0 預設不包含布局子產品。
這個問題比較尴尬,當我将 Pom 包更新到 2.0 之後,通路首頁的時候一片空白什麼都沒有,檢視背景也沒有任何的報錯資訊,首先嘗試着跟蹤了 http 請求,對比了一下也沒有發現什麼異常,在查詢 Thymeleaf 3.0 變化時才發現:Spring Boot 2.0 中<code>spring-boot-starter-thymeleaf</code> 包預設并不包含布局子產品,需要使用的時候單獨添加,添加布局子產品如下:
改完之後再通路首頁,一切正常,但是回頭檢視日志資訊發現有一個告警資訊:
跟蹤位址看了一下,大概的意思是以前布局的标簽已經過期了,推薦使用新的标簽來進行頁面布局,解決方式也比較簡單,修改以前的布局标簽 <code>layout:decorator</code> 為 <code>layout:decorate</code>即可。
6、分頁元件<code>PageRequest</code>變化。
在 Spring Boot 2.0 中 ,方法<code>new PageRequest(page, size, sort)</code> 已經過期不再推薦使用,推薦使用以下方式來建構分頁資訊:
跟蹤了一下源碼發現<code>PageRequest.of()</code>方法,内部還是使用的<code>new PageRequest(page, size, sort)</code>,隻是最新的寫法更簡潔一些。
7、關聯查詢時候組合傳回對象的預設值有變化。
在使用 Spring Boot 1.0 時,使用 Jpa 關聯查詢時我們會建構一個接口對象來接收結果集,類似如下:
在使用 Spring Boot 1.0 時,如果沒有查詢到對應的字段會傳回空,在 Spring Boot 2.0 中會直接報空指針異常,對結果集的檢查會更加嚴格一些。
8、其它優化
前段時間在學習 Docker ,給雲收藏添加了 Docker 、Docker Compose 支援讓部署的時候更簡單一些;同時修複了一些 bug,對于明顯很消耗資源的功能進行了改進,部分功能添加了容錯性;本次部署的時候使用了 Nginx 作為反向代理,因為使用了 WebJars 暫時不能使用 Nginx 代理 Js,是以将除過 Js 以外的其它資源都配置了緩存,;資料庫由 Mysql 換成了 Mariadb。
以上就是雲收藏從 Spring Boot 1.0 到 2.0 所做的一些小改進,做完這些工作之後驚喜的發現雲收藏的通路速度比以前快了很多,雖然還有很大的優化空間,但日常使用基本上不會體驗到太大的延遲。Spring Boot 2.0 中 Thymeleaf 預設使用了 3.0 ,資料庫連接配接池預設使用了 Hikari ,這兩個元件在性能上有很大的提升,同時也是提升雲收藏通路速度的因素之一。
未來雲收藏還會持續更新,後續會規劃一些面向程式員的新功能,敬請期待!
作者:純潔的微笑
出處:www.ityouknow.com
資源:微信搜【純潔的微笑】關注我,回複 【程式員】【面試】【架構師】有我準備的一線程式必備計算機書籍、大廠面試資料和免費電子書。 一共1024G的資料,希望可以幫助大家提升技術和能力。
本文如對您有幫助,還請多幫 【推薦】 下此文。
點我了解:Tooool-程式員一站式導航網站