一鍵搞定!為 Spring Boot 服務(wù)配置通用腳本,提升運(yùn)維效率
在日常開發(fā)和運(yùn)維工作中,我們常常會接觸到各種優(yōu)秀的開源 Java 項(xiàng)目,如 Kafka、Flink、RocketMQ、StreamPark 等。這些項(xiàng)目在服務(wù)部署時(shí),通常都會在根目錄下提供 bin 目錄用于存放啟動和關(guān)閉腳本,以及 conf 目錄用于管理配置文件。這種目錄結(jié)構(gòu)不僅方便了運(yùn)維管理,也極大提升了服務(wù)的可維護(hù)性和靈活性。
然而,當(dāng)我們使用 Spring Boot 框架開發(fā)服務(wù)時(shí),默認(rèn)的項(xiàng)目結(jié)構(gòu)并不會包含 bin 和 conf 目錄,而是將所有配置文件打包到 jar 內(nèi)部。這種方式雖然簡化了項(xiàng)目的構(gòu)建流程,但也帶來了不便:
- 運(yùn)維管理不便每次修改配置都需要重新打包并部署,導(dǎo)致運(yùn)維成本上升。
- 缺乏標(biāo)準(zhǔn)化無法像其他開源項(xiàng)目一樣,直接通過腳本進(jìn)行服務(wù)的啟動、停止等管理操作。
- 不利于配置靈活性所有配置都在 jar 內(nèi)部,手動修改較為困難,無法在不同環(huán)境間快速切換。
針對這些問題,我們可以通過 maven-assembly-plugin 插件為 Spring Boot 3.4 項(xiàng)目引入 bin和 conf 目錄,從而實(shí)現(xiàn)與優(yōu)秀開源項(xiàng)目類似的部署管理方式,提高運(yùn)維效率。本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中實(shí)現(xiàn)這一方案。
Spring Boot 目錄優(yōu)化
在 Spring Boot 項(xiàng)目中,應(yīng)用的配置文件通常會被打包到 JAR 內(nèi)部,這導(dǎo)致修改配置文件時(shí)需要重新構(gòu)建項(xiàng)目或依賴配置中心。然而,在某些情況下,我們更希望像傳統(tǒng) Java Web 應(yīng)用一樣,直接修改外部的 conf 配置文件,從而減少運(yùn)維成本。
為此,我們可以采取以下措施:
- 在項(xiàng)目根目錄下創(chuàng)建 distribution 子模塊。
- 配置 maven-assembly-plugin 插件,實(shí)現(xiàn)服務(wù)的完整打包。
- 在 distribution 目錄下創(chuàng)建 bin 目錄,存放啟動和停止腳本。
- 在 distribution 目錄下創(chuàng)建 conf 目錄,存放外部配置文件。
Maven 配置
創(chuàng)建 distribution 子模塊
首先,在 pom.xml 文件中添加 distribution 子模塊,并引入 maven-assembly-plugin 插件。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.icoderoad</groupId>
<artifactId>springboot-service</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-distribution</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<tarLongFileMode>posix</tarLongFileMode>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>install</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
assembly.xml 配置
在 distribution 目錄下創(chuàng)建 assembly.xml,定義 bin 和 conf 目錄的打包規(guī)則。
<assembly>
<id>${project.version}</id>
<includeBaseDirectory>true</includeBaseDirectory>
<formats>
<format>dir</format>
<format>tar.gz</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<includes>
<include>conf/**</include>
</includes>
</fileSet>
<fileSet>
<includes>
<include>bin/*</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
</assembly>
bin 目錄與腳本
在 distribution 目錄下創(chuàng)建 bin 目錄,并添加以下四個(gè)腳本文件:
- shutdown.cmd
- shutdown.sh
- startup.cmd
- startup.sh
shutdown.sh(Linux/macOS)
#!/bin/bash
cd`dirname $0`/../target
target_dir=`pwd`
pid=`ps ax | grep -i 'springboot-service' | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'`
if[-z"$pid"];then
echo"No running springboot-service found."
exit -1;
fi
echo"Stopping springboot-service (PID: ${pid})..."
kill${pid}
echo"Shutdown completed."
startup.sh(Linux/macOS)
#!/bin/bash
cd `dirname $0`/../target
java -jar springboot-service.jar > /dev/null 2>&1 &
echo "Spring Boot service started!"
shutdown.cmd(Windows)
@echo off
setlocal
echo Stopping springboot-service...
taskkill /F /IM java.exe
startup.cmd(Windows)
@echo off
setlocal
echo Starting springboot-service...
start java -jar springboot-service.jar
結(jié)論
通過本文的方法,我們可以輕松為 Spring Boot 3.4 項(xiàng)目添加 bin 目錄和 conf 目錄,實(shí)現(xiàn)標(biāo)準(zhǔn)化的運(yùn)維管理。主要優(yōu)勢包括:
- 提升運(yùn)維效率通過腳本一鍵啟動、停止服務(wù),無需手動輸入繁瑣的命令。
- 增強(qiáng)配置靈活性支持外部 conf 目錄存放配置文件,避免每次修改配置都要重新打包。
- 提高可維護(hù)性項(xiàng)目結(jié)構(gòu)更清晰,符合主流開源項(xiàng)目的標(biāo)準(zhǔn),方便團(tuán)隊(duì)協(xié)作與維護(hù)。
在實(shí)際開發(fā)中,我們可以根據(jù)具體業(yè)務(wù)需求,進(jìn)一步擴(kuò)展 bin 目錄下的腳本,例如添加日志管理、自動重啟等功能,使 Spring Boot 項(xiàng)目更加高效、易用。如果你希望你的 Spring Boot 項(xiàng)目像 Kafka、RocketMQ 一樣具備高效的運(yùn)維能力,不妨嘗試本文介紹的方案!