1. 程式人生 > >「SpringBoot」如何優雅地管理SpringBoot專案

「SpringBoot」如何優雅地管理SpringBoot專案

本文主要講述一下如何優雅地管理SpringBoot專案。 ### 背景 課堂上,當小明形如流水地回答完沐芳老師提出來的問題時,卻被至今沒有物件的胖虎無情嘲諷了? > 沐芳老師:小明,你平時是如何啟動、停止你的SpringBoot專案的? > > 小明(自信滿滿):啟動時使用`java -jar xxxx.jar`命令啟動,停止服務時,使用`ps -ef`找到服務的`pid`,然後再`kill`掉停止。 > > 胖虎:就這? 這讓小明很有挫敗感,原計劃按時放學回去陪隔壁小花打王者榮耀的小明,毅然決然留在教室潛心研究一番到底什麼是SpringBoot優雅啟動的正確姿勢?經過幾番挫折,小明終於蒐集整理出兩種優雅啟動SpringBoot專案的方式分享給小明的小夥伴們。 ### 第一種方式:使用SHELL指令碼 As we known 作為一個後端程式猿,每天的工作除了與前端妹子一塊連調介面(拌幾嘴)以外,就是終日沉浸在黑壓壓的Linux伺服器之中,部署服務、監控伺服器狀態、分析日誌(找bug)……因此,掌握一些常用的SHEEL指令碼命令是自然而然地(迫不得已)。 > 大膽胡說:什麼是SHELL指令碼?故名思議,她樂了(她樂你也樂)。 因此,小明站在巨人的肩膀上,參考了一些圈內資深高階JAVA開發工程師的經驗,整理了一份防嘲諷必備的SHELL指令碼(Github地址見文末),只是為了自己的SpringBoot服務,只是為了不被單身的胖虎嘲諷。 這一份SHELL指令碼很神奇,有多神奇呢? 你只要把這個指令碼放到你的SpringBoot專案打好的jar包**同級目錄**下: ![](https://img2020.cnblogs.com/other/1669068/202004/1669068-20200407110017848-83488986.png) 在該目錄下,簡單粗暴地執行下面這個命令,賦予該指令碼相應執行許可權 ``` chmod 777 app.sh ``` 就能完成如下功能: | 命令 | 作用 | | :--------------: | :--------------: | | ./app.sh start | 啟動應用 | | ./app.sh stop | 停止應用 | | ./app.sh restart | 重啟應用 | | ./app.sh status | 檢視應用狀態 | | ./app.sh stop -f | 強制kill應用程序 | > 注意:如果一個目錄下有多個jar包我們執行一個檔案,那就需要指定jar包,比如`./app.sh start coder-xiaoming-0.0.1-SNAPSHOT.jar` 驚不驚喜?讓大家看一下小明實操預覽圖,過過眼癮先。 ![](https://img2020.cnblogs.com/other/1669068/202004/1669068-20200407110018050-779466036.png) 我們可以看到,通過執行啟動命令,控制檯輸出提示:正在啟動……並且該目錄下會根據jar包名稱和日期輸出一個日誌檔案(除錯bug使用)。 為了走一個流程,我們再檢視一下應用狀態,並停止應用 ![](https://img2020.cnblogs.com/other/1669068/202004/1669068-20200407110018201-426338388.png) 篇幅有限,其他幾個命令大家可以自己嘗試一下。 當然,我們還可以嘗試自定義指令碼中的內容: 比如,**gc**、**Xms**、**Xmx**等針對當前伺服器的實際配置進行修改; ![](https://img2020.cnblogs.com/other/1669068/202004/1669068-20200407110018459-1234538306.png) 不同大小的專案,正常停止專案的時間也不同,因此我們還可以設定`restart`應用時的等待時間,確保應用正常停止後再啟動,如下所示將等待時間設為5s。 ``` for i in {5..1} do echo -n "$i " sleep 1 done ``` 是不是感覺已經很規範很優雅了?但,故事還要繼續,遠沒有完,小明又繼續探索下去,發現如果你使用的是**SpringBoot 2.0**及以上的版本,那小明的小夥伴們便有福了,不需要以上的指令碼就可以很優雅。接下來,看一下第二種方式。 ### 第二種方式:把SpringBoot以服務形式啟動 > 英文名字:Spring Boot Application as a Service Deploying . 擱在平時,小明在Linux伺服器上啟動Springboot專案,都是通過**nohup**命令讓程式作為後臺程序執行的,但是這樣,程式並不好管理維護,反而顯得小明和小明的夥伴們都很不專業,更好的方法是將*SpringBoot*作為*Service*啟動。 首先需要更改打包方式,如果你使用的是maven構建的SpringBoot專案,首先將SpringBoot專案中的**pom.xml**中增加一個**plugin**: ``` org.springframework.boot
spring-boot-maven-plugin true
``` 其中“true”一定要加,標示該jar為可執行,否則機器啟動SpringBoot服務會報錯。 如果你使用的是**gradle**構建的**SpringBoot**專案,則相應地需要增加如下配置 ``` bootJar { launchScript() } ``` 接下來拿主要拿maven打包舉例: 首先通過package命令打jar包: ``` mvn clean package ``` 接著,我們需要在Linux伺服器上,如下所示,增加一個軟連線,就可以將應用註冊到Service ``` sudo ln -s /opt/coder-xiaoming.jar /etc/init.d/coder-xiaoming ``` 其中`/opt/coder-xiaoming.jar`為你上傳至伺服器jar的絕對路徑,一定要寫全哦。 `/etc/init.d/coder-xiaoming`裡面的`coder-xiaoming`可以修改為你自己中意的名字,執行相關命令時會用到。 接下來,就是見證奇蹟的時刻,我們通過如下命令來操作應用(和操作湯姆貓一樣): 啟動服務 ``` sudo service coder-xiaoming start ``` 停止服務 ``` sudo service coder-xiaoming stop ``` 檢視服務狀態 ``` sudo service coder-xiaoming status ``` 有些小夥伴可能注意到了,這樣快捷操作省去很多配置,固然很方便,那啟動服務時如何自定義引數呢?接著往下看。 #### 自定義JVM引數 我們只需在jar包所在的同級目錄下新增與jar包同名的配置檔案,比如新增一個叫coder-xiaoming.conf的配置檔案(名字要和jar的名字相同哦),然後在檔案裡面自定義JVM引數**JAVA_OPTS**: ``` export JAVA_OPTS="-Xmx4096m -Xms4096m" ``` 這樣啟動時,就會讀取該檔案中的配置,我們檢視一下程序狀態 ``` ps -ef | grep java ``` 你一定可以看到,對應的Java程序啟動引數上會多了“-Xmx4096m -Xms4096m”,如果要增加其他啟動引數配置同理哈。 ### 總結 自從小明掌握以上兩個騷操作之後,在日常開發中也可以目中無人地**啟動/停止**SpringBoot應用,極大地提高了日常工作效率,這讓身旁的胖虎也呆若木雞。這樣操作的意義很大,以當前眼光來看,小明可以多陪小花打幾把王者榮耀;以長遠來看,這對於之後的CICD或者Docker化應用都有很大的幫助。小明的小夥伴們,你們還不趕緊應用起來?保證今晚不加班~ >
附 > > sheel指令碼Github地址:https://github.com/WhenCoding/coder-xiaoming/blob/master/deploy/app.sh 搜尋微信公眾號“程式設計師小明”,獲取更多精彩。