reghao 3 лет назад
Родитель
Сommit
34eec3a0be

+ 12 - 1
pom.xml

@@ -43,7 +43,7 @@
         </dependency>
         <dependency>
             <groupId>cn.reghao.dfs</groupId>
-            <artifactId>dfs-common</artifactId>
+            <artifactId>dfs-api</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
 
@@ -111,6 +111,17 @@
             <version>2.9.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+            <version>2.7.8</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <version>2.12.0</version>
+        </dependency>
+
         <dependency>
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt</artifactId>

+ 6 - 0
src/main/java/cn/reghao/dfs/store/db/mapper/BucketMapper.java

@@ -1,10 +1,14 @@
 package cn.reghao.dfs.store.db.mapper;
 
+import cn.reghao.dfs.api.dto.BucketInfo;
+import cn.reghao.dfs.api.dto.BucketRegion;
 import cn.reghao.dfs.store.model.po.Bucket;
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2023-01-05 09:23:38
@@ -12,4 +16,6 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface BucketMapper extends BaseMapper<Bucket> {
     Bucket findByName(@Param("bucketName") String bucketName);
+    List<BucketRegion> findAll1();
+    List<BucketInfo> findBucketInfo();
 }

+ 2 - 0
src/main/java/cn/reghao/dfs/store/db/mapper/FileMetaMapper.java

@@ -1,5 +1,6 @@
 package cn.reghao.dfs.store.db.mapper;
 
