第三课 Spring Cloud分布式微服务实战-开发文件服务
tags:
- Java
- 慕课网
categories:
- MinIO
- 内容安全
文章目录
第一节 文件服务器
1.1 文件服务器选择
- 文件存储的网络服务选择有很多,比如阿里云OSS、七牛云、腾讯云等等, 有收费。
- fastDFS安装部署(运维)复杂度高,没有官方文档,维护比较麻烦。
- MinIO文档: http://docs.minio.org.cn/docs/ 开箱即用,UI页面,性能高。MinIO号称是世界上速度最快的对象存储服务器。在标准硬件上,对象存储的读/写速度最高可以达到183 GB/s和171 GB/s。文档齐全社区活跃。这里我们就选它(开箱即用)
- ceph 学习成本高 运维部署复杂。
- 一些分布式储存对比:https://www.cxyzjd.com/article/qq_32811865/107926890
1.2 部署MinIO
- 访问 web 管理页面: http://192.168.44.128:6090/login
- 创建bucket, 设置权限为public, 上传图片测试,访问路径这里注意是9000端口:http://192.168.44.128:9000/imooc/aa.png
- 如果权限为private,最多只有七天的分享访问时间。
sudo docker run -d -p 9000:9000 -p 6090:9090 --name minio1 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=123456789" \
-v /mnt/data:/data \
--restart=always \
minio/minio server /data --console-address ':9090'
第二节 MinIO文件上传
2.1 创建文件服务Module
- 创建Module, 名称为
imooc-news-dev-service-files
。和user一样引入api模块。
<!-- imooc-news-dev-service-files
文件服务, 文件相关的服务都在此服务中进行,比如文件上传,文件下载-->
<artifactId>imooc-news-dev-service-files</artifactId>
<dependencies>
<dependency>
<groupId>com.imooc</groupId>
<artifactId>imooc-news-dev-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
- 先把配置文件和日志配置拿过来改一改。加上上传文件大小的限制。
servlet:
multipart:
max-file-size: 512000 # 请求文件大小限制为500k
max-request-size: 512000
- 把启动类和HelloWorld控制器拿过来,启动运行测试看看是否成功。发现报错
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
- 因为我们把yaml文件中数据源的相关信息删除了,files文件服务中用不到数据源的东西。但是我们在common服务中配置了数据源的驱动, 所以它也会引用到。解决办法:自动装配时候排除某数据源的自动装配。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- common中引入MinIO的依赖包。
<!-- 文件上传minio工具 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.2 整合MinIO的service实现
- 创建
com.imooc.files.service.UploaderService
接口。
package com.imooc.files.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public interface UploaderService {
public String uploadMinIO(MultipartFile file) throws IOException, NoSuchAlgorithmException, InvalidKeyException;
}
- 配置
application.yaml
将minio的配置写到其中加载到容器中。
minio:
endpoint: http://192.168.44.128:9000
accessKey: MinIOAdmin
secretKey: MinIOAdmin
bucketName: "imooc"
- 在中
com.imooc.files.utils.MinioProp
写一个MinioProp的bean。把配置放到容器中。
package com.imooc.files.utils;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
private String endpoint;
private String accesskey;
private String secretKey;
private String bucketName;
}
- 写一个实现类
com.imooc.files.service.impl.UploaderServiceImpl
。@Service把实现类注入到容器中。
package com.imooc.files.service.impl;
import com.imooc.exception.GraceException;
import com.imooc.files.service.UploaderService;
import com.imooc.files.utils.MinioProp;
import com.imooc.grace.result.ResponseStatusEnum;
import io.minio.*;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.UUID;
import java.io.IOException;
import java.io.InputStream;
import