微服務架構基礎之輕量級部署

noONE發表於2018-09-03

在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>
複製程式碼

打包:

jar

在每個模組的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:

me

相關文章