فهرست منبع

StoreService 添加 getUploadToken 方法, uploadToken 由 oss-store 生成, 维护和校验

reghao 1 سال پیش
والد
کامیت
bf1e5c1878

+ 1 - 0
oss-api/src/main/java/cn/reghao/oss/api/iface/StoreService.java

@@ -17,6 +17,7 @@ import cn.reghao.oss.api.dto.media.VideoInfo;
 public interface StoreService {
     void createChannel(String channelPrefix);
     StoreInfo getStoreInfo();
+    String getUploadToken(int channelId, int loginUser);
 
     void setObjectScope(String objectId, int scope);
     void deleteByObjectId(String objectId);

+ 1 - 1
oss-console/src/main/java/cn/reghao/oss/console/app/controller/OssController.java

@@ -32,7 +32,7 @@ public class OssController {
     @GetMapping(value = "/upload/store", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getUploadStore(@RequestParam("channelId") int channelId) {
         int loginUser = AuthContext.getUserId();
-        ServerInfo serverInfo = consoleService.getUploadStore(channelId, loginUser);
+        ServerInfo serverInfo = consoleService.getUploadStore(loginUser, channelId);
         return WebResult.success(serverInfo);
     }
 

+ 11 - 4
oss-console/src/main/java/cn/reghao/oss/console/app/rpc/ConsoleServiceImpl.java

@@ -3,6 +3,7 @@ package cn.reghao.oss.console.app.rpc;
 import cn.reghao.jutil.jdk.security.RandomString;
 import cn.reghao.oss.api.constant.ChannelAction;
 import cn.reghao.oss.api.dto.*;
+import cn.reghao.oss.api.iface.StoreService;
 import cn.reghao.oss.api.util.JwtUtil;
 import cn.reghao.oss.console.app.model.po.StoreNode;
 import cn.reghao.oss.console.app.model.po.UploadChannel;
@@ -27,13 +28,15 @@ public class ConsoleServiceImpl implements ConsoleService {
     private final UploadChannelService uploadChannelService;
     private final StoreNodeService storeNodeService;
     private final UserNodeService userNodeService;
+    private RpcService rpcService;
     private final Cache<String, String> cache;
 
     public ConsoleServiceImpl(UploadChannelService uploadChannelService, StoreNodeService storeNodeService,
-                              UserNodeService userNodeService, Cache<String, String> cache) {
+                              UserNodeService userNodeService, RpcService rpcService, Cache<String, String> cache) {
         this.uploadChannelService = uploadChannelService;
         this.storeNodeService = storeNodeService;
         this.userNodeService = userNodeService;
+        this.rpcService = rpcService;
         this.cache = cache;
     }
 
@@ -91,15 +94,19 @@ public class ConsoleServiceImpl implements ConsoleService {
         }
 
         String domain = userNode.getDomain();
-        String ossUrl = String.format("//%s/oss", domain);
+        String ossUrl = String.format("//%s", domain);
         long maxSize = uploadChannel.getMaxSize();
 
-        String secretKey = RandomString.getString(128);
+        StoreNode storeNode = storeNodeService.getById(userNode.getNodeId());
+        StoreService storeService = rpcService.getStoreService(storeNode);
+        String uploadToken = storeService.getUploadToken(channelId, loginUser);
+        /*String secretKey = RandomString.getString(128);
         String action = ChannelAction.upload.getName();
         long expireAt = System.currentTimeMillis() + 3600*1000;
         OssPayload ossPayload = new OssPayload(action, channelId, loginUser);
         String uploadToken = JwtUtil.createToken(ossPayload, expireAt, secretKey);
-        cache.put(uploadToken, secretKey);
+        cache.put(uploadToken, secretKey);*/
+
         return new ServerInfo(ossUrl, channelId, maxSize, uploadToken);
     }
 }

+ 46 - 0
oss-console/src/main/java/cn/reghao/oss/console/app/rpc/RpcService.java

@@ -0,0 +1,46 @@
+package cn.reghao.oss.console.app.rpc;
+
+import cn.reghao.oss.api.iface.StoreService;
+import cn.reghao.oss.console.app.model.po.StoreNode;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ConsumerConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2024-07-05 10:44:51
+ */
+@Service
+public class RpcService {
+    public StoreService getStoreService(StoreNode storeNode) {
+        RemoteService<StoreService> remoteService = new RemoteService<>();
+        String host = storeNode.getNodeAddr();
+        int port = storeNode.getRpcPort();
+        return remoteService.getService(host, port, StoreService.class);
+    }
+
+    static class RemoteService<T> {
+        public T getService(String host, int port, Class<T> clazz) {
+            String serviceName = "remote-service";
+            String dubboUrl = String.format("dubbo://%s:%s/%s", host, port, clazz.getName());
+
+            // 当前应用配置
+            ApplicationConfig application = new ApplicationConfig();
+            application.setName(serviceName);
+
+            ConsumerConfig consumerConfig = new ConsumerConfig();
+            consumerConfig.setTimeout(60_000);
+
+            // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
+            // 引用远程服务
+            // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
+            ReferenceConfig<T> reference = new ReferenceConfig<>();
+            reference.setApplication(application);
+            reference.setInterface(clazz);
+            reference.setUrl(dubboUrl);
+            reference.setConsumer(consumerConfig);
+            return reference.get();
+        }
+    }
+}

+ 6 - 4
oss-console/src/main/java/cn/reghao/oss/console/app/rpc/StoreServiceWrapperImpl.java

@@ -24,9 +24,11 @@ import java.util.List;
 @Service
 public class StoreServiceWrapperImpl implements StoreServiceWrapper {
     private final UploadChannelService uploadChannelService;
+    private final RpcService rpcService;
 
-    public StoreServiceWrapperImpl(UploadChannelService uploadChannelService) {
+    public StoreServiceWrapperImpl(UploadChannelService uploadChannelService, RpcService rpcService) {
         this.uploadChannelService = uploadChannelService;
+        this.rpcService = rpcService;
     }
 
     @Override
@@ -47,15 +49,15 @@ public class StoreServiceWrapperImpl implements StoreServiceWrapper {
             throw new Exception(errMsg);
         }
 
-        return getStoreService(storeNode);
+        return rpcService.getStoreService(storeNode);
     }
 
-    public StoreService getStoreService(StoreNode storeNode) {
+    /*public StoreService getStoreService(StoreNode storeNode) {
         RemoteService<StoreService> remoteService = new RemoteService<>();
         String host = storeNode.getNodeAddr();
         int port = storeNode.getRpcPort();
         return remoteService.getService(host, port, StoreService.class);
-    }
+    }*/
 
     @Override
     public void createChannel(int channelId, String channelPrefix) {

+ 7 - 3
oss-console/src/main/java/cn/reghao/oss/console/app/service/StoreChannelService.java

@@ -5,6 +5,7 @@ import cn.reghao.jutil.jdk.converter.ByteType;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.oss.api.dto.StoreDiskDto;
 import cn.reghao.oss.api.dto.StoreInfo;
+import cn.reghao.oss.api.iface.StoreServiceWrapper;
 import cn.reghao.oss.console.account.service.UserContext;
 import cn.reghao.oss.console.app.db.repository.StoreNodeRepository;
 import cn.reghao.oss.console.app.db.repository.UploadChannelRepository;
@@ -15,6 +16,7 @@ import cn.reghao.oss.console.app.model.po.UploadChannel;
 import cn.reghao.oss.console.app.model.po.UserNode;
 import cn.reghao.oss.console.app.model.vo.StoreDiskVO;
 import cn.reghao.oss.console.app.model.vo.StoreNodeVO;
+import cn.reghao.oss.console.app.rpc.RpcService;
 import cn.reghao.oss.console.app.rpc.StoreServiceWrapperImpl;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -32,14 +34,16 @@ public class StoreChannelService {
     private final UploadChannelRepository uploadChannelRepository;
     private final StoreNodeRepository storeNodeRepository;
     private final UserNodeService userNodeService;
-    private final StoreServiceWrapperImpl storeServiceWrapper;
+    private final StoreServiceWrapper storeServiceWrapper;
+    private final RpcService rpcService;
 
     public StoreChannelService(UploadChannelRepository uploadChannelRepository, StoreNodeRepository storeNodeRepository,
-                               UserNodeService userNodeService, StoreServiceWrapperImpl storeServiceWrapper) {
+                               UserNodeService userNodeService, StoreServiceWrapper storeServiceWrapper, RpcService rpcService) {
         this.uploadChannelRepository = uploadChannelRepository;
         this.storeNodeRepository = storeNodeRepository;
         this.userNodeService = userNodeService;
         this.storeServiceWrapper = storeServiceWrapper;
+        this.rpcService = rpcService;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -76,7 +80,7 @@ public class StoreChannelService {
             return null;
         }
 
-        StoreInfo storeInfo = storeServiceWrapper.getStoreService(storeNode).getStoreInfo();
+        StoreInfo storeInfo = rpcService.getStoreService(storeNode).getStoreInfo();
         List<StoreDiskDto> storeDiskDtos = storeInfo.getStoreDisks();
         List<StoreDisk> list = storeDiskDtos.stream()
                 .map(StoreDisk::new)

+ 18 - 1
oss-store/src/main/java/cn/reghao/oss/store/rpc/StoreServiceImpl.java

@@ -1,5 +1,7 @@
 package cn.reghao.oss.store.rpc;
 
+import cn.reghao.jutil.jdk.security.RandomString;
+import cn.reghao.oss.api.constant.ChannelAction;
 import cn.reghao.oss.api.constant.ObjectScope;
 import cn.reghao.oss.api.dto.*;
 import cn.reghao.oss.api.dto.media.AudioInfo;
@@ -7,6 +9,7 @@ import cn.reghao.oss.api.dto.media.ConvertedImageInfo;
 import cn.reghao.oss.api.dto.media.ImageInfo;
 import cn.reghao.oss.api.dto.media.VideoInfo;
 import cn.reghao.oss.api.util.AuthContext;
+import cn.reghao.oss.api.util.JwtUtil;
 import cn.reghao.oss.store.db.repository.ObjectRepository;
 import cn.reghao.oss.store.model.po.FileMeta;
 import cn.reghao.oss.store.service.FileStoreService;
@@ -15,6 +18,7 @@ import cn.reghao.oss.api.iface.StoreService;
 import cn.reghao.oss.store.service.SignService;
 import cn.reghao.oss.store.service.StoreLocalService;
 import cn.reghao.oss.store.task.MediaFileProcessor;
+import com.github.benmanes.caffeine.cache.Cache;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
 
@@ -39,15 +43,17 @@ public class StoreServiceImpl implements StoreService {
     private final ObjectRepository objectRepository;
     private final SignService signService;
     private final MediaFileProcessor mediaFileProcessor;
+    private final Cache<String, String> cache;
 
     public StoreServiceImpl(ObjectNameService objectNameService, FileStoreService fileStoreService,
                             ObjectRepository objectRepository, SignService signService,
-                            MediaFileProcessor mediaFileProcessor) {
+                            MediaFileProcessor mediaFileProcessor, Cache<String, String> cache) {
         this.objectNameService = objectNameService;
         this.fileStoreService = fileStoreService;
         this.objectRepository = objectRepository;
         this.signService = signService;
         this.mediaFileProcessor = mediaFileProcessor;
+        this.cache = cache;
     }
 
     @Override
@@ -63,6 +69,17 @@ public class StoreServiceImpl implements StoreService {
         return new StoreInfo(diskDtos);
     }
 
+    @Override
+    public String getUploadToken(int channelId, int loginUser) {
+        String secretKey = RandomString.getString(128);
+        String action = ChannelAction.upload.getName();
+        long expireAt = System.currentTimeMillis() + 3600*1000;
+        OssPayload ossPayload = new OssPayload(action, channelId, loginUser);
+        String uploadToken = JwtUtil.createToken(ossPayload, expireAt, secretKey);
+        cache.put(uploadToken, secretKey);
+        return uploadToken;
+    }
+
     @Override
     public void setObjectScope(String objectId, int scope) {
         FileMeta fileMeta = objectRepository.getByObjectId(objectId);