+import cn.reghao.dfs.api.dto.HeadObjectResult;
 import cn.reghao.dfs.store.model.po.FileMeta;
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -17,6 +18,7 @@ public interface FileMetaMapper extends BaseMapper<FileMeta> {
 
     FileMeta findBySha256sum(String sha256sum);
     FileMeta findByObjectName(String objectName);
+    HeadObjectResult findByObjectName1(String objectName);
     List<FileMeta> findAll1(@Param("bucket") String bucket, @Param("prefix") String prefix, @Param("max") Integer max);
     List<FileMeta> findAll2(@Param("bucket") String bucket, @Param("prefix") String prefix,
                             @Param("start") String start, @Param("max") Integer max);

+ 4 - 0
src/main/java/cn/reghao/dfs/store/db/mapper/FileTypeMapper.java

@@ -1,13 +1,17 @@
 package cn.reghao.dfs.store.db.mapper;
 
+import cn.reghao.dfs.api.dto.FileIcon;
 import cn.reghao.dfs.store.model.po.FileType;
 import cn.reghao.jutil.jdk.db.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2022-12-27 16:59:15
  */
 @Mapper
 public interface FileTypeMapper extends BaseMapper<FileType> {
+    List<FileIcon> findAll1();
 }

+ 65 - 0
src/main/java/cn/reghao/dfs/store/rpc/BucketServiceImpl.java

@@ -0,0 +1,65 @@
+package cn.reghao.dfs.store.rpc;
+
+import cn.reghao.dfs.api.dto.BucketInfo;
+import cn.reghao.dfs.api.dto.BucketListResult;
+import cn.reghao.dfs.api.dto.CreateBucket;
+import cn.reghao.dfs.api.iface.BucketService;
+import cn.reghao.dfs.store.db.mapper.BucketMapper;
+import cn.reghao.dfs.store.db.mapper.RegionMapper;
+import cn.reghao.dfs.store.model.po.Bucket;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2022-08-05 15:04:19
+ */
+@DubboService
+@Service
+public class BucketServiceImpl implements BucketService {
+    private final RegionMapper regionMapper;
+    private final BucketMapper bucketMapper;
+
+    public BucketServiceImpl(RegionMapper regionMapper, BucketMapper bucketMapper) {
+        this.regionMapper = regionMapper;
+        this.bucketMapper = bucketMapper;
+    }
+
+    @Override
+    public boolean exist(String region, String bucketName) {
+        Bucket bucket = bucketMapper.findByName(bucketName);
+        return bucket == null;
+    }
+
+    @Override
+    public void create(CreateBucket createBucket) {
+        String region = createBucket.getRegion();
+        String bucketName = createBucket.getBucket();
+        String storageClass = createBucket.getStorage();
+        String acl = createBucket.getAcl();
+
+        Integer regionId = regionMapper.findIdByLocation(region);
+        if (regionId == null) {
+            return;
+        }
+
+        Bucket bucket = bucketMapper.findByName(bucketName);
+        if (bucket == null) {
+            bucket = new Bucket();
+            bucket.setRegionId(regionId);
+            bucket.setName(bucketName);
+            bucket.setStorage(storageClass);
+            bucket.setAcl(acl);
+            bucketMapper.save(bucket);
+        }
+    }
+
+    @Override
+    public BucketListResult list() {
+        List<BucketInfo> list = bucketMapper.findBucketInfo();
+        BucketListResult bucketListResult = new BucketListResult(list);
+        return bucketListResult;
+    }
+}

+ 145 - 0
src/main/java/cn/reghao/dfs/store/rpc/ObjectServiceImpl.java

@@ -0,0 +1,145 @@
+package cn.reghao.dfs.store.rpc;
+
+import cn.reghao.dfs.api.dto.*;
+import cn.reghao.dfs.api.dto.object.GenerateSignedUrl;
+import cn.reghao.dfs.api.dto.object.GenerateSignedUrlResult;
+import cn.reghao.dfs.api.iface.ObjectService;
+import cn.reghao.dfs.store.db.mapper.FileMetaMapper;
+import cn.reghao.dfs.store.db.mapper.FileTypeMapper;
+import cn.reghao.dfs.store.model.po.FileMeta;
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+import cn.reghao.jutil.tool.id.IdGenerator;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2023-01-09 15:35:42
+ */
+@DubboService
+@Service
+public class ObjectServiceImpl implements ObjectService {
+    private final FileMetaMapper fileMetaMapper;
+    private final FileTypeMapper fileTypeMapper;
+    private final IdGenerator objectIdGenerator;
+
+    public ObjectServiceImpl(FileMetaMapper fileMetaMapper, FileTypeMapper fileTypeMapper) {
+        this.fileMetaMapper = fileMetaMapper;
+        this.fileTypeMapper = fileTypeMapper;
+        this.objectIdGenerator = new IdGenerator(32, "object-id");
+    }
+
+    @Override
+    public List<FileIcon> getFileIcons() {
+        List<FileIcon> list = fileTypeMapper.findAll1();
+        return list;
+    }
+
+    @Override
+    public GetObjectsResult list(GetObjects getObjects) {
+        String region = getObjects.getRegion();
+        String bucket = getObjects.getBucket();
+        String prefix = getObjects.getPrefix();
+        String startAfter = getObjects.getMarker();
+        String delimiter = getObjects.getDelimiter();
+        Integer maxKeys = getObjects.getMaxKeys();
+
+        int count = fileMetaMapper.count();
+        List<FileMeta> list;
+        if (startAfter.isBlank()) {
+            list = fileMetaMapper.findAll1(bucket, prefix, maxKeys);
+        } else {
+            list = fileMetaMapper.findAll2(bucket, prefix, startAfter, maxKeys);
+        }
+
+        List<ObjectJson> list1 = list.stream().map(fileMeta -> {
+            ObjectJson objectJson = new ObjectJson();
+            Integer fileTypeId = fileMeta.getFileTypeId();
+            objectJson.setDir(fileTypeId == 1000);
+
+            String objectName = fileMeta.getObjectName();
+            String[] names = objectName.split("/");
+            String name = names[names.length-1];
+            objectJson.setName(name);
+            objectJson.setPath(objectName);
+            long size = fileMeta.getSize();
+            objectJson.setSize(size);
+            objectJson.setFormattedSize(String.valueOf(size));
+            objectJson.setObjectType("Normal");
+            objectJson.setType(fileTypeId);
+            objectJson.setStorageClass("Standard");
+            objectJson.setTimeModified(DateTimeConverter.msTimestamp(fileMeta.getUpdateTime()));
+            return objectJson;
+        }).collect(Collectors.toList());
+
+        GetObjectsResult getObjectsResult = new GetObjectsResult();
+        getObjectsResult.setObjectList(list1);
+        getObjectsResult.setBucketName(bucket);
+        getObjectsResult.setDelimiter(delimiter);
+        getObjectsResult.setMaxKeys(maxKeys);
+        getObjectsResult.setObjectSize(0L);
+        getObjectsResult.setTruncated(true);
+        return getObjectsResult;
+    }
+
+    @Override
+    public void createFolder(CreateFolder createFolder) {
+        String objectName = createFolder.getObjectName();
+        List<String> objectNames = new ArrayList<>();
+        String[] names = objectName.split("/");
+        for (int i = 0; i < names.length; i++) {
+            if (i == 0) {
+                objectNames.add(names[i] + "/");
+            } else {
+                String tmp = objectNames.get(i-1) + names[i] + "/";
+                objectNames.add(tmp);
+            }
+        }
+
+        FileMeta fileMeta;
+        int i = 0;
+        for (; i < objectNames.size(); i++) {
+            fileMeta = fileMetaMapper.findByObjectName(objectNames.get(i));
+            if (fileMeta == null) {
+                break;
+            }
+        }
+
+        List<FileMeta> list = new ArrayList<>();
+        for (int j = i; j < objectNames.size(); j++) {
+            String objectName1 = objectNames.get(j);
+            String objectId = objectIdGenerator.stringId();
+            String[] names1 = objectName1.split("/");
+            String filename = names1[names1.length-1];
+            list.add(new FileMeta(objectName1, objectId, filename, "tnb"));
+        }
+
+        if (!list.isEmpty()) {
+            fileMetaMapper.saveAll(list);
+        }
+    }
+
+    @Override
+    public HeadObjectResult head(HeadObject headObject) {
+        String objectName = headObject.getObjectName();
+        HeadObjectResult headObjectResult = fileMetaMapper.findByObjectName1(objectName);
+        return headObjectResult;
+    }
+
+    @Override
+    public GenerateSignedUrlResult signedUrl(GenerateSignedUrl generateSignedUrl) {
+        String objectName = generateSignedUrl.getObjectName();
+        String url = String.format("//oss.reghao.cn/object/%s", objectName);
+        // 5 分钟后链接失效
+        long expires = System.currentTimeMillis()/1000 + 300;
+        String ossAccessId = "TMP.3KeSkQJhXm4fZNupmzTEFx8HQ7QobdYnbc4A5do6zvqDnkkHdwyKj2rvJzPCfprxBSfHM6H3tqci21rCnHwWEmVje3PHaA";
+        String signature = "C1NieNpY%2FrmgaHNM2PXTPU3Tshw%3D";
+        String param = String.format("Expires=%s&OSSAccessId=%s&Signature=%s", expires, ossAccessId, signature);
+
+        return new GenerateSignedUrlResult(url, param);
+    }
+}

+ 27 - 0
src/main/java/cn/reghao/dfs/store/rpc/RegionServiceImpl.java

@@ -0,0 +1,27 @@
+package cn.reghao.dfs.store.rpc;
+
+import cn.reghao.dfs.api.dto.BucketRegion;
+import cn.reghao.dfs.api.iface.RegionService;
+import cn.reghao.dfs.store.db.mapper.BucketMapper;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2023-01-09 16:07:15
+ */
+@DubboService
+@Service
+public class RegionServiceImpl implements RegionService {
+    private BucketMapper bucketMapper;
+
+    public RegionServiceImpl(BucketMapper bucketMapper) {
+        this.bucketMapper = bucketMapper;
+    }
+
+    public List<BucketRegion> list() {
+        return bucketMapper.findAll1();
+    }
+}

+ 15 - 5
src/main/resources/application-dev.yml

@@ -1,13 +1,23 @@
 spring:
   datasource:
-    url: jdbc:mysql://192.168.0.110:3306/reghao_oss_tdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
-    username: test
-    password: Test@123456
+    url: jdbc:mysql://localhost:3306/reghao_oss_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+    username: dev
+    password: Dev@123456
 dfs:
   domain: file.reghao.cn
   group: 0
   node: 0
   baseDirs:
-    - /opt/oss/disk/13f654c8-af87-4710-aac9-7aa086c99aec/
+    - /opt/oss/disk/00b989fc-991b-4d4e-959e-9b6e19299b72/
   encryptKey: 5JCdi68CulSDu0TqD4jR
-  metaDir: /opt/oss/meta
+  metaDir: /opt/oss/meta
+dubbo:
+  application:
+    name: dfs-store-provider
+  scan:
+    base-packages: cn.reghao.dfs.store.rpc
+  protocol:
+    name: dubbo
+    port: 8110
+  registry:
+    address: zookeeper://localhost:2181

+ 12 - 0
src/main/resources/mapper/oss/BucketMapper.xml

@@ -12,6 +12,18 @@
     <select id="findAll" resultType="cn.reghao.dfs.store.model.po.Bucket">
         select * from bucket
     </select>
+    <select id="findAll1" resultType="cn.reghao.dfs.api.dto.BucketRegion">
+        select b.name as bucket,r.location as region,r.name_zh_cn as regionName
+        from bucket b
+        inner join region r
+        on r.id=b.region_id
+    </select>
+    <select id="findBucketInfo" resultType="cn.reghao.dfs.api.dto.BucketInfo">
+        select r.location as region,r.location,b.name,b.storage as storageClass,unix_timestamp(date_format(b.create_time,'%Y-%m-%d %H:%i:%S')) as creationDate
+        from bucket b
+        inner join region r
+        on r.id=b.region_id
+    </select>
     <select id="findByName" resultType="cn.reghao.dfs.store.model.po.Bucket">
         select * from bucket
         where name=#{bucketName}

+ 1 - 1
src/main/resources/mapper/oss/DataBlockMapper.xml

@@ -5,7 +5,7 @@
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into data_block
         (`id`,`deleted`,`create_time`,`update_time`,`object_id`,`index`,`block_id`,`absolute_path`,`start`,`end`)
-        values 
+        values
         (#{id},#{deleted},#{createTime},#{updateTime},#{objectId},#{index},#{blockId},#{absolutePath},#{start},#{end})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">

+ 6 - 1
src/main/resources/mapper/oss/FileMetaMapper.xml

@@ -5,7 +5,7 @@
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into file_meta
         (`id`,`deleted`,`create_time`,`update_time`,`object_name`,`object_id`,`filename`,`size`,`file_type_id`,`content_type`,`sha256sum`,`bucket`)
-        values 
+        values
         (#{id},#{deleted},#{createTime},#{updateTime},#{objectName},#{objectId},#{filename},#{size},#{fileTypeId},#{contentType},#{sha256sum},#{bucket})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
@@ -51,6 +51,11 @@
         select * from file_meta
         where object_name=#{objectName}
     </select>
+    <select id="findByObjectName1" resultType="cn.reghao.dfs.api.dto.HeadObjectResult">
+        select content_type,size as contentLength,sha256sum as eTag,unix_timestamp(date_format(update_time,'%Y-%m-%d %H:%i:%S')) as lastModified
+        from file_meta
+        where object_name=#{objectName}
+    </select>
     <select id="findByObjectId" resultType="java.lang.String">
         select upload_id from file_user
         where file_id=#{objectId}

+ 5 - 0
src/main/resources/mapper/oss/FileTypeMapper.xml

@@ -8,4 +8,9 @@
         values
         (#{id},#{code},#{name},#{icon},#{iconLarge})
     </insert>
+
+    <select id="findAll1" resultType="cn.reghao.dfs.api.dto.FileIcon">
+        select id,icon,icon_large as iconLarge
+        from file_type
+    </select>
 </mapper>