1. 程式人生 > >springboot構建web專案的叢集部署之路

springboot構建web專案的叢集部署之路

最近搞了個springboot構建的bbs專案,專案整體是從github上面clone的,到本地做了一些環境移植,最後部署到linux環境下,部署2個節點,算是一個叢集。期間踩坑無數,這裡記錄一下,以備後用,免蹈覆轍。

1.springboot構建的web專案,例子裡面都是寫main類,打jar包直接執行。因為在spring-boot-starter-web這個包裡,內建了tomcat。這個tomcat也可以做設定,但是總歸有點隔靴搔癢。線上環境還是老實打war包放到正規的tomcat裡面執行比較穩妥。如何把jar改造成war,一搜一大堆,簡單來說:1)改打包型別;2)新增打war包外掛;3)修改啟動的main類,繼承SpringBootServletInitializer,重寫configure方法。這裡多說一句,我理解是:原來是main類啟動,拿引數,起容器。現在不用你操心了,繼承這個類之後,你變成容器啟動過程中的一個環節了。4)注意修改springboot-starter-web這個依賴,exclusion掉內建的tomcat,然後單獨引一個tomcat的包,並且修改scope為provided.同時Tomcat下的J2EE相關的包也要單獨引入一下,同時設定為provided。為什麼這麼麻煩,主要是為了設定provided屬性,這樣我們測試的時候還用tomcat以及相關J2EE包,打包的時候就不要了,不然會跟容器裡面的包衝突。5)對第4點的補充,如果是用idea的話,這裡的provided需要改為compile,否則會提示找不到j2EE相關的包。

2.jar包改為war包後,有一些事情發生了變化,比如原來訪問專案jar包起的都是直接地址+埠訪問了,省略了專案的contextpath,比如我clone這個專案的程式碼,在freemaker的模板頁面裡,都是直接訪問的資源路徑,改成war之後,如果放在webapp下面是一定要帶contextpath的,這樣就不得不修改原來的訪問路徑。另外action裡涉及到redirect的地方,也要加上專案的contextpath。

3.靜態資原始檔在打包時需要指定一下,尤其在開發時沒有嚴格按照springboot約定放的話。也注意修改配置檔案中的路徑,使其與打包時的路徑保持一致。

4.打war包成功,在本地測試無誤,放到linux伺服器上,總是起不來。我一開始就發現是jdk版本問題,因為伺服器全域性變數用的1.7,專案用的1.8,在之前測試jar包的時候,就特別指定了1.8的JDK,這次啟動tomcat,也在網上搜瞭如何指定jdk,有人說是修改setclasspath.sh,修改過後,確實啟動tomcat輸出資訊顯示的jre是1.8.這個假象迷惑了我好幾天,一度讓我放棄打war包這條路。後來在這位仁兄的帖子裡找到了有效的辦法:https://blog.csdn.net/u012476249/article/details/54913482,就是直接在catalina.sh裡面指定。我也是後來在逐行檢視tomcat的啟動日誌時發現裡面有個1.7的字樣,才意識到是jdk的事。總之,這個坑是自己不好好讀日誌引起的,活該遭此一劫。

5.打包和啟動的問題解決了,新的問題出現了:部署兩個節點,資原始檔,尤其是使用者上傳的圖片資源,如何訪問。正常的情況當然是建立一個單獨的檔案伺服器,這樣可以避免多節點帶來的一系列問題。但是,我一開始根本沒考慮這個問題。好在伺服器上有NAS,如果把資原始檔放在NAS上,大家實際訪問的還是同一份資料。接下來就是解決資原始檔外放後的訪問問題,一開始我想通過搭建Nginx服務,使用動靜分離的策略,單獨指定靜態資源的路徑,這樣需要多開一個埠,時間來不及。後來一查,tomcat中可以通過增加context屬性,指定訪問路徑和實際路徑的對映,比如:

<host appBase="d:/aaa">
<Context path="/myproject/static/images" reloadable="true" docBase="D:\static\images\"></Context>
</host>

這樣把上傳的檔案指定到NAS目錄中,兩個節點上傳的檔案存在同一個地方,通過自己的服務地址都可以訪問,就算負載均衡下,交叉訪問也不會有問題。

6.其他的問題,一個是session問題,可能會出現使用者在這個節點登陸,下一個請求被分配到另一個節點,要求重新登入的問題。由於負載均衡伺服器是F5,一般是不給設定的,只能從應用角度解決。接下來要解決的問題。

7.總結來說,之所以遇到這麼多問題,主要是自己對各種功能一知半解,在複雜的專案環境下不能見招拆招,從而持續踩坑。不過踩了坑之後,竟然覺得神清氣爽。畢竟看別人的經驗攻略即使再詳細,也不如自己親自經歷一遍。