Spring Boot 打包與部署
1. 前言
項(xiàng)目開發(fā)完畢后,免不了將前后端應(yīng)用打包,然后部署到生產(chǎn)服務(wù)器上運(yùn)行。本篇就演示一個(gè)標(biāo)準(zhǔn)的打包、部署過程。
2. 操作流程
我們以上一篇開發(fā)的前后端分離項(xiàng)目 spring-boot-cors
為例進(jìn)行打包、部署演示,步驟如下:
2.1 服務(wù)器運(yùn)行環(huán)境安裝
一般服務(wù)器采用 Linux 或者 Windows Server 系統(tǒng),相對(duì)而言 Linux 系統(tǒng)更加穩(wěn)定安全。實(shí)際上 Windows Server 系統(tǒng)對(duì)于一般應(yīng)用來說也足夠了,本篇我們使用 Windows Server 系統(tǒng)進(jìn)行演示。
推薦使用云服務(wù)器,更加穩(wěn)定且易于維護(hù),國(guó)內(nèi)廠商阿里云、華為云都還不錯(cuò)。
Tips: 云服務(wù)器的硬盤讀寫性能非常重要,在購(gòu)買云服務(wù)器時(shí)務(wù)必關(guān)注下云硬盤的 IOPS 值(衡量硬盤讀寫性能的一個(gè)指標(biāo)),一般建議要采用 IOPS > 3800 的云磁盤。
具備云服務(wù)器后,需要安裝 JDK 以便運(yùn)行 Spring Boot 應(yīng)用。由于 nginx 對(duì)靜態(tài)資源的負(fù)載能力非常強(qiáng)悍,所以我們將前端應(yīng)用部署到 nginx 上。
2.2 Spring Boot 打包為 jar 并運(yùn)行
Spring Boot 應(yīng)用可以打包為 war 或者 jar ,官方和我個(gè)人都是推薦打 jar 包。可以直接運(yùn)行,無需部署到 Web 服務(wù)器上。
打開命令行工具,進(jìn)入 spring-boot-cors
項(xiàng)目目錄后運(yùn)行 mvn clean package -Dmaven.test.skip=true
命令,即可快速打包 Spring Boot 應(yīng)用。下圖中的 jar 文件,即為打包后的 Spring Boot 應(yīng)用。
接下來我們將該應(yīng)用拷貝至服務(wù)器,在同一目錄下新建 start.bat 文件,內(nèi)容如下:
java -jar spring-boot-cors-0.0.1-SNAPSHOT.jar
雙擊 start.bat 文件即可啟動(dòng)項(xiàng)目,效果如下,可以看出系統(tǒng)已經(jīng)啟動(dòng)成功(started)。
2.3 Spring Boot 打包為 war 并運(yùn)行
也可以選擇將 Spring Boot 打包為 war ,然后放置于 Tomcat 的 webapps 目錄下加載運(yùn)行,接下來我們就詳細(xì)描述下打包為 war 的過程。
首先,在 pom.xml 文件中修改默認(rèn)的打包方式,顯式指定打包方式為 war 。
<groupId>com.imooc</groupId>
<artifactId>spring-boot-cors</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-cors</name>
<description>Demo project for Spring Boot</description>
<packaging>war</packaging>
然后,由于 Spring Boot 內(nèi)置了 Tomcat ,所以我們?cè)诖虬鼤r(shí)需要排除內(nèi)置的 Tomcat ,這樣可以避免內(nèi)置 Tomcat 和 war 包部署運(yùn)行的 Tomcat 產(chǎn)生沖突。在 pom.xml 中添加如下依賴即可:
<!--打war包時(shí)排除內(nèi)置的tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
再然后,還需要繼承 SpringBootServletInitializer 類并重寫 configure 方法,這是為了告訴 Tomcat 當(dāng)前應(yīng)用的入口在哪。
@SpringBootApplication
public class SpringBootCorsApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringBootCorsApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringBootCorsApplication.class, args);
}
}
最后,即可同樣使用 mvn clean package -Dmaven.test.skip=true
命令打包應(yīng)用了,運(yùn)行命令后會(huì)在 target 目錄下生成 war 文件,將該文件放置于 Tomcat 的 webapps 目錄下運(yùn)行即可。
2.4 前端應(yīng)用部署
前端應(yīng)用的部署更加簡(jiǎn)單,我們直接在云服務(wù)器上下載 nginx 然后解壓。
打開網(wǎng)址 http://nginx.org/en/download.html
,點(diǎn)擊下圖中的鏈接下載即可。
下載解壓后,將前端頁面直接放到 nginx/html 目錄下即可。當(dāng)然如果有很多網(wǎng)頁,可以先在該目錄下建立子目錄便于歸類網(wǎng)頁。
我們建立 shop-front 目錄(表示商城系統(tǒng)的前端項(xiàng)目),然后將網(wǎng)頁放入其中,效果如下:
注意還需要修改 goods.html
中訪問的后端 URL 地址,假設(shè)云服務(wù)器的公網(wǎng) IP 為 x.x.x.x
,則修改為:
實(shí)例:
$.ajax({
type: "GET",
url: "http://x.x.x.x:8080/goods", //后端接口地址
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (res) {
$.each(res, function (i, v) {
row = "<tr>";
row += "<td>" + v.id + "</td>";
row += "<td>" + v.name + "</td>";
row += "<td>" + v.price + "</td>";
row += "<td>" + v.pic + "</td>";
row += "</tr>";
$("#goodsTable").append(row);
});
},
error: function (err) {
console.log(err);
}
});
此處解釋下后端地址 http://x.x.x.x:8080/goods
, HTTP 代表協(xié)議, x.x.x.x 代表云服務(wù)器公網(wǎng)地址, 8080 是我們后端項(xiàng)目的啟動(dòng)端口,由于我們沒有在配置文件中設(shè)置,所以默認(rèn)就是 8080 ,最后 goods 是控制器中設(shè)定的后端接口路徑。
雙擊 nginx.exe 啟動(dòng) nginx ,由于 nginx 默認(rèn)啟動(dòng)端口是 80 ,所以此時(shí)訪問 http://x.x.x.x
,效果如下,說明 nginx 啟動(dòng)成功!
2.5 測(cè)試
現(xiàn)在我們的后端 Spring Boot 應(yīng)用已啟動(dòng),前端項(xiàng)目也通過 nginx 啟動(dòng)起來。
我們?cè)跒g覽器地址欄打開 http://x.x.x.x/shop-front/goods.html
,效果如下,說明我們的項(xiàng)目全部部署成功。
3. 視頻演示
4. 小結(jié)
前后端分離部署的方式,更能發(fā)揮服務(wù)器的性能,如果要進(jìn)行版本升級(jí),直接替換后端 jar 或者前端項(xiàng)目文件夾即可,輕松愉快。