Minio 对象存储服务

Minio 简介

The Object Storage for AI Data Infrastructure

MinIO 是一个高性能、兼容 S3 协议的对象存储系统。它专为大规模的人工智能/机器学习、数据湖和数据库工作负载而设计。它是基于软件定义的,可以运行在任何云端或本地基础设施上。MinIO 采用双重许可,既有开源的 GNU AGPL v3 许可证,也有商业企业许可证。

官网 min.io/ Github github.com/minio

MinIO 主要特点和功能:

特点 描述
对象存储 MinIO 以对象的形式存储数据,每个对象由唯一的键(key)标识,并可以存储任意大小的数据。
高可用性 MinIO 通过分布式部署和数据冗余来提供高可用性。它支持多副本复制和纠删码(erasure coding)等机制,确保数据的安全性和可靠性。
水平扩展 MinIO 可以在多个节点上进行水平扩展,从而处理大规模的数据工作负载。它能够自动负载均衡和并行处理请求,以实现高吞吐量和低延迟。
兼容性 MinIO 遵循 Amazon S3 API 的标准,因此与现有的 S3 生态系统和应用程序兼容。这使得将现有的 S3 应用程序迁移到 MinIO 变得非常简单。
安全性 MinIO 提供多种安全控制机制,包括访问控制列表(ACLs)、策略管理、加密传输(TLS/SSL)等,以确保数据的安全性和隐私性。
监控和管理 MinIO 提供了丰富的监控和管理功能,包括实时性能指标、日志记录、事件通知等。通过这些功能,用户可以对存储系统进行监控、故障排除和性能优化。
简单易用 MinIO 的设计目标之一是提供简单易用的存储解决方案。它具有直观的 Web 管理界面和命令行工具,使得用户能够快速配置和操作存储系统。

本文将介绍 Minio 对象存储服务的基本知识,并提供了如何在单机环境中使用 DockerDocker-Compose 部署 Minio 服务的说明。此外,还简要介绍了使用 Minio 控制台进行基本操作的方法,以及如何使用 OpenSSL 生成具有 SAN 扩展的自签名证书。我们还会涉及到 Minio 客户端工具 mc 的使用,并演示如何通过 GoSDK 连接和操作 Minio 服务。通过本文,你将对 Minio 的基本概念和工具应用有一个全面的了解。

Minio 服务部署

Docker 单机部署

Docker 方式

bash 复制代码
# 拉取MinIO镜像
root@app-server:~# docker pull minio/minio
root@app-server:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED      SIZE
minio/minio   latest    88c665b1183a   9 days ago   147MB

# 创建卷目录和证书目录
root@app-server:~# mkdir -p /opt/minio/{data,config}

# 运行MinIO对象存储服务器
root@app-server:~# docker run -d \
  --name minio-server \
  --restart always \
  -p 9000:9000 -p 9090:9090 \
  -e "MINIO_ROOT_USER=minioadmin" \
  -e "MINIO_ROOT_PASSWORD=minioadmin" \
  -v /opt/minio/data:/data \
  -v /opt/minio/config:/root/.minio/certs \
  minio/minio \
  server /data --console-address ":9090"

# 查看容器状态
root@app-server:~# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
e948d2be72fd   minio/minio   "/usr/bin/docker-ent..."   6 seconds ago   Up 6 seconds   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   minio-server

# 进入容器内部
root@app-server:~# docker exec -it minio-server /bin/bash

# 查看MinIO版本(server)
bash-5.1# minio --version
minio version RELEASE.2023-11-20T22-40-07Z (commit-id=f56a182b719cb262e0628ef3f544371ea8842551)
Runtime: go1.21.4 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2023 MinIO, Inc.

# 查看MinIO版本(client)
bash-5.1# mc --version
mc version RELEASE.2023-11-20T16-30-59Z (commit-id=937b34616f012ad30e1cd6fd61e1da25ff931648)
Runtime: go1.21.4 linux/amd64
Copyright (c) 2015-2023 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>

# 查看暴露的端口
root@app-server:~# lsof -i tcp:9090
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 16160 root    4u  IPv4  93746      0t0  TCP *:9090 (LISTEN)
docker-pr 16166 root    4u  IPv6  94274      0t0  TCP *:9090 (LISTEN)

# 关闭容器
root@app-server:~# docker stop e948d2be72fd
e948d2be72fd

# 删除容器
root@app-server:~# docker rm e948d2be72fd
e948d2be72fd

