OCT REM: 1. 增加中间件部署异步执行支持

2. 增加OSS分布式存储依赖
This commit is contained in:
HuangXin 2025-02-20 14:44:07 +08:00
parent 328e6f3dd7
commit 25fdb7311f
5 changed files with 105 additions and 12 deletions

View File

@ -135,6 +135,11 @@
<artifactId>httpclient5</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>com.cmcc.hy</groupId>
<artifactId>gzs-common-oss</artifactId>
<version>0.1.6-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -236,6 +241,10 @@
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>com.cmcc.hy</groupId>
<artifactId>gzs-common-oss</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>mockwebserver</artifactId>

View File

@ -114,6 +114,14 @@ public class CommonConfigure {
*/
private String dataRootDirectory;
/**
* 中间件部署任务执行模式
* <p>
* 是否异步部署中间件接收到部署任务后尽快返回
* </p>
*/
private boolean asyncDeployment;
/**
* 设置全局静态变量的值
*

View File

@ -25,6 +25,7 @@ import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;
/**
@ -52,6 +53,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
@Resource
private CommonConfigure commonConfigure;
/**
* 根据命令获取对应的文件名
*
* @param cmd 中间件管理命令
* @return 对应的文件名
*/
private String getFilenameForCommand(MiddlewareManagerCommand cmd) {
return switch (cmd) {
case COMMAND_DEPLOYMENT -> DEPLOYMENT_FILENAME;
@ -64,6 +71,14 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
};
}
/**
* 将命令写入 Shell 脚本文件
*
* @param workDir 工作目录
* @param cmd 中间件管理命令
* @param command 命令内容
* @return 返回一个 MulReturnType 对象,其中包含写入结果的错误码和文件名
*/
private MulReturnType<ErrorCode, String> writeCommandToShellScript(String workDir, MiddlewareManagerCommand cmd, String command) {
String filename = getFilenameForCommand(cmd);
try {
@ -79,6 +94,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
}
}
/**
* 创建工作目录
*
* @param workDir 工作目录路径
* @return 如果创建成功, 返回 true;否则返回 false
*/
private boolean createWorkDirectory(String workDir) {
Path path = Paths.get(workDir);
if (!Files.exists(path)) {
@ -91,6 +112,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return true;
}
/**
* 处理命令参数,并更新 MiddlewareData 对象
*
* @param data 要更新的 MiddlewareData 对象
* @param command 命令参数映射
*/
private void processCommands(MiddlewareData data, Map<MiddlewareManagerCommand, String> command) {
command.forEach((cmd, param) -> {
switch (cmd) {
@ -119,6 +146,13 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
});
}
/**
* 保存命令到 Shell 脚本文件
*
* @param workDir 工作目录
* @param command 命令参数映射
* @return 返回一个 MulReturnType 对象,其中包含保存结果的错误码和文件名
*/
private MulReturnType<ErrorCode, String> saveCommands(String workDir, Map<MiddlewareManagerCommand, String> command) {
AtomicReference<ErrorCode> errorCode = new AtomicReference<>(ErrorCode.ERR_OK);
AtomicReference<String> filename = new AtomicReference<>("");
@ -133,11 +167,18 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return new MulReturnType<>(errorCode.get(), filename.get());
}
/**
* 下载并校验配置文件
*
* @param workDir 工作目录
* @param configFiles 配置文件列表
* @return 返回一个 MulReturnType 对象,其中包含下载和校验结果的错误码和相关信息
*/
private MulReturnType<ErrorCode, String> downloadAndValidateConfigFiles(String workDir, List<RemoteFileDetails> configFiles) {
for (RemoteFileDetails file : configFiles) {
try {
String saveName = Paths.get(workDir + File.separator + file.getFileName()).toString();
FileDownloader dl = new FileDownloader(file.getUrl(), saveName, new FileDownloader.SimpleDownloadCallback() {
String saveName = Paths.get(workDir + File.separator + file.getFileName()).toString();
FileDownloader dl = new FileDownloader(file.getUrl(), saveName, new FileDownloader.SimpleDownloadCallback() {
@Override
public void onStart(String url) {
}
@ -163,13 +204,19 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return new MulReturnType<>(ErrorCode.ERR_OK, "");
}
/**
* 执行命令
*
* @param workDir 工作目录
* @param command 命令参数映射
*/
private void runCommand(String workDir, Map<MiddlewareManagerCommand, String> command) {
TreeMap<MiddlewareManagerCommand, String> sorted = new TreeMap<>(command);
for (MiddlewareManagerCommand cmd : sorted.keySet()) {
String filename = getFilenameForCommand(cmd);
List<String> ret = ExecutingCommand.runNative("/bin/bash", workDir + File.separator + filename);
log.info("Run {} Command: {}", MiddlewareManagerCommand.COMMAND_DEPLOYMENT.getStringValue(), ret);
log.info("Run {} Command: {}", MiddlewareManagerCommand.COMMAND_DEPLOYMENT.getEnumString(), ret);
}
}
@ -208,17 +255,37 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return new MulReturnType<>(ErrorCode.ERR_SYSTEMEXCEPTION, "");
}
err = saveCommands(workDir, command);
if (err.getFirstParam() != ErrorCode.ERR_OK) {
return err;
}
err = downloadAndValidateConfigFiles(workDir, configFiles);
if (err.getFirstParam() != ErrorCode.ERR_OK) {
return err;
}
if (!commonConfigure.isAsyncDeployment()) {
err = saveCommands(workDir, command);
if (err.getFirstParam() != ErrorCode.ERR_OK) {
return err;
}
runCommand(workDir, command);
err = downloadAndValidateConfigFiles(workDir, configFiles);
if (err.getFirstParam() != ErrorCode.ERR_OK) {
return err;
}
runCommand(workDir, command);
} else {
CompletableFuture.runAsync(() -> {
log.info("++++ Task {} Start Running...", data.getUid());
MulReturnType<ErrorCode, String> error = saveCommands(workDir, command);
if (error.getFirstParam() != ErrorCode.ERR_OK) {
log.error("---- Finish Task {} Because Of Save Command Error: {}", data.getUid(), error.getSecondParam());
return;
}
error = downloadAndValidateConfigFiles(workDir, configFiles);
if (error.getFirstParam() != ErrorCode.ERR_OK) {
log.error("---- Finish Task {} Because Of Download Config File Error: {}", data.getUid(), error.getSecondParam());
return;
}
runCommand(workDir, command);
log.info("---- Task {} Finished", data.getUid());
});
}
return new MulReturnType<>(ErrorCode.ERR_OK, data.getUid());
}

View File

@ -28,6 +28,14 @@ spring.jackson.deserialization.fail-on-unknown-properties=false
# Swagger-UI Custom Path
springdoc.swagger-ui.path=/swagger-ui.html
# OSS Configuration
#gzs.common.oss.enabled=true
gzs.common.oss.config.default.accessKey=accessKey
gzs.common.oss.config.default.secretKey=secretKey
gzs.common.oss.config.default.endpoint=endpoint
gzs.common.oss.config.default.accessUrl=accessUrl
gzs.common.oss.config.default.bucketName=bucketName
# common :
common.token-expired-of-seconds=600
common.allow-passwd-retry-times=3
@ -35,6 +43,7 @@ common.show-sql-command=false
common.res-sampling-msencond=10000
common.locale=zh_CN
common.data-root-directory=/opt/middleware-agent/data
common.async-deployment=true
# protocol:
protocol.check-timestamp=true

Binary file not shown.