子模块应该有独立的版本号
SpringBoot父子工程中,每个子模块都是一个微服务,子模块应该有独立的版本号吗?
在SpringBoot的父子工程架构中,每个子模块通常代表一个逻辑上独立的组件或服务,尤其是当这些子模块被设计为微服务时。对于是否应该给每个子模块分配独立的版本号,这取决于你的项目管理和部署策略。
建议做法:
-
独立版本管理:如果每个子模块(微服务)都是完全独立开发、部署和维护的,那么为每个子模块分配独立的版本号是有益的。这样做可以让每个微服务的更新和回滚更加灵活,便于追踪每个服务的变更历史和依赖关系,同时也符合微服务架构的理念——服务的自治性。
-
依赖管理和协调:虽然子模块可以有独立版本,但父工程的POM.xml可以用来管理这些子模块间的共享依赖版本,确保整个项目中使用的依赖版本一致,减少版本冲突。例如,你可以在父POM中定义
<properties>
标签来集中管理版本号,子模块引用这些属性即可。 -
持续集成/持续部署(CI/CD):在实施持续集成和持续部署流程时,为每个微服务分配独立版本号有助于自动化流程中识别和部署特定版本的服务,提高部署的精确度和效率。
-
文档与沟通:独立的版本号也便于团队成员之间的沟通以及对外部团队或客户的说明,清晰地表明每个服务的更新内容和兼容性。
因此,尽管父工程提供了一个统一的管理层面,子模块根据其独立性和部署需求,采用独立的版本号管理策略是推荐的做法。
启动脚本动态获取最新的jar包版本
jar包带版本号后,启动脚本应该怎么写?是要每次都修改启动脚本中的版本号吗?
为了避免每次更新jar包版本时都需要手动修改启动脚本,你可以采取一些动态的方式引用jar包,这样就无需手动更改启动脚本中的版本号
了。下面是一个示例脚本,展示了如何动态地获取最新的jar包版本并启动它:
#!/bin/bash
# 设置基础变量
APP_NAME="your-app-name" # 应用名称
APP_HOME="/path/to/your/app/home" # 应用主目录
JAVA_HOME="/path/to/java/home" # Java 安装路径
# 动态获取最新jar包(假设jar包命名规则包含版本号,如app-1.2.3.jar)
LATEST_JAR=$(ls ${APP_HOME}/${APP_NAME}-*.jar | sort -t '.' -k 2,2n -k 3,3n -k 4,4n | tail -n 1)
# 设置Java启动参数
JAVA_OPTS="-Xms256m -Xmx512m -Dspring.profiles.active=prod"
# 输出将要启动的jar包信息
echo "Starting $APP_NAME with $LATEST_JAR"
# 执行启动命令
nohup ${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar ${LATEST_JAR} > /dev/null 2>&1 &
# 输出进程ID以便跟踪
echo "$! is the pid of $APP_NAME"
这个脚本做了以下几件事:
- 动态查找最新版本jar包:使用
ls
命令配合正则表达式找到所有符合模式(如your-app-name-*.jar
)的jar包,然后通过sort
命令按版本号排序(这里假设版本号格式为x.y.z),最后取最高版本(tail -n 1
)。 - 配置Java选项:可以根据需要调整
JAVA_OPTS
以适应不同环境和性能需求。 - 无挂断启动:使用
nohup
命令后台启动应用,并重定向输出,避免因终端关闭而停止服务。 - 输出PID:启动后输出进程ID,便于后续监控和管理。
这样设置后,当你更新jar包版本并放入应用目录时,脚本会自动找到并启动最新版本,无需手动调整脚本内容。