Docker-compose 方式

bash 复制代码
# 编辑docker-compose配置文件
root@app-server:~# vim docker-compose.yml

# 启动docker-compose
root@app-server:~# docker-compose up -d
Creating minio_server ... done

# 查看容器状态
root@app-server:~# docker-compose ps -a
    Name                  Command               State                                         Ports
------------------------------------------------------------------------------------------------------------------------------------------
minio-server   /usr/bin/docker-entrypoint ...   Up      0.0.0.0:9000->9000/tcp,:::9000->9000/tcp, 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp

# 查看启动日志
root@app-server:~# docker-compose logs
Attaching to minio-server
minio-server | WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables
minio-server | MinIO Object Storage Server
minio-server | Copyright: 2015-2023 MinIO, Inc.
minio-server | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio-server | Version: RELEASE.2023-11-20T22-40-07Z (go1.21.4 linux/amd64)
minio-server |
minio-server | Status:         1 Online, 0 Offline.
minio-server | S3-API: http://172.24.0.2:9000  http://127.0.0.1:9000
minio-server | Console: http://172.24.0.2:9090 http://127.0.0.1:9090
minio-server |
minio-server | Documentation: https://min.io/docs/minio/linux/index.html
minio-server | Warning: The standard parity is set to 0. This can lead to data loss.

docker-compose 配置文件

yaml 复制代码
version: '3'

services:
  minio:
    container_name: minio-server
    image: minio/minio                               # Image name for the MinIO container
    ports:
      - 9000:9000                                    # Used to access the MinIO object storage service
      - 9090:9090                                    # Used to access the MinIO console
    environment:
      - MINIO_ROOT_USER=minioadmin                   # MinIO user
      - MINIO_ROOT_PASSWORD=minioadmin               # MinIO password
    volumes:
      - /opt/minio/data:/data                        # Maps a data volume for storing MinIO data
      - /opt/minio/config:/root/.minio/certs         # Maps a configuration volume for storing MinIO certificates
    command: server /data --console-address ":9090"  # Starts the MinIO server and specifies the console address
    restart: always                                  # Container restart policy, always restarts the container

MinIO 简单使用

Console 控制台操作

  1. 登录 MinIO 控制台

  2. 创建一个存储桶

  3. 从本地上传一张图片

  1. 等待上传完毕
  1. 观察下数据卷的变化
bash 复制代码
root@app-server:~# tree /opt/minio/
/opt/minio/
├── config                       # MinIO 对象存储服务器的配置目录
│   ├── CAs
│   ├── private.key              # 私钥文件
│   └── public.crt               # 公钥证书文件
└── data                         # MinIO 对象存储服务器的数据目录
    └── images                   # 创建的 bucket 存储桶
        └── portal.jpeg          # 原文件被分成多个部分,并以 UUID 作为子目录的名称
            ├── dff78ec9-c903-483f-a4c9-10ce67a29cda
            │   └── part.1       # 文件分片
            └── xl.meta          # xl.meta 文件是与原文件相关的元数据文件,如文件大小、创建日期等

7 directories, 4 files

开启 TLS 访问

以下是使用 OpenSSL 生成自签名证书,用于在本地 "MacOS 环境下" 进行 HTTPS 的测试方案。

虽然这是一个自签名证书,但在受信任的第三方机构中可能不会被接受,因此仅适用于测试、开发或内部使用等目的。建议在生产环境中使用由受信任的证书颁发机构(CA)签发的证书。

在浏览器兼容性方面,新版本主要针对域名认证放弃了 Common Name (CN) 字段,因此该部分会介绍使用 Subject Alternative Name (SAN),以支持当前流行的主流浏览器。

SAN 是 SSL 标准 x509 中定义的扩展。通过使用 SAN 字段的 SSL 证书,可以扩展该证书支持的域名,使其能够解析多个不同域名。

CA 根证书制作

  1. 生成根证书密钥
bash 复制代码
# 建议长度为4096
root@app-server:~# openssl genrsa -out ca.key 4096
  1. 生成自签名根证书
bash 复制代码
# 在此过程中,需要交互回答一些关于组织、共享主题以及其他必要信息的问题
root@app-server:~# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN                             # Country/Region 的两个字母代码
State or Province Name (full name) [Some-State]:Beijing          # 省/州全名
Locality Name (eg, city) []:Beijing                              # 城市名称
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tech  # 组织名称
Organizational Unit Name (eg, section) []:infra                  # 组织单位名称
Common Name (e.g. server FQDN or YOUR name) []:mystic.tech       # 颁发者名字
Email Address []:mystic.tech@mail.com                            # 邮箱地址

使用根证书来签署子证书

  1. 生成证书密钥
bash 复制代码
root@app-server:~# openssl genrsa -out minio-server.key 4096
  1. 填写 OpenSSL 配置文件以添加 SANs
bash 复制代码
root@app-server:~# cat minio-san.conf
[req]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = CN                 # 国家代码
stateOrProvinceName = Beijing    # 省份名称
localityName = Beijing           # 城市名称
organizationName = Tech          # 公司名称
commonName = minio-console.net   # 域名或 IP 地址

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = minio-console.net        # DNS 域名解析
DNS.2 = www.minio-console.net
IP.1 = 10.2.102.244              # IP 地址
  1. 创建 CSR 证书请求,它将包含在证书中的信息
bash 复制代码
# 推荐使用 sha256 算法
root@app-server:~# openssl req -new -key minio-server.key -out minio-server.csr -config minio-san.conf -sha256
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
CN []:CN
Beijing []:Beijing
Beijing []:Beijing
Tech []:Tech
minio-console.net []:minio-console.net

# 检查 CSR 信息
root@app-server:~# openssl req -text -in minio-server.csr | grep -A 4 "Attributes"
        Attributes:
            Requested Extensions:
                X509v3 Subject Alternative Name:
                    DNS:minio-console.net, DNS:www.minio-console.net, IP Address:10.2.102.244
    Signature Algorithm: sha256WithRSAEncryption
  1. 使用私钥和 CSR 创建证书:
bash 复制代码
# 使用私钥签署 CSR,生成一个有效期为 10 年的自签名证书
root@app-server:~# openssl x509 -req -days 3650 -in minio-server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out minio-server.crt -extfile minio-san.conf -extensions v3_req
Certificate request self-signature ok
subject=C = CN, ST = Beijing, L = Beijing, O = Tech, CN = minio-console.net

# 检查证书相关信息
root@app-server:~# openssl x509 -text -in minio-server.crt | grep -A 6 "X509v3 extensions"
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:minio-console.net, DNS:www.minio-console.net, IP Address:10.2.102.244
            X509v3 Subject Key Identifier:
                A8:48:0D:8F:6A:7A:E4:E2:FB:5C:B7:19:49:FB:13:1E:72:1B:CC:81
            X509v3 Authority Key Identifier:
                C9:51:42:CF:36:58:93:80:49:41:4F:1F:90:AE:FA:44:67:8D:9B:F9

MinIO 证书配置使生效

  1. 将私/公钥证书文件拷贝到 MinIO/root/.minio/certs 文件夹,分别取名为 private.keypublic.crt
bash 复制代码
# 将 private.key 拷贝到 /opt/minio/config/ 目录
root@app-server:~# cp -a minio-server.key /opt/minio/config/private.key

# 将 public.crt 拷贝到 /opt/minio/config/ 目录
root@app-server:~# cp -a minio-server.crt /opt/minio/config/public.crt

# 验证拷贝结果
root@app-server:~# ll /opt/minio/config/
total 12
drwx------ 2 root root 4096 Nov 30 00:20 CAs
-rw------- 1 root root 3268 Dec  1 02:29 private.key
-rw-r--r-- 1 root root 2098 Dec  1 02:44 public.crt
  1. 重启容器,加载配置:
bash 复制代码
# 使用 docker-compose 重启容器
root@app-server:~# docker-compose restart
Restarting minio-server ... done

# 查看容器日志
root@app-server:~# docker-compose logs
minio-server | Exiting on signal: TERMINATED
minio-server | WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables
minio-server | MinIO Object Storage Server
minio-server | Copyright: 2015-2023 MinIO, Inc.
minio-server | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
minio-server | Version: RELEASE.2023-11-20T22-40-07Z (go1.21.4 linux/amd64)
minio-server |
minio-server | Status:         1 Online, 0 Offline.
minio-server | S3-API: https://172.24.0.2:9000  https://127.0.0.1:9000     # 可以看到访问协议已从http改为https
minio-server | Console: https://172.24.0.2:9090 https://127.0.0.1:9090
minio-server |
minio-server | Documentation: https://min.io/docs/minio/linux/index.html
minio-server | Warning: The standard parity is set to 0. This can lead to data loss.

本地安装证书并验证

  1. 本地添加 hosts 解析,以及 ping 测试
bash 复制代码
➜ ~ echo "10.2.102.244   app-server   minio-console.net" | sudo tee -a /etc/hosts
Password: xxx
10.2.102.244   app-server   minio-console.net

➜ ~ ping -c 3 minio-console.net
PING app-server (10.2.102.244): 56 data bytes
64 bytes from 10.2.102.244: icmp_seq=0 ttl=50 time=112.644 ms
64 bytes from 10.2.102.244: icmp_seq=1 ttl=50 time=14.433 ms
64 bytes from 10.2.102.244: icmp_seq=2 ttl=50 time=70.070 ms

--- app-server ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 14.433/65.716/112.644/40.213 ms
  1. public.crt 拉取到本地 MacOS
bash 复制代码
➜ ~ scp root@app-server:/opt/minio/config/public.crt Downloads/
public.crt                                                      100% 2098    61.7KB/s   00:00
➜ ~ ll Downloads/public.crt
-rw-r--r--  1 mystic  staff  2098 12  1 19:00 Downloads/public.crt
  1. 图形化操作或如下命令打开进行安装,需要输入密码
  1. 打开钥匙串 -> 双击目标条目 -> 始终信任此证书 -> 关闭窗口
  1. 重新登陆控制台,可以点击浏览器访问栏查看证书(该连接是安全的 HTTPS

mc 客户端命令

MinIO Client(mc)为 ls、cat、cp、mirror、diff、find 等 UNIX 命令提供了现代替代方案。它支持文件系统和与 Amazon S3 兼容的云存储服务(AWS Signature v2 和 v4)。

MacOS Brew 安装

bash 复制代码
➜ ~ brew install minio/stable/mc

mc 帮助手册

bash 复制代码
NAME:
  mc - 对象存储和文件系统的 MinIO 客户端

USAGE:
  mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]

COMMANDS:
  alias      管理配置文件中的服务器凭据
  ls         列出桶和对象
  mb         创建一个桶
  rb         删除一个桶
  cp         复制对象
  mv         移动对象
  rm         删除对象
  mirror     同步对象到远程站点
  cat        显示对象内容
  head       显示对象的前 n 行
  pipe       将 STDIN 流传输到对象
  find       搜索对象
  sql        在对象上运行 SQL 查询
  stat       显示对象元数据
  tree       以树状格式列出桶和对象
  du         递归统计磁盘使用情况
  retention  为对象设置持有
  legalhold  管理对象的合法持有
  support    支持相关命令
  license    许可证相关命令
  share      生成临时访问对象的 URL
  version    管理桶版本控制
  ilm        管理桶生命周期
  quota      管理桶配额
  encrypt    管理桶加密配置
  event      管理对象通知
  watch      监听对象通知事件
  undo       撤销 PUT/DELETE 操作
  anonymous  管理对桶和对象的匿名访问
  tag        管理桶和对象的标签
  diff       列出两个桶之间对象名称、大小和日期的差异
  replicate  配置服务器端桶复制
  admin      管理 MinIO 服务器
  idp        管理 MinIO 身份提供者服务器配置
  update     将 mc 更新到最新版本
  ready      检查集群是否就绪
  ping       执行活性检查
  od         测量单个流的上传和下载
  batch      管理批处理作业

GLOBAL FLAGS:
  --autocompletion              为您的 Shell 安装自动补全功能
  --config-dir value, -C value  配置文件夹的路径 (默认值: "/Users/xxx/.mc") [$MC_CONFIG_DIR]
  --quiet, -q                   禁用进度条显示 [$MC_QUIET]
  --no-color                    禁用颜色主题 [$MC_NO_COLOR]
  --json                        启用 JSON 行格式化输出 [$MC_JSON]
  --debug                       启用调试输出 [$MC_DEBUG]
  --insecure                    禁用 SSL 证书验证 [$MC_INSECURE]
  --limit-upload value          限制以 KiB/s、MiB/s、GiB/s 的最大速率上传 (默认值: 无限制) [$MC_LIMIT_UPLOAD]
  --limit-download value        限制以KiB/s、MiB/s、GiB/s的最大速率下载。(默认值:无限制) [$MC_LIMIT_DOWNLOAD]
  --help, -h                    显示帮助
  --version, -v                 打印版本

TIP:
  使用 'mc --autocompletion' 启用Shell自动补全

COPYRIGHT:
  Copyright (c) 2015-2023 MinIO, Inc.

LICENSE:
  GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>

mc 常用操作

  • 添加一个存储服务配置
bash 复制代码
# 添加一个存储服务到 mc 的配置文件
➜ ~ mc config host add minioserver http://10.2.102.244:9000 minioadmin minioadmin --api s3v4
Added `minioserver` successfully.

# 查看配置文件相关信息(注意:这里如果想要精确匹配内容,需本地安装 jq 命令)
➜ ~ cat ~/.mc/config.json | jq '.aliases.minioserver'
{
  "url": "http://10.2.102.244:9000",
  "accessKey": "minioadmin",
  "secretKey": "minioadmin",
  "api": "s3v4",
  "path": "auto"
}

# 检查配置的存储服务
➜ ~ mc config host list minioserver
minioserver
  URL       : http://10.2.102.244:9000
  AccessKey : minioadmin
  SecretKey : minioadmin
  API       : s3v4
  Path      : auto
  • 列出存储服务中的存储桶和对象
bash 复制代码
# 列出存储桶信息
➜ ~ mc ls minioserver
[2023-11-30 23:53:28 CST]     0B images/

# 以 json 格式输出信息
➜ ~ mc ls minioserver --json
{
 "status": "success",
 "type": "folder",
 "lastModified": "2023-11-30T23:53:28.699+08:00",
 "size": 0,
 "key": "images/",
 "etag": "",
 "url": "http://10.2.102.244:9000/",
 "versionOrdinal": 1
}

# 列出指定存储桶中的对象信息
➜ ~ mc ls minioserver/images
[2023-11-30 23:55:58 CST] 5.0MiB STANDARD portal.jpeg
  • 移动指定的对象到目标位置
bash 复制代码
# 移动本地文件到远端
➜ ~ mc mv Downloads/output.png minioserver/images
/Users/mystic/Downloads/output.png:   1.18 MiB / 1.18 MiB ━━━━━━━━━━━━━━━━━━━━━━ 2.39 MiB/s 0s

# 检查本地文件
➜ ~ ll Downloads/output.png
ls: Downloads/output.png: No such file or directory

# 检查远端对象文件
➜ ~ mc ls minioserver/images/output.png
[2023-12-01 12:52:38 CST] 1.2MiB STANDARD output.png

# 删除远端对象文件
➜ ~ mc rm minioserver/images/output.png
Removed `minioserver/images/output.png`.

Go SDK 操作

详细用法请参考官方指南:min.io/docs/minio/...

  • 安装 sdk
bash 复制代码
go get github.com/minio/minio-go/v7
  • 示例代码:
go 复制代码
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/credentials"
)

const (
    // MinIO 主机地址
    endpoint = "minio-console.net:9000"

    // 登录账号
    accessKeyID = "minioadmin"

    // 登录口令
    secretAccessKey = "minioadmin"

    // 使用 HTTPS 协议
    useSSL = true

    // 指定查询的存储桶名称
    bucketName = "images"
)

func main() {
    // 初始化 MinIO 客户端对象
    minioClient, err := minio.New(endpoint, &minio.Options{
        Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
        Secure: useSSL,
    })
    if err != nil {
        log.Fatalf("Connection failed: %v\n", err)
    }
    log.Println("minioClient connected successfully")

    // 检查是否存在存储桶
    ctx := context.Background()
    isExist, err := minioClient.BucketExists(ctx, bucketName)
    if err != nil {
        log.Fatalf("Error: %v\n", err)
    }

    // 如果有指定的存储桶
    if isExist {
        // 遍历存储桶下的对象
        objectCh := minioClient.ListObjects(ctx, bucketName, minio.ListObjectsOptions{
            Recursive: true,
        })
        for object := range objectCh {
            if object.Err != nil {
                log.Fatalln(object.Err)
            }
            fmt.Printf("%s - %s\n", bucketName, object.Key)
        }
    } else {
        fmt.Printf("the '%s' bucket isn't exist???\n", bucketName)
    }
}
  • output 输出:
output 复制代码
2023/12/01 19:32:09 minioClient connected successfully
images - portal.jpeg
相关推荐
耶啵奶膘1 小时前
uniapp-是否删除
linux·前端·uni-app
NiNg_1_2341 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
2401_850410832 小时前
文件系统和日志管理
linux·运维·服务器
XMYX-02 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man3 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
二十雨辰4 小时前
[linux]docker基础
linux·运维·docker
customer084 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源