热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Minio——docker

简介MinIO是在ApacheLicensev2.0下发布的对象存储服务器。它与AmazonS3云存储服务兼容。它最适合存储非结构化数据,如照片,视频
简介
  • MinIO 是在 Apache License v2.0 下发布的对象存储服务器。 它与 Amazon S3 云存储服务兼容。 它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM 映像。 对象的大小可以从几 KB 到最大 5TB。
  • MinIO 服务器足够轻,可以与应用程序堆栈捆绑在一起,类似于 NodeJS,Redis 和 MySQL
  • 一种高性能的分布式对象存储服务器,用于大型数据基础设施。它是机器学习和其他大数据工作负载下Hadoop HDFS 的理想 s3 兼容替代品

安装(2021-04-18T19-26-29Z)

docker pull minio/minio:RELEASE.2021-04-18T19-26-29Z

运行MinIO 自定义 Access(至少三位) 和 Secret (至少8位)密钥要覆盖 MinIO 的自动生成的密钥,将 Access 和 Secret 密钥设为环境变量。MinIO 允许常规字符串作为 Access 和 Secret 密钥

docker run -p 9000:9000 --name=cg_minio -d --restart=always -e "MINIO_ACCESS_KEY=cgadmin" -e "MINIO_SECRET_KEY=cgadmin2022" -v /root/minio/data:/data -v /root/minio/config:/root/.minio minio/minio:RELEASE.2021-04-18T19-26-29Z server /data

登录:

http://192.168.220.130:9000

 

 springboot整合minio

导入依赖

io.miniominio8.0.3

修改配置文件

spring:# 配置文件上传大小限制servlet:multipart:max-file-size: 200MBmax-request-size: 200MB
minio:endpoint: http://192.168.220.110:9000accessKey: cgadminsecretKey: cgadmin2022secure: falseimgSize: 1024 # 图片大小限制,单位:mfileSize: 1024 # 文件大小限制,单位:mshareBucketName: pet-photo-bucketvideoShareBucketName: pet-video-bucket# 雪花算法配置
code:worker_id: 2datacenter_id: 22

配置实体类

@Component
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties{/*** 是否开启*/private Boolean enabled;/*** 存储对象服务器类型*/private OssType type;/*** OSS 访问端点,集群时需提供统一入口*/private String endpoint;/*** 用户名*/private String accessKey;/*** 密码*/private String secretKey;}

存储对象服务器枚举

@Getter
@AllArgsConstructor
public enum OssType {/*** Minio 对象存储*/MINIO("minio", 1),/*** 华为 OBS*/OBS("obs", 2),/*** 腾讯 COS*/COS("tencent", 3),/*** 阿里巴巴 SSO*/ALIBABA("alibaba", 4),;/*** 名称*/final String name;/*** 类型*/final int type;
}

配置类

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({MinioClient.class})
@EnableConfigurationProperties({MinioProperties.class, CodeProperties.class})
@ConditionalOnExpression("${minio.enabled}")
@ConditionalOnProperty(value = "minio.type", havingValue = "minio")
public class MinioConfiguration {@Bean@SneakyThrows@ConditionalOnMissingBean(MinioClient.class)public MinioClient minioClient(MinioProperties minioProperties) {return MinioClient.builder().endpoint(minioProperties.getEndpoint()).credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey()).build();}@Bean@ConditionalOnBean({MinioClient.class})@ConditionalOnMissingBean(MinioUtil.class)public MinioUtil minioUtil(MinioClient minioClient, MinioProperties minioProperties, CodeProperties codeProperties) {return new MinioUtil(minioClient, minioProperties,codeProperties);}}

工具类

