Преглед изворни кода

更新 agent 模块, 添加 ImageCleanTask 任务定时扫描 docker 镜像和容器

reghao пре 1 година
родитељ
комит
bf2593c0be

+ 12 - 2
agent/src/main/java/cn/reghao/bnt/agent/AgentApp.java

@@ -6,14 +6,18 @@ import ch.qos.logback.classic.LoggerContext;
 import cn.reghao.bnt.agent.event.ws.WsClient;
 import cn.reghao.bnt.agent.config.ConfigFile;
 import cn.reghao.bnt.agent.config.DagentConfig;
+import cn.reghao.bnt.agent.task.ImageCleanTask;
 import cn.reghao.bnt.common.agent.app.iface.AppDeploy;
 import cn.reghao.bnt.common.agent.app.iface.AppStat;
 import cn.reghao.bnt.common.agent.app.iface.impl.AppDeployService;
 import cn.reghao.bnt.common.agent.app.iface.impl.AppStatService;
 import cn.reghao.bnt.common.agent.app.iface.impl.DockerApp;
+import cn.reghao.bnt.common.docker.Docker;
+import cn.reghao.bnt.common.docker.DockerImpl;
 import cn.reghao.bnt.common.msg.MessageSender;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
 import cn.reghao.jutil.jdk.string.StringRegexp;
+import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
 import cn.reghao.jutil.jdk.util.SingleInstance;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.LoggerFactory;
@@ -24,10 +28,14 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.nio.charset.StandardCharsets;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 public class AgentApp {
 	static MessageSender messageSender;
+	static ScheduledExecutorService scheduler = ThreadPoolWrapper.scheduledThreadPool("heartbeat", 5);
+	static Docker docker = new DockerImpl();
 
 	static void setLogLevel() {
 		LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
@@ -57,12 +65,12 @@ public class AgentApp {
 	}
 
 	static MessageSender getMessageSender(DagentConfig dagentConfig) {
-		DockerApp dockerApp = new DockerApp();
+		DockerApp dockerApp = new DockerApp(docker);
 		AppDeploy appDeploy = new AppDeployService(dockerApp);
 		AppStat appStat = new AppStatService(dockerApp);
 
 		if (tryConnect(dagentConfig.getManagerAddress(), dagentConfig.getManagerPort())) {
-			messageSender = new WsClient(dagentConfig, appDeploy, appStat);
+			messageSender = new WsClient(dagentConfig, scheduler, appDeploy, appStat);
 			return messageSender;
 		}
 
@@ -98,6 +106,8 @@ public class AgentApp {
 			messageSender.connect();
 		}
 
+		ImageCleanTask cleanTask = new ImageCleanTask(docker);
+		scheduler.scheduleAtFixedRate(cleanTask, 1, 12, TimeUnit.HOURS);
 		shutdownGracefully();
 		SingleInstance.onlyOne(60001);
 	}

+ 8 - 7
agent/src/main/java/cn/reghao/bnt/agent/event/ws/WsClient.java

@@ -11,6 +11,7 @@ import cn.reghao.jutil.jdk.serializer.JdkSerializer;
 import okhttp3.*;
 import okio.ByteString;
 
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -25,15 +26,15 @@ public class WsClient implements MessageSender {
     private boolean retry;
     private int retryCount;
 
-    public WsClient(DagentConfig dagentConfig, AppDeploy appDeploy, AppStat appStat) {
+    public WsClient(DagentConfig dagentConfig, ScheduledExecutorService scheduler, AppDeploy appDeploy, AppStat appStat) {
         String host = dagentConfig.getManagerAddress();
         int port = dagentConfig.getManagerPort();
         this.url = String.format("ws://%s:%s/ws/agent?token=%s", host, port, Machine.ID);
 
         EventCenter eventCenter = new EventCenter(this, appDeploy, appStat);
-        // 每 10s 发送一次心跳
-        int heartbeatInterval = 10;
-        MachineEvent machineEvent = new MachineEvent(this, new Machine(), heartbeatInterval);
+        // 每 60s 发送一次心跳
+        int heartbeatInterval = 60;
+        MachineEvent machineEvent = new MachineEvent(this, new Machine(), scheduler, heartbeatInterval);
         this.webSocketListener = new WebSocketListenerImpl(this, eventCenter, machineEvent);
         this.retry = true;
         this.retryCount = 0;
@@ -67,9 +68,9 @@ public class WsClient implements MessageSender {
                 .build();
 
         OkHttpClient okHttpClient = new OkHttpClient.Builder()
-                .connectTimeout(30, TimeUnit.SECONDS)
-                .readTimeout(30, TimeUnit.SECONDS)
-                .writeTimeout(30, TimeUnit.SECONDS)
+                .connectTimeout(60, TimeUnit.SECONDS)
+                .readTimeout(60, TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
                 .build();
         this.webSocket = okHttpClient.newWebSocket(request, webSocketListener);
     }

+ 36 - 0
agent/src/main/java/cn/reghao/bnt/agent/task/ImageCleanTask.java

@@ -0,0 +1,36 @@
+package cn.reghao.bnt.agent.task;
+
+import cn.reghao.bnt.common.docker.Docker;
+import cn.reghao.bnt.common.docker.po.ContainerInfo;
+import cn.reghao.bnt.common.docker.po.ImageInfo;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2024-07-29 16:17:47
+ */
+@Slf4j
+public class ImageCleanTask implements Runnable {
+    private final Docker docker;
+
+    public ImageCleanTask(Docker docker) {
+        this.docker = docker;
+    }
+
+    @Override
+    public void run() {
+        Map<String, ImageInfo> map = docker.images().stream().collect(Collectors.toMap(ImageInfo::getImageId, info -> info));
+        List<ContainerInfo> containerInfos = docker.psAll();
+        for (ContainerInfo containerInfo : containerInfos) {
+            String imageId = containerInfo.getImageId();
+            ImageInfo imageInfo = map.remove(imageId);
+        }
+
+        //map.keySet().forEach(docker::imageRm);
+        log.info("定时扫描 docker 镜像和容器");
+    }
+}

+ 2 - 2
common/src/main/java/cn/reghao/bnt/common/agent/app/iface/impl/DockerApp.java

@@ -24,8 +24,8 @@ import java.util.Map;
 public class DockerApp {
     private Map<String, Docker> map = new HashMap<>();
 
-    public DockerApp() {
-        this.map.put("noAuth", new DockerImpl());
+    public DockerApp(Docker docker) {
+        this.map.put("noAuth", docker);
     }
 
     public EvtAppStatResult deploy(EvtAppDeploy deployParam) throws Exception {

+ 2 - 2
common/src/main/java/cn/reghao/bnt/common/agent/machine/MachineEvent.java

@@ -26,8 +26,8 @@ public class MachineEvent {
     private final MessageSender messageSender;
     private final int heartbeatInterval;
     
-    public MachineEvent(MessageSender messageSender, Machine machine, int heartbeatInterval) {
-        this.scheduler = ThreadPoolWrapper.scheduledThreadPool("heartbeat", 1);
+    public MachineEvent(MessageSender messageSender, Machine machine, ScheduledExecutorService scheduler, int heartbeatInterval) {
+        this.scheduler = scheduler;
         this.machine = machine;
         this.messageSender = messageSender;
         this.heartbeatInterval = heartbeatInterval;