在J2EE開發中,通常將應用部署到Tomcat或者Jetty等Servlet容器中。而在SpringBoot中則提供了更加輕量級的方案,就是將應用打包成內嵌Servlet容器的jar包,可以直接通過java -jar app.jar
命令執行。因為在微服務架構中,會涉及大量服務的部署,這種輕量級方案無疑會簡化部署,並且極大提高微服務的部署效率。
1 可執行的jar包
make Jar, not War
-- Josh Long
將應用打包成*.jar包,需要使用SpringBoot的maven外掛:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
複製程式碼
直接使用mvn package
命令進行打包,此時,得到的jar包,我們可以通過java -jar app.jar
命令執行。
在Linux系統中,我們還可以進一步打成可執行的jar包,可以直接通過./app.jar
命令直接執行,只要只要配置maven外掛:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
複製程式碼
打包:
在每個模組的target
目錄下,生成可行執行的jar包。
2 部署
對於SpringBoot應用打成的jar包,可以方便的進行部署,很多Paas平臺都是支援的,這裡還是用一臺Linux虛擬機器進行部署,Ubuntu16 64位系統,並且只要安裝好JDK1.8即可。
將打包好的jar包,比如上圖中的user-service/target/user-service-1.0-SNAPSHOT.jar
,上傳到伺服器的opt/app
目錄,執行:
./user-service-1.0-SNAPSHOT.jar
複製程式碼
這種執行比較簡單,同時,也會缺乏對應用程式的控制。為了更好的控制應用程式的程式,方便啟動,重新,停機等操作,可以使用程式的管理工具。
3 管理應用程式
可以使用supervisor
等第三方工具,不過,SpringBoot更加推薦整合到系統自帶的init.d
或者systemd
中。Ubuntu16已經支援systemd
,所以,我們將應用整合到systemd
中。
建立配置/etc/systemd/system/user.service
[Unit]
Description=user service
After=syslog.target
[Service]
User=noone
ExecStart=/opt/app/user-service-1.0-SNAPSHOT.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
複製程式碼
使用systemd啟動:
sudo systemctl daemon-reload
sudo systemctl start user.service
複製程式碼
首先重新整理一下配置,然後啟動服務。對於配置檔案發生的更改,需要使用此命令。
啟動完成後,使用命令檢視服務狀態:
noone@ubuntu:/opt/app$ sudo systemctl status user.service
● user.service - user service
Loaded: loaded (/etc/systemd/system/user.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2018-09-01 18:38:14 PDT; 6min ago
Main PID: 10819 (user-service-1.)
CGroup: /system.slice/user.service
├─10819 /bin/bash /opt/app/user-service-1.0-SNAPSHOT.jar
└─10833 /usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /opt/app/user-service-1.0-SNAPSHOT.jar
複製程式碼
停止服務:
noone@ubuntu:/opt/app$ sudo systemctl stop user.service
noone@ubuntu:/opt/app$ sudo systemctl status user.service
● user.service - user service
Loaded: loaded (/etc/systemd/system/user.service; disabled; vendor preset: enabled)
Active: inactive (dead)
複製程式碼
也可以將該服務設定開機啟動,如果出現伺服器重啟,那應用可以自動重啟。
sudo systemctl enable user.service
複製程式碼
4 設定應用啟動引數
對於Java應用,通常都需要設定一些JVM引數,特別是堆疊空間大小等引數。SpringBoot也支援設定引數,我們只需要遵循約定進行配置即可。
在服務的同目錄下,新增配置檔案user-service-1.0-SNAPSHOT.conf
,注意配置檔名要和服務保持一致,如下:
noone@ubuntu:/opt/app$ tree
.
├── user-service-1.0-SNAPSHOT.conf
└── user-service-1.0-SNAPSHOT.jar
複製程式碼
配置檔案內容:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
複製程式碼
5 小結
使用基於jar包的部署方式更加簡單,很多Pass平臺也都是支援這種方式。同時,如果在公司內部的部署平臺整合,這種方式也比較簡單。進一步,如果使用Docker或者K8等技術,這種部署方案也可以很容易整合。所以,在微服務架構中,輕量級的部署方案,可以讓服務的釋出更加高效。
更多精彩內容,關注公眾號SeniorEngineer: