優雅的啟動、停止、重啟你的SpringBoot專案
前言
你是如何啟動、關閉你的SpringBoot專案的?還是使用java -jar xxxx.jar啟動? 還在用ps -ef找到你的pid去kill你的應用嗎? 讓我們來看看還有什麼更加優雅的一鍵啟動關閉的方式。
第一種方式
指令碼的使用
首先,將你需要釋出的jar包,和含有上述內容的指令碼app.sh,上傳至linux伺服器,注意兩者必須處於同一目錄,並且該目錄下只有一個jar包,並給與app.sh相應執行許可權,chmod 777 app.sh
然後就可以執行指令碼,命令如下
命令 | 作用 |
---|---|
./app.sh start | 啟動應用 |
./app.sh stop | 關閉應用 |
./app.sh restart | 重啟應用 |
./app.sh status | 檢視應用狀態 |
./app.sh stop -f | 強制kill應用程序 |
注意,重新發布應用時,先stop再上傳jar包哦。
使用情況如圖: 
指令碼中可以修改的地方:
19行左右: nohup java -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G -jar $appName > /dev/null 2>&1 & 這是最終jar的啟動命令,在這裡你需要對gc、Xms、Xmx等針對你機器的實際情況修改,還可以新增你所需要的啟動引數等。
56行左右: for i in {3..1}
這裡是設定restart的時候等待的時間,因為有的專案在3秒之內可能沒有辦法正常停止,所以可以調整為5秒,保證應用確實正常停止後再啟動
第二種方式
如果你以為這樣就足夠優雅了,那你就太天真了,如果你使用的是SpringBoot2.0及以上的版本,那就有福了,不需要指令碼也可以很優雅。
如何使用
首先你修改一下打包的方式: 如果你使用gradle構建的專案,在build.gradle檔案中加入以下程式碼,打包時使用bootJar進行打包 bootJar { launchScript() } 如果你使用maven進行構建的專案,新增下面的程式碼
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
打出來的jar檔案非常神奇,在linux系統可以直接使用./app.jar這樣類似於啟動shell指令碼一般的方式啟動專案,你可以先嚐試一下是否能這樣啟動,來保證後續步驟的正常。
第二步新增連結 在伺服器上執行下面的命令: $ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp 其中【/var/myapp/myapp.jar】為你上傳至伺服器jar的絕對路徑,一定要寫全哦。 【/etc/init.d/myapp】裡面的myapp可以修改為你自己想要的名稱,後面會用到。
第三步啟動 做完之後,你就可以使用service命令,像啟動停止服務一樣操作你的應用:
$ service myapp start
$ service myapp stop
$ service myapp status
測試效果如下: [[email protected] ~]# service myapp start Started [31624] [[email protected] ~]# service myapp status Running [31624] [[email protected] ~]# service myapp stop Stopped [31624]
其中會遇到的坑:
使用service myapp start命令後可能出現Unable to find Java. 使用ln -s /usr/local/jdk/bin/java /sbin/java命令來解決。 其中【/usr/local/jdk/bin/java】為你安裝在伺服器上jdk的目錄 【/sbin/java】不需要修改 問題解決參考:https://github.com/spring-projects/spring-boot/issues/5690
總結
這樣之後你想停止應用,不需要再像以前一樣ps -ef找來找去了。 這對於之後的CICD,或者是docker化的你的應用等,都有一定的幫助。