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

1 概述

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

2 步驟

2.1 Maven打包

經過package命令打jar包:java

mvn clean package

這裏注意一點,必定要將org.springframework.boot plugin添加到pom文件裏面,其中「<executable>true</executable>」必定要加,標示該jar爲可執行,不然機器啓動SpringBoot服務會報錯。plugin以下所示:spring

<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)的權限,不然服務沒法啓動。shell

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

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

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的絕對路徑。 而後,咱們就能夠經過以下命令來啓動服務了:app

sudo service myApp start

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

[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用戶跑在後臺,其實服務只是如下命令的包裝:spring-boot

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

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

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

相關文章
相關標籤/搜索