SpringBoot以服務形式啓動,並設置JVM啓動參數

1 概述

SpringBoot使得我們可以快速地上手以及開發Spring項目。我們可以把工程打成一個jar包,然後部署到服務器上(這裏只討論Linux,因爲沒多少人會拿Windows當服務器)。nohup命令可以讓程序作爲後臺進程執行,但是它不好管理維護,也顯得很不專業。更好的方法是將SpringBoot作爲Service啓動。

2 步驟

2.1 Maven打包

通過package命令打jar包:

mvn clean package

這裏注意一點,一定要將org.springframework.boot plugin添加到pom文件裏面,其中“true”一定要加,標示該jar爲可執行,否則機器啓動SpringBoot服務會報錯。plugin如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

2.2 配置SpringBoot服務

要將程序註冊成服務,必須保證jar有執行(下面例子中的x)的權限,否則服務無法啓動。

[nightfield@mthf2mulsvr001 ~]$ ls -l
total 10904
-rwx------. 1 nightfield nightfield 11164464 Mar  5 13:01 myApp.jar

有兩種比較主流的方式配置springBoot服務

2.2.1 System V Init服務

System V Init服務都在目錄/etc/init.d/下面。只需在此目錄下創建一個到SpringBoot Jar的鏈接,就可以註冊Service。假設我們的jar的目錄爲/home/nightfield/myApp.jar:

sudo ln -s /home/nightfield/myApp.jar /etc/init.d/myApp

這裏,必須指定jar的絕對路徑。
然後,我們就可以通過如下命令來啓動服務了:

sudo service myApp start

這個服務以那個用戶來運行,取決於jar包所屬的用戶。在該例子中,jar包屬於用戶nightfield,那麼它將以nightfield用戶來運行。

[nightfield@mthf2mulsvr001 ~]$ ps -ef | grep myApp
nightfi+ 19741     1  0 13:44 ?        00:00:00 /bin/bash /home/nightfield/myApp.jar
nightfi+ 19756 19741 99 13:44 ?        00:00:16 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /home/nightfield/myApp.jar
nightfi+ 19851  7759  0 13:45 pts/0    00:00:00 grep --color=auto myApp

可以看到,應用正以nightfield用戶跑在後臺,其實服務只是以下命令的包裝:

/usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /home/nightfield/myApp.jar

同時,服務對應的PID會放在/var/run/myApp/myApp.pid,而程序運行的日誌則放在/var/log/your-app.log。

2.2.2 Systemd服務

Systemd服務的目錄在/etc/systemd/system/,我們需要在此目錄下創建一個名叫myApp.service的文件,並將如下內容寫入文件:

[Unit]
Description=My Spring Boot Service
After=syslog.target
 
[Service]
User=nightfield
ExecStart=/home/nightfield/myApp.jar SuccessExitStatus=143 
 
[Install] 
WantedBy=multi-user.target

這裏要把ExecStartDescriptino改成自己的,把ExecStart指定到jar所在的目錄,一樣,也需要文件的絕對路徑。同時別忘了設置myApp.service的執行權限。
服務啓動命令爲:

sudo systemctl start myApp

將服務設置爲開機啓動:

sudo systemctl enable myApp

Systemd作爲後起之秀,功能更加強大,支持的命令和參數也更多,具體可以參考這裏

3 自定義JVM參數

如果是用java -jar的方式啓動的java應用,我們可以直接在命令行中指定JVM參數,那以Service形式啓動的Java程序,該如何指定JVM參數呢?
一般,我們在用mavenjar包的時候,可以指定JVM參數,比如用如下方式:

mvn clean package -DargLine="-Xmx1024m" 

但是如果我們希望在服務器上獨立額外設置一些參數呢?
其實也很簡單,在啓動SpringBoot服務之前,會先去jar包所在的同級目錄下查找,有沒有此jar同名配置文件。在這裏,我們只需要在/home/nightfield/目錄下,添加一個叫myApp.conf的配置文件(名字要和jar的名字相同),在文件裏面自定義JVM參數JAVA_OPTS

[nightfield@mthf2mulsvr001 ~]$ pwd
/home/nightfield
[nightfield@mthf2mulsvr001 ~]$ ls -l
total 27532
-rwx------. 1 nightfield nightfield       39 Mar  5 14:10 myApp.conf
-rwx------. 1 nightfield nightfield 28186505 Mar  5 13:12 myApp.jar
[nightfield@mthf2mulsvr001 ~]$ cat myApp.conf 
export JAVA_OPTS="-Xmx4096m -Xms4096m"
[nightfield@mthf2mulsvr001 ~]$ 

添加配置文件之後,重啓服務,再次查看服務進程:

[nightfield@mthf2mulsvr001 bin]$ ps -ef | grep myApp
nightfi+ 11343     1  0 14:13 ?        00:00:00 /bin/bash /homt/nightfield/myApp.jar
nightfi+ 11358 11343 48 14:13 ?        00:00:38 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Xmx4096m -Xms4096m -jar /homt/nightfield/myApp.jar
nightfi+ 11908 11884  0 14:14 pts/0    00:00:00 grep --color=auto myApp

可以看到,Java進程的啓動參數上多了“-Xmx4096m -Xms4096m”。

4 總結

本文介紹了將SpringBootLinux下作爲服務啓動的兩種方式,同時介紹了自定義JVM啓動參數的方法。

5 參考

Spring Boot Application as a Service
Deploying Spring Boot Applications

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章