在J2EE開發中,一般將應用部署到Tomcat或者Jetty等Servlet容器中。而在SpringBoot中則提供了更加輕量級的方案,就是將應用打包成內嵌Servlet容器的jar包,能夠直接經過java -jar app.jar
命令運行。由於在微服務架構中,會涉及大量服務的部署,這種輕量級方案無疑會簡化部署,而且極大提升微服務的部署效率。java
make Jar, not Warspring
-- Josh Longubuntu
將應用打包成*.jar包,須要使用SpringBoot的maven插件:bash
<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>
複製代碼
打包:app
在每一個模塊的target
目錄下,生成可行執行的jar包。maven
對於SpringBoot應用打成的jar包,能夠方便的進行部署,不少Paas平臺都是支持的,這裏仍是用一臺Linux虛擬機進行部署,Ubuntu16 64位系統,而且只要安裝好JDK1.8便可。spring-boot
將打包好的jar包,好比上圖中的user-service/target/user-service-1.0-SNAPSHOT.jar
,上傳到服務器的opt/app
目錄,運行:微服務
./user-service-1.0-SNAPSHOT.jar
複製代碼
這種運行比較簡單,同時,也會缺少對應用進程的控制。爲了更好的控制應用程序的進程,方便啓動,從新,停機等操做,可使用進程的管理工具。
可使用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
複製代碼
對於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"
複製代碼
使用基於jar包的部署方式更加簡單,不少Pass平臺也都是支持這種方式。同時,若是在公司內部的部署平臺集成,這種方式也比較簡單。進一步,若是使用Docker或者K8等技術,這種部署方案也能夠很容易集成。因此,在微服務架構中,輕量級的部署方案,可讓服務的發佈更加高效。
更多精彩內容,關注公衆號SeniorEngineer: