Pārlūkot izejas kodu

更新 oss-store 的初始化流程:
1.首先向 oss-console 注册 store 节点
2.然后从 oss-console 中拉取本节点的配置和 channel(若本节点已经注册过)

reghao 2 gadi atpakaļ
vecāks
revīzija
1d4b7454cc
18 mainītis faili ar 216 papildinājumiem un 237 dzēšanām
  1. 20 4
      oss-store/src/main/java/cn/reghao/oss/store/config/CacheConfig.java
  2. 30 41
      oss-store/src/main/java/cn/reghao/oss/store/config/spring/AppLifecycle.java
  3. 11 16
      oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectGetController.java
  4. 5 7
      oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectUploadController.java
  5. 5 6
      oss-store/src/main/java/cn/reghao/oss/store/db/repository/ImageRepository.java
  6. 3 3
      oss-store/src/main/java/cn/reghao/oss/store/inerceptor/AccessLogInterceptor.java
  7. 3 3
      oss-store/src/main/java/cn/reghao/oss/store/inerceptor/TokenFilter.java
  8. 3 3
      oss-store/src/main/java/cn/reghao/oss/store/rpc/OssServerServiceImpl.java
  9. 6 9
      oss-store/src/main/java/cn/reghao/oss/store/rpc/SignService.java
  10. 3 3
      oss-store/src/main/java/cn/reghao/oss/store/rpc/disk/FileServiceImpl.java
  11. 2 2
      oss-store/src/main/java/cn/reghao/oss/store/service/GetObjectService.java
  12. 0 79
      oss-store/src/main/java/cn/reghao/oss/store/service/ObjectChannelService.java
  13. 2 2
      oss-store/src/main/java/cn/reghao/oss/store/service/ObjectMultipartUploadService.java
  14. 2 2
      oss-store/src/main/java/cn/reghao/oss/store/service/ObjectNameService.java
  15. 71 0
      oss-store/src/main/java/cn/reghao/oss/store/service/StoreLocalCache.java
  16. 0 57
      oss-store/src/main/java/cn/reghao/oss/store/service/StoreService.java
  17. 24 0
      store-api/src/main/java/cn/reghao/oss/store/api/dto/StoreDiskDto.java
  18. 26 0
      store-api/src/main/java/cn/reghao/oss/store/api/dto/StoreNodeDto.java

+ 20 - 4
oss-store/src/main/java/cn/reghao/oss/store/config/CacheConfig.java

@@ -1,5 +1,6 @@
 package cn.reghao.oss.store.config;
 
+import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import org.springframework.cache.CacheManager;
 import org.springframework.cache.annotation.EnableCaching;
@@ -19,6 +20,13 @@ import java.util.concurrent.TimeUnit;
 @EnableCaching
 @Configuration
 public class CacheConfig {
+    /**
+     * 为 Spring Cache 的相关注解提供一个缓存
+     *
+     * @param
+     * @return
+     * @date 2024-03-04 16:37:05
+     */
     @Bean
     public CacheManager cacheManager() {
         CaffeineCacheManager cacheManager = new CaffeineCacheManager();
@@ -30,11 +38,19 @@ public class CacheConfig {
         return cacheManager;
     }
 
-    /*@Bean("caffeineCache")
-    public Caffeine<Object, Object> caffeineCache() {
+    /**
+     * 提供一个全局的独立缓存
+     *
+     * @param
+     * @return
+     * @date 2024-03-04 16:37:38
+     */
+    @Bean("caffeineCache")
+    public Cache<String, Object> caffeineCache() {
         return Caffeine.newBuilder()
                 .initialCapacity(1000)
                 .maximumSize(10_000)
-                .expireAfterAccess(365, TimeUnit.DAYS);
-    }*/
+                .expireAfterAccess(365, TimeUnit.DAYS)
+                .build();
+    }
 }

+ 30 - 41
oss-store/src/main/java/cn/reghao/oss/store/config/spring/AppLifecycle.java

@@ -1,15 +1,19 @@
 package cn.reghao.oss.store.config.spring;
 
 import cn.reghao.jutil.jdk.machine.id.MachineId;
-import cn.reghao.jutil.jdk.result.WebResult;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import cn.reghao.jutil.jdk.store.LocalStore;
 import cn.reghao.jutil.jdk.store.LocalStores;
 import cn.reghao.jutil.jdk.store.SubDirCount;
 import cn.reghao.oss.sdk.OssConsoleClient;
+import cn.reghao.oss.store.api.dto.ObjectChannel;
+import cn.reghao.oss.store.api.dto.StoreDiskDto;
+import cn.reghao.oss.store.api.dto.StoreNodeDto;
+import cn.reghao.oss.store.api.dto.StoreProperties;
 import cn.reghao.oss.store.config.SpringProperties;
 import cn.reghao.oss.store.db.mapper.DataBlockMapper;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import cn.reghao.oss.store.task.FileTask;
-import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.boot.ApplicationArguments;
@@ -18,11 +22,7 @@ import org.springframework.stereotype.Component;
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.Type;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -38,26 +38,23 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
     private final FileTask fileTask;
     private final SpringProperties springProperties;
     private final MachineId machineId;
-    private OssConsoleClient ossConsoleClient;
+    private final OssConsoleClient ossConsoleClient;
+    private final StoreLocalCache storeLocalCache;
 
     public AppLifecycle(DataBlockMapper dataBlockMapper, FileTask fileTask, SpringProperties springProperties,
-                        MachineId machineId, OssConsoleClient ossConsoleClient) {
+                        MachineId machineId, OssConsoleClient ossConsoleClient, StoreLocalCache storeLocalCache) {
         this.dataBlockMapper = dataBlockMapper;
         this.fileTask = fileTask;
         this.springProperties = springProperties;
         this.machineId = machineId;
         this.ossConsoleClient = ossConsoleClient;
+        this.storeLocalCache = storeLocalCache;
     }
 
     @Override
     public void run(ApplicationArguments args) throws Exception {
-        try {
-            register();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
         initLocalStore();
-
+        initStoreNode();
         log.info("执行文件任务...");
         fileTask.exec();
         log.info("文件任务执行完成...");
@@ -91,35 +88,27 @@ public class AppLifecycle implements ApplicationRunner, DisposableBean {
         log.info("本地磁盘数据初始化完成...");
     }
 
-    private void register() throws Exception {
-        Map<String, String> map = new HashMap<>();
-        map.put("ipv4Addr", machineId.ipv4());
-        map.put("httpPort", springProperties.getHttpPort()+"");
-        map.put("rpcPort", springProperties.getRpcPort()+"");
-        String jsonPayload = JsonConverter.objectToJson(map);
+    private void initStoreNode() throws Exception {
+        log.info("初始化 StoreNode...");
+        List<StoreDiskDto> list = new ArrayList<>();
+        for (LocalStore localStore : LocalStores.getLocalStores()) {
+            String diskDir = localStore.getDiskDir();
+            long total = localStore.getTotal();
+            long avail = localStore.getAvailable();
+            list.add(new StoreDiskDto(diskDir, total, avail));
+        }
 
+        String nodeAddr = machineId.ipv4();
+        int httpPort = springProperties.getHttpPort();
+        int rpcPort = springProperties.getRpcPort();
+        StoreNodeDto storeNodeDto = new StoreNodeDto(nodeAddr, httpPort, rpcPort, list);
+        String jsonPayload = JsonConverter.objectToJson(storeNodeDto);
         ossConsoleClient.registerNode(jsonPayload);
 
-        String api = String.format("%s/api/oss/store/register", springProperties.getConsoleEndpoint());
-        HttpClient httpClient = HttpClient.newBuilder().build();
-        HttpRequest httpRequest = HttpRequest.newBuilder(new URI(api))
-                .header("content-type", "application/json")
-                .POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
-                .build();
-        HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
-        int statusCode = httpResponse.statusCode();
-        String body = httpResponse.body();
-        if (statusCode != 200) {
-            String errMsg = String.format("%s -> %s", statusCode, body);
-            throw new Exception(errMsg);
-        }
-
-        Type type = new TypeToken<WebResult<String>>(){}.getType();
-        WebResult<String> webResult = JsonConverter.jsonToObject(body, type);
-        if (webResult.getCode() != 0) {
-            String errMsg = String.format("%s - %s", webResult.getCode(), webResult.getMsg());
-            throw new Exception(errMsg);
-        }
+        StoreProperties storeProperties = ossConsoleClient.getStoreProperties(nodeAddr);
+        List<ObjectChannel> objectChannels = ossConsoleClient.getObjectChannels(nodeAddr);
+        storeLocalCache.initOssStore(storeProperties, objectChannels);
+        log.info("StoreNode 初始化完成...");
     }
 
     @Override

+ 11 - 16
oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectGetController.java

@@ -6,19 +6,16 @@ import cn.reghao.oss.store.api.dto.ObjectChannel;
 import cn.reghao.oss.store.api.dto.ObjectMeta;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.service.GetObjectService;
-import cn.reghao.oss.store.service.ObjectChannelService;
-import cn.reghao.oss.store.service.StoreService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import cn.reghao.oss.store.util.JwtUtil;
 import cn.reghao.oss.store.util.ObjectUtil;
 import cn.reghao.oss.store.util.SignatureUtil;
 import cn.reghao.oss.store.api.dto.OssPayload;
 import com.github.benmanes.caffeine.cache.Cache;
-import com.github.benmanes.caffeine.cache.Caffeine;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @author reghao
@@ -27,17 +24,15 @@ import java.util.concurrent.TimeUnit;
 @RestController
 public class ObjectGetController {
     private final GetObjectService getObjectService;
-    private final Cache<String, String> cache;
-    private final StoreService storeService;
-    private final ObjectChannelService objectChannelService;
+    private final Cache<String, Object> cache;
+    private final StoreLocalCache storeLocalCache;
     private final ObjectRepository objectRepository;
 
-    public ObjectGetController(GetObjectService getObjectService, StoreService storeService,
-                               ObjectChannelService objectChannelService, ObjectRepository objectRepository) {
+    public ObjectGetController(GetObjectService getObjectService, StoreLocalCache storeLocalCache,
+                               Cache<String, Object> cache, ObjectRepository objectRepository) {
         this.getObjectService = getObjectService;
-        this.cache = Caffeine.newBuilder().maximumSize(10_000).expireAfterAccess(1, TimeUnit.HOURS).build();
-        this.storeService = storeService;
-        this.objectChannelService = objectChannelService;
+        this.cache = cache;
+        this.storeLocalCache = storeLocalCache;
         this.objectRepository = objectRepository;
     }
 
@@ -71,10 +66,10 @@ public class ObjectGetController {
         }
 
         String queryString = String.format("token=%s&t=%s&nonce=%s", token, timestamp, nonce);
-        String domain = storeService.getDomain();
+        String domain = storeLocalCache.getDomain();
         String url = String.format("//%s/%s", domain, objectName);
         String requestString = String.format("%s%s?%s", "GET", url, queryString);
-        boolean valid = SignatureUtil.valid(requestString, storeService.getSecretKey(), sign);
+        boolean valid = SignatureUtil.valid(requestString, storeLocalCache.getSecretKey(), sign);
         if (!valid) {
             String payload = "sign invalid";
             getObjectService.writeResponse(HttpServletResponse.SC_FORBIDDEN, payload);
@@ -96,10 +91,10 @@ public class ObjectGetController {
             return;
         }*/
 
-        OssPayload ossPayload = JwtUtil.getOssPayload(token, storeService.getSecretKey());
+        OssPayload ossPayload = JwtUtil.getOssPayload(token, storeLocalCache.getSecretKey());
         int loginUser = ossPayload.getUserId();
         int channelId = ossPayload.getChannelId();
-        ObjectChannel objectChannel = objectChannelService.getObjectChannel(loginUser, channelId);
+        ObjectChannel objectChannel = storeLocalCache.getObjectChannel(loginUser, channelId);
         if (objectChannel == null) {
             String payload = String.format("channel_id %s not exist", channelId);
             getObjectService.writeResponse(HttpServletResponse.SC_FORBIDDEN, payload);

+ 5 - 7
oss-store/src/main/java/cn/reghao/oss/store/controller/ObjectUploadController.java

@@ -34,20 +34,17 @@ public class ObjectUploadController {
     private final ObjectNameService objectNameService;
     private final PutObjectService putObjectService;
     private final FileProcessor fileProcessor;
-    private final ObjectChannelService objectChannelService;
-    private String secretKey;
+    private final StoreLocalCache storeLocalCache;
 
     public ObjectUploadController(ChannelValidateService channelValidateService, FileStoreService fileStoreService,
                                   ObjectNameService objectNameService, PutObjectService putObjectService,
-                                  FileProcessor fileProcessor, ObjectChannelService objectChannelService,
-                                  StoreService storeService) {
+                                  FileProcessor fileProcessor, StoreLocalCache storeLocalCache) {
         this.channelValidateService = channelValidateService;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
         this.fileProcessor = fileProcessor;
-        this.secretKey = storeService.getSecretKey();
-        this.objectChannelService = objectChannelService;
+        this.storeLocalCache = storeLocalCache;
     }
 
     @PutMapping(value = "/**")
@@ -65,6 +62,7 @@ public class ObjectUploadController {
                     .body(WebResult.failWithMsg("no token in request"));
         }
 
+        String secretKey = storeLocalCache.getSecretKey();
         OssPayload ossPayload = JwtUtil.getOssPayload(token, secretKey);
         String action = ossPayload.getAction();
         if (!"upload".equals(action)) {
@@ -79,7 +77,7 @@ public class ObjectUploadController {
         }
 
         int loginUser = ossPayload.getUserId();
-        ObjectChannel objectChannel = objectChannelService.getObjectChannel(loginUser, channelId);
+        ObjectChannel objectChannel = storeLocalCache.getObjectChannel(loginUser, channelId);
         if (objectChannel == null) {
             String errMsg = String.format("channel validate failed, channel %s not exist", channelId);
             return ResponseEntity.status(HttpStatus.FORBIDDEN)

+ 5 - 6
oss-store/src/main/java/cn/reghao/oss/store/db/repository/ImageRepository.java

@@ -1,11 +1,10 @@
 package cn.reghao.oss.store.db.repository;
 
-import cn.reghao.oss.store.api.constant.UploadChannel;
 import cn.reghao.oss.store.api.dto.ObjectChannel;
 import cn.reghao.oss.store.api.dto.media.ImageUrlDto;
 import cn.reghao.oss.store.db.mapper.ImageFileMapper;
 import cn.reghao.oss.store.model.po.ImageFile;
-import cn.reghao.oss.store.service.ObjectChannelService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -22,13 +21,13 @@ import java.util.stream.Collectors;
 public class ImageRepository {
     private final ImageFileMapper imageFileMapper;
     private final ObjectRepository objectRepository;
-    private final ObjectChannelService objectChannelService;
+    private final StoreLocalCache storeLocalCache;
 
     public ImageRepository(ImageFileMapper imageFileMapper, ObjectRepository objectRepository,
-                           ObjectChannelService objectChannelService) {
+                           StoreLocalCache storeLocalCache) {
         this.imageFileMapper = imageFileMapper;
         this.objectRepository = objectRepository;
-        this.objectChannelService = objectChannelService;
+        this.storeLocalCache = storeLocalCache;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -79,7 +78,7 @@ public class ImageRepository {
         ImageFile original = list.get(0);
         imageUrlDto.setOriginalUrl(original.getUrl());
 
-        ObjectChannel objectChannel = objectChannelService.getObjectChannel(original.getUrl());
+        ObjectChannel objectChannel = storeLocalCache.getObjectChannel(original.getUrl());
         if (objectChannel != null && objectChannel.getProcessFile()) {
             imageUrlDto.setThumbnailUrl(list.get(1).getUrl());
         } else {

+ 3 - 3
oss-store/src/main/java/cn/reghao/oss/store/inerceptor/AccessLogInterceptor.java

@@ -1,7 +1,7 @@
 package cn.reghao.oss.store.inerceptor;
 
 import cn.reghao.jutil.web.ServletUtil;
-import cn.reghao.oss.store.service.StoreService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
@@ -22,8 +22,8 @@ import javax.servlet.http.HttpServletResponse;
 public class AccessLogInterceptor implements HandlerInterceptor {
     private final String referFrom;
 
-    public AccessLogInterceptor(StoreService storeService) {
-        this.referFrom = storeService.getReferer();
+    public AccessLogInterceptor(StoreLocalCache storeLocalCache) {
+        this.referFrom = storeLocalCache.getReferer();
     }
 
     @Override

+ 3 - 3
oss-store/src/main/java/cn/reghao/oss/store/inerceptor/TokenFilter.java

@@ -1,6 +1,6 @@
 package cn.reghao.oss.store.inerceptor;
 
-import cn.reghao.oss.store.service.StoreService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import cn.reghao.oss.store.util.JwtUtil;
 import cn.reghao.oss.store.util.UserContext;
 import cn.reghao.jutil.web.ServletUtil;
@@ -18,8 +18,8 @@ import java.io.IOException;
 public class TokenFilter implements Filter {
     private final String secretKey;
 
-    public TokenFilter(StoreService storeService) {
-        this.secretKey = storeService.getSecretKey();
+    public TokenFilter(StoreLocalCache storeLocalCache) {
+        this.secretKey = storeLocalCache.getSecretKey();
     }
 
     @Override

+ 3 - 3
oss-store/src/main/java/cn/reghao/oss/store/rpc/OssServerServiceImpl.java

@@ -3,7 +3,7 @@ package cn.reghao.oss.store.rpc;
 import cn.reghao.oss.store.api.constant.ObjectScope;
 import cn.reghao.oss.store.api.dto.ObjectChannel;
 import cn.reghao.oss.store.service.ObjectNameService;
-import cn.reghao.oss.store.service.StoreService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import cn.reghao.oss.store.util.JwtUtil;
 import cn.reghao.oss.store.api.constant.ChannelAction;
 import cn.reghao.oss.store.api.dto.OssPayload;
@@ -22,8 +22,8 @@ public class OssServerServiceImpl implements OssServerService {
     private final String secretKey;
     private final ObjectNameService objectNameService;
 
-    public OssServerServiceImpl(StoreService storeService, ObjectNameService objectNameService) {
-        this.secretKey = storeService.getSecretKey();
+    public OssServerServiceImpl(StoreLocalCache storeLocalCache, ObjectNameService objectNameService) {
+        this.secretKey = storeLocalCache.getSecretKey();
         this.objectNameService = objectNameService;
     }
 

+ 6 - 9
oss-store/src/main/java/cn/reghao/oss/store/rpc/SignService.java

@@ -1,12 +1,10 @@
 package cn.reghao.oss.store.rpc;
 
-import cn.reghao.oss.store.service.ObjectChannelService;
-import cn.reghao.oss.store.service.StoreService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import cn.reghao.oss.store.util.JwtUtil;
 import cn.reghao.oss.store.util.SignatureUtil;
 import cn.reghao.oss.store.api.constant.ChannelAction;
 import cn.reghao.oss.store.api.dto.OssPayload;
-import cn.reghao.oss.store.util.UserContext;
 import org.springframework.stereotype.Service;
 
 import java.util.UUID;
@@ -19,18 +17,17 @@ import java.util.UUID;
  */
 @Service
 public class SignService {
-    private final String secretKey;
-    private final ObjectChannelService objectChannelService;
+    private final StoreLocalCache storeLocalCache;
 
-    public SignService(StoreService storeService, ObjectChannelService objectChannelService) {
-        this.secretKey = storeService.getSecretKey();
-        this.objectChannelService = objectChannelService;
+    public SignService(StoreLocalCache storeLocalCache) {
+        this.storeLocalCache = storeLocalCache;
     }
 
     public String getSignedUrl(int loginUser, String url, int expire) {
         long timestamp = System.currentTimeMillis() + expire*1000L;
-        int channelId = objectChannelService.getChannelId(url);
+        int channelId = storeLocalCache.getChannelId(url);
 
+        String secretKey = storeLocalCache.getSecretKey();
         String action1 = ChannelAction.download.getName();
         String action = ChannelAction.access.getName();
         OssPayload ossPayload = new OssPayload(action, channelId, loginUser);

+ 3 - 3
oss-store/src/main/java/cn/reghao/oss/store/rpc/disk/FileServiceImpl.java

@@ -7,7 +7,7 @@ import cn.reghao.oss.store.api.iface.disk.FileService;
 import cn.reghao.oss.store.db.mapper.FileMetaMapper;
 import cn.reghao.oss.store.model.po.FileMeta;
 import cn.reghao.oss.store.service.PutObjectService;
-import cn.reghao.oss.store.service.StoreService;
+import cn.reghao.oss.store.service.StoreLocalCache;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
@@ -28,10 +28,10 @@ public class FileServiceImpl implements FileService {
     private final FileMetaMapper fileMetaMapper;
     private final String domain;
 
-    public FileServiceImpl(PutObjectService putObjectService, FileMetaMapper fileMetaMapper, StoreService storeService) {
+    public FileServiceImpl(PutObjectService putObjectService, FileMetaMapper fileMetaMapper, StoreLocalCache storeLocalCache) {
         this.fileMetaMapper = fileMetaMapper;
         this.putObjectService = putObjectService;
-        this.domain = storeService.getDomain();
+        this.domain = storeLocalCache.getDomain();
     }
 
     @Override

+ 2 - 2
oss-store/src/main/java/cn/reghao/oss/store/service/GetObjectService.java

@@ -26,9 +26,9 @@ public class GetObjectService {
     private final int bufSize = 1024*1024;
     private final String domain;
 
-    public GetObjectService(FileMetaMapper fileMetaMapper, StoreService storeService) {
+    public GetObjectService(FileMetaMapper fileMetaMapper, StoreLocalCache storeLocalCache) {
         this.fileMetaMapper = fileMetaMapper;
-        this.domain = storeService.getDomain();
+        this.domain = storeLocalCache.getDomain();
     }
     
     public void headObject(String objectName) throws IOException {

+ 0 - 79
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectChannelService.java

@@ -1,79 +0,0 @@
-package cn.reghao.oss.store.service;
-
-import cn.reghao.jutil.jdk.machine.id.MachineId;
-import cn.reghao.oss.store.api.dto.ObjectChannel;
-import cn.reghao.oss.sdk.OssConsoleClient;
-import cn.reghao.oss.store.util.UserContext;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2024-02-28 11:05:34
- */
-@Service
-public class ObjectChannelService {
-    private final MachineId machineId;
-    private final OssConsoleClient ossConsoleClient;
-    private final StoreService storeService;
-
-    public ObjectChannelService(MachineId machineId, OssConsoleClient ossConsoleClient, StoreService storeService) {
-        this.machineId = machineId;
-        this.ossConsoleClient = ossConsoleClient;
-        this.storeService = storeService;
-    }
-
-    public ObjectChannel getObjectChannel(int loginUser, int channelId) {
-        String nodeAddr = machineId.ipv4();
-        try {
-            return ossConsoleClient.getObjectChannel(loginUser, nodeAddr, channelId);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    public List<String> getAllChannelPrefix() {
-        String nodeAddr = machineId.ipv4();
-        try {
-            List<ObjectChannel> list = ossConsoleClient.getObjectChannels(nodeAddr);
-            return list.stream()
-                    .map(ObjectChannel::getPrefix)
-                    .collect(Collectors.toList());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return Collections.emptyList();
-    }
-
-    public int getChannelId(String url) {
-        ObjectChannel objectChannel = getObjectChannel(url);
-        if (objectChannel == null) {
-            return -1;
-        }
-
-        return objectChannel.getChannelId();
-    }
-
-    public ObjectChannel getObjectChannel(String url) {
-        String domain = storeService.getDomain();
-        String objectName = url.replace("//" + domain + "/", "");
-        String nodeAddr = machineId.ipv4();
-        try {
-            List<ObjectChannel> list = ossConsoleClient.getObjectChannels(nodeAddr);
-            for (ObjectChannel channel : list) {
-                if (objectName.startsWith(channel.getPrefix())) {
-                    return channel;
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-}

+ 2 - 2
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectMultipartUploadService.java

@@ -37,12 +37,12 @@ public class ObjectMultipartUploadService {
 
     public ObjectMultipartUploadService(FileMetaMapper fileMetaMapper, FileStoreService fileStoreService,
                                         ObjectNameService objectNameService, PutObjectService putObjectService,
-                                        StoreService storeService) {
+                                        StoreLocalCache storeLocalCache) {
         this.fileMetaMapper = fileMetaMapper;
         this.fileStoreService = fileStoreService;
         this.objectNameService = objectNameService;
         this.putObjectService = putObjectService;
-        this.domain = storeService.getDomain();
+        this.domain = storeLocalCache.getDomain();
     }
 
     public synchronized UploadPrepareRet prepareUpload(UploadPrepare uploadPrepare) {

+ 2 - 2
oss-store/src/main/java/cn/reghao/oss/store/service/ObjectNameService.java

@@ -20,9 +20,9 @@ public class ObjectNameService {
     private final ObjectRepository objectRepository;
     private final String domain;
 
-    public ObjectNameService(ObjectRepository objectRepository, StoreService storeService) {
+    public ObjectNameService(ObjectRepository objectRepository, StoreLocalCache storeLocalCache) {
         this.objectRepository = objectRepository;
-        this.domain = storeService.getDomain();
+        this.domain = storeLocalCache.getDomain();
     }
 
     public String getObjectUrl(String objectName) {

+ 71 - 0
oss-store/src/main/java/cn/reghao/oss/store/service/StoreLocalCache.java

@@ -0,0 +1,71 @@
+package cn.reghao.oss.store.service;
+
+import cn.reghao.oss.store.api.dto.ObjectChannel;
+import cn.reghao.oss.store.api.dto.StoreProperties;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2024-03-01 08:53:28
+ */
+@Service
+public class StoreLocalCache {
+    private StoreProperties storeProperties;
+    private final Map<String, ObjectChannel> prefixMap = new HashMap<>();
+    private final Map<Integer, ObjectChannel> channelIdMap = new HashMap<>();
+
+    public void initOssStore(StoreProperties storeProperties, List<ObjectChannel> list) {
+        this.storeProperties = storeProperties;
+        for (ObjectChannel channel : list) {
+            String prefix = channel.getPrefix();
+            Integer channelId = channel.getChannelId();
+            prefixMap.put(prefix, channel);
+            channelIdMap.put(channelId, channel);
+        }
+    }
+
+    public void updateStoreProperties(StoreProperties storeProperties) {
+        this.storeProperties = storeProperties;
+    }
+
+    public String getDomain() {
+        return storeProperties != null ? storeProperties.getDomain() : null;
+    }
+
+    public String getReferer() {
+        return storeProperties != null ? storeProperties.getReferer() : null;
+    }
+
+    public String getSecretKey() {
+        return storeProperties != null ? storeProperties.getSecretKey() : null;
+    }
+
+    public ObjectChannel getObjectChannel(int loginUser, int channelId) {
+        return channelIdMap.get(channelId);
+    }
+
+    public int getChannelId(String url) {
+        ObjectChannel objectChannel = getObjectChannel(url);
+        if (objectChannel == null) {
+            return -1;
+        }
+
+        return objectChannel.getChannelId();
+    }
+
+    public ObjectChannel getObjectChannel(String url) {
+        String domain = getDomain();
+        String objectName = url.replace("//" + domain + "/", "");
+        for (String prefix : prefixMap.keySet()) {
+            if (objectName.startsWith(prefix)) {
+                return prefixMap.get(prefix);
+            }
+        }
+
+        return null;
+    }
+}

+ 0 - 57
oss-store/src/main/java/cn/reghao/oss/store/service/StoreService.java

@@ -1,57 +0,0 @@
-package cn.reghao.oss.store.service;
-
-import cn.reghao.jutil.jdk.machine.id.MachineId;
-import cn.reghao.oss.sdk.OssConsoleClient;
-import cn.reghao.oss.store.api.dto.StoreProperties;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-
-/**
- * @author reghao
- * @date 2024-03-01 08:53:28
- */
-@Service
-public class StoreService {
-    private final String nodeAddr;
-    private final OssConsoleClient ossConsoleClient;
-    private StoreProperties storeProperties;
-
-    public StoreService(MachineId machineId, OssConsoleClient ossConsoleClient) {
-        this.nodeAddr = machineId.ipv4();
-        this.ossConsoleClient = ossConsoleClient;
-    }
-
-    @PostConstruct
-    public void getStoreProperties() {
-        try {
-            this.storeProperties = ossConsoleClient.getStoreProperties(nodeAddr);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public String getDomain() {
-        if (storeProperties == null) {
-            getStoreProperties();
-        }
-
-        return storeProperties.getDomain();
-    }
-
-    public String getReferer() {
-        if (storeProperties == null) {
-            getStoreProperties();
-        }
-
-        return storeProperties != null ? storeProperties.getReferer() : null;
-    }
-
-    public String getSecretKey() {
-        if (storeProperties == null) {
-            getStoreProperties();
-        }
-
-        return storeProperties.getSecretKey();
-    }
-}

+ 24 - 0
store-api/src/main/java/cn/reghao/oss/store/api/dto/StoreDiskDto.java

@@ -0,0 +1,24 @@
+package cn.reghao.oss.store.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2024-03-04 17:12:21
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Setter
+@Getter
+public class StoreDiskDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String diskDir;
+    private Long total;
+    private Long avail;
+}

+ 26 - 0
store-api/src/main/java/cn/reghao/oss/store/api/dto/StoreNodeDto.java

@@ -0,0 +1,26 @@
+package cn.reghao.oss.store.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2024-03-04 17:12:14
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Setter
+@Getter
+public class StoreNodeDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String nodeAddr;
+    private Integer httpPort;
+    private Integer rpcPort;
+    private List<StoreDiskDto> diskDtoList;
+}