扩展cube.js的repositoryFactory 支持基于s3的schema 存储

cube.js 是一个很不错的数据分析框架(架构设计特别灵活,支持多种数据源的处理)
以下是扩展本地文件系统,方便的支持基于s3的后后端存储模型,以下主要说明关于
s3FileRepositoryFactory 的代码说明以及使用

参考代码

源码可以参考github rongfengliang/cube.js-s3-filerepository

  • 源码
 
const Minio = require('minio')
const streamToPromise = require('stream-to-promise');
/**
 * mys3 file repository
 */
class  S3FileRepository {
    // init config with env
    constructor(){
         this.minioClient = new Minio.Client({
            endPoint: process.env.cube_s3_endpoint,
            port: parseInt(process.env.cube_s3_port),
            useSSL:  process.env.cube_s3_ssl=="true" ? true : false,
            accessKey: process.env.cube_s3_accesskey,
            secretKey: process.env.cube_s3_secretkey
          });
    }
    async dataSchemaFiles() {
        var localminioClient = this.minioClient
        var bucket = process.env.cube_s3_bucket
        var Files = await streamToPromise(localminioClient.listObjectsV2(bucket, "", true))
        var fileContents = []
        for (const file of Files) {
            try {
                const fileBuffer = await streamToPromise(await localminioClient.getObject(bucket, file.name))
                let  fileItemContent = fileBuffer.toString('utf-8');
                fileContents.push({fileName: file.name, content: fileItemContent})
            }
            catch(e){
                console.log(e)
            }
        }
        return fileContents;
    }
}
module.exports = {
    repositoryFactory: ({ authInfo }) => new S3FileRepository(),
};
  • 简单说明
    使用了minio 以及stream-to-promise,minio 包主要是进行s3的数据操作,stream-to-promise主要是进行
    stream 转为promise 简化代码的编写,同时集成wait 操作,同时cube.js 对于repositoryFactory 的实现签
    名为
 
SchemaFileRepository {
  dataSchemaFiles(): Promise<FileContent[]>
}
// 文件内容的的签名
FileContent {
  fileName: String,
  content: String
}

参考使用

  • cube.js 项目添加依赖
yarn add @dalongrong/cube-s3repository
  • 配置环境变量
    .env 文件
 
cube_s3_endpoint=localhost
cube_s3_port=9000
cube_s3_accesskey=minio
cube_s3_secretkey=minio123
cube_s3_bucket=demo
  • cube.js 代码
// Cube.js configuration options: https://cube.dev/docs/config
const PostgresDriver = require("@cubejs-backend/postgres-driver");
const CubeStoreDriver = require("@cubejs-backend/cubestore-driver")
const myS3FileRepository = require("@dalongrong/cube-s3repository")
module.exports = {
    devServer: true,
    dbType: ({ dataSource } = {}) => {
        return 'postgres';
    },
    telemetry: false,
    apiSecret: "b2db7688e328d316d85e924d8b9a0737d87162a9f2cf36325f1ca0ae08dbdaa990520750847226cf8dcbb1fb4c07afe1087c7cb03b8f9f05b9abad3eb4058f3f",
    driverFactory: ({ dataSource } = {}) => {
        return new PostgresDriver({
            user: "postgres",
            database: "postgres",
            password: "dalong",
            port: 5432,
            host: "127.0.0.1",
            readOnly: true
        });
    },
    repositoryFactory: myS3FileRepository.repositoryFactory,
    externalDbType: 'cubestore',
    externalDriverFactory: () => new CubeStoreDriver({
        user: "root",
        port: 3306,
        host: "127.0.0.1"
    })
};
  • 代码集成cube.js 模式
const CubejsServer = require('@cubejs-backend/server');
const cubejs = require("./cube")
const throng = require('throng')
const WORKERS = process.env.WEB_CONCURRENCY || 2
const server = new CubejsServer(cubejs);
throng(WORKERS, start)
function start(){
    server
    .listen()
    .then(({ version, port }) => {
      console.log(`🚀 Cube.js server (${version}) is listening on ${port}`);
    })
    .catch((e) => {
      console.error('Fatal error during server start: ');
      console.error(e.stack || e);
    });
}
  • 上传一些schema 文件

效果

 

 

  • 访问效果

s3 存储的schema 数据

 

 


数据查询效果

 

 

说明

相关npm包已经push npm repo 了,@dalongrong/cube-s3repository 大家可以直接使用,实际上基于s3 repositoryFactory 也是一种高效
扩展cube.js 的模式(dev 环境很方便,自动拉取更新,生产目前还需要手工处理,实际上官方可以提供类似的api进行reload)

参考资料

https://cube.dev/docs/config#schema-file-repository
https://www.npmjs.com/package/@dalongrong/cube-s3repository
https://github.com/rongfengliang/cube.js-s3-filerepository

posted on 2021-01-26 11:45  荣锋亮  阅读(157)  评论(0编辑  收藏  举报

导航