@Slf4j
@AllArgsConstructor
public class MinioUtil {/*** MinIO 客户端*/private MinioClient minioClient;/*** MinIO 配置类*/private MinioProperties minioProperties;/*** 订单号*/private CodeProperties codeProperties;/*** 查询所有存储桶** @return Bucket 集合*/@SneakyThrowspublic List listBuckets() {return minioClient.listBuckets();}/*** 桶是否存在** @param bucketName 桶名* @return 是否存在*/@SneakyThrowspublic boolean bucketExists(String bucketName) {return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());}/*** 创建存储桶** @param bucketName 桶名*/@SneakyThrowspublic void makeBucket(String bucketName) {if (!bucketExists(bucketName)) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}}/*** 删除一个空桶 如果存储桶存在对象不为空时,删除会报错。** @param bucketName 桶名*/@SneakyThrowspublic void removeBucket(String bucketName) {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());}/*** description: 上传文件** @author: CG* @date: 2022/4/20* @params:* @Param multipartFile:* @Param bucketName:* @return:* @return: java.lang.String*/@SneakyThrowspublic String pullObject(MultipartFile multipartFile, String bucketName) {String fileExt = FileUtil.extName(multipartFile.getOriginalFilename());String uuidFileName = generateOssUuidFileName(fileExt);InputStream inputStream = multipartFile.getInputStream();String fileType = multipartFile.getContentType();System.out.println(fileExt + "--" + fileType);try {Assert.isTrue(bucketExists(bucketName), "桶不存在");minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(uuidFileName).stream(inputStream, inputStream.available(), -1).contentType(fileType).build());return StrUtil.SLASH + bucketName + StrUtil.SLASH + uuidFileName;} finally {inputStream.close();}}/*** 返回临时带签名、过期时间一天、Get请求方式的访问URL** @param bucketName 桶名* @param ossFilePath Oss文件路径* @return*/@SneakyThrowspublic String getPresignedObjectUrl(String bucketName, String ossFilePath) {return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(ossFilePath).expiry(60 * 60 * 24).build());}/*** GetObject接口用于获取某个文件(Object)。此操作需要对此Object具有读权限。** @param bucketName 桶名* @param ossFilePath Oss文件路径*/@SneakyThrowspublic InputStream getObject(String bucketName, String ossFilePath) {return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(ossFilePath).build());}/*** 查询桶的对象信息** @param bucketName 桶名* @param recursive 是否递归查询* @return*/@SneakyThrowspublic Iterable> listObjects(String bucketName, boolean recursive) {return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).recursive(recursive).build());}/*** 生成随机文件名,防止重复** @return*/public String generateOssUuidFileName(String fileExt) {Snowflake snowflake = IdUtil.getSnowflake(codeProperties.getWorkerId(), codeProperties.getDatacenterId());String resourceCodeNum = snowflake.nextIdStr();returnDateUtil.format(new Date(), "yyyy/MM/dd") +StrUtil.SLASH +resourceCodeNum +StrUtil.C_DOT +fileExt;}/*** 获取带签名的临时上传元数据对象,前端可获取后,直接上传到Minio** @param bucketName* @param fileName* @return*/@SneakyThrowspublic Map getPresignedPostFormData(String bucketName, String fileName) {// 为存储桶创建一个上传策略,过期时间为7天PostPolicy policy = new PostPolicy(bucketName, ZonedDateTime.now().plusDays(7));// 设置一个参数key,值为上传对象的名称policy.addEqualsCondition("key", fileName);// 添加Content-Type以"image/"开头,表示只能上传照片policy.addStartsWithCondition("Content-Type", "image/");// 设置上传文件的大小 64kiB to 10MiB.policy.addContentLengthRangeCondition(64 * 1024, 10 * 1024 * 1024);return minioClient.getPresignedPostFormData(policy);}}

service

public void upResource(String resourceDescribe, MultipartFile multipartFile, String bucketName) {String resourcePath = minioUtil.pullObject(multipartFile, bucketName);Assert.notEmpty(resourcePath, "资源上传失败");}
controller

@PostMapping(value = "{bucket-name}", headers = "content-type=multipart/form-data")@ApiOperation(value = "资源上传", response = ResultDTO.class)@ApiImplicitParams({@ApiImplicitParam(value = "资源描述", name = "resourceDescribe", required = true, paramType = "query", dataType = "String"),@ApiImplicitParam(value = "minio桶名称", name = "bucket-name", required = true, paramType = "path", dataType = "String"),})public ResultDTO resourceUp(@NotNull String resourceDescribe, @NotNull @ApiParam(name = "multipartFile", value = "资源文件", required = true) MultipartFile multipartFile, @PathVariable("bucket-name") @NotNull String bucketName) {service.upResource(resourceDescribe, multipartFile, bucketName);return ResultDTO.success();}


推荐阅读
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
author-avatar
潘巧军_837
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有