一文带你玩转FastDFS
点击上方☝SpringForAll社区 轻松关注!
本文来源:http://rrd.me/g4rnk
对于fastdfs的具体介绍网络上资料很多,同时对于本地在虚拟机上搭建fastdfs前面文章介绍过了,这里不再多说,用最简单的业务逻辑介绍fastdfs文件服务器的使用。
微服务结构
fastdfs-parent 父模块
feign模块 用于其他微服务与fastdfs-server模块fastdfs文件服务器通信
fastdfs-server微服务模块
实现业务流程
这里以saas模式入驻的注册界面为例,通过文件上传方式(Element UI前端),将入驻公司的logo上传到fastdfs服务器,同时将文件上传到fastdfs的路径返回给后台,存储到数据库。
搭建fastdfs代码实现
模块环境配置
这里的maven依赖包括微服务注册中心,配置中心,网关等环境
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>cn.future</groupId>
<artifactId>hrm-basic-utils</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
</dependencies>
配置中心(远程仓库)的配置文件yml配置
#dataSource
spring:
application:
name: fastdfs-server
#注册到eureka-Server注册中心
server:
port: 2040
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:1010/eureka/
#表示eureka client间隔多久去拉取服务器注册信息,默认为30秒
registry-fetch-interval-seconds: 30
server:
#开启自我保护模式
enable-self-preservation: false
#清理无效节点,默认60*1000毫秒,即60秒
eviction-interval-timer-in-ms: 5000
instance:
prefer-ip-address: true
instance-id: fastdfs-server:2040
#eureka客户端需要多长时间发送心跳给eureka服务器,表明他仍然或者,默认30秒
lease-renewal-interval-in-seconds: 5
#eureka服务器在接受到实力的最后一次发出的心跳后,需要等待多久才可以将此实力删除
lease-expiration-duration-in-seconds: 10
metadata-map:
company-name: future
ribbon: #ribbon超时
ReadTimeout: 30000
ConnectTimeout: 30000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 30000
本地配置(bootstrap.yml)
#指向配置中心,拉取对应模块的配置文件
spring:
cloud:
config:
uri: http://localhost:1030 #本机模拟配置中心微服务 域名+端口
name: application-fastdfs-server-2040 #配置中心配置文件的名字
profile: dev #配置文件环境
fastdfs所需要的配置(fast_client.conf),用于本为服务来接fastdfs微服务的tracker
#tracker_server 访问地址
tracker_server=10.211.55.11:22122
fastdfs工具类,用来完成基本的文件上传和下载功能。
public class FastDfsApiOpr {
//读取配置文件信息
public static String CONF_FILENAME = FastDfsApiOpr.class.getClassLoader()
.getResource("fast_client.conf").getFile();
/**
* 上传文件
* @param file
* @param extName
* @return
*/
public static String upload(byte[] file,String extName) {
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
String fileIds[] = storageClient.upload_file(file,extName,null);
return "/"+fileIds[0]+"/"+fileIds[1];
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 下载文件
* @param groupName
* @param fileName
* @return
*/
public static byte[] download(String groupName,String fileName) {
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
byte[] b = storageClient.download_file(groupName, fileName);
return b;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 删除文件
* @param groupName
* @param fileName
*/
public static void delete(String groupName,String fileName){
try {
ClientGlobal.init(CONF_FILENAME);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getTrackerServer();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
int i = storageClient.delete_file(groupName,fileName);
System.out.println( i==0 ? "删除成功" : "删除失败:"+i);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("删除异常,"+e.getMessage());
}
}
}
controller层用来接收前台发来的上传入驻公司logo图片,同时返回该logo在fastdfs文件服务器的资源路径给前台,前台可以处理将该路径保存到数据库,以便后用。
@RestController
@RequestMapping("/fastdfs")
public class FastDfsController {
/*
* 上传文件到文件服务器
*/
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public AjaxResult upload(MultipartFile file) {
try {
//获取文件后缀
String fileExtName = FilenameUtils.getExtension(file.getOriginalFilename());
//上传
String filePath = FastDfsApiOpr.upload(file.getBytes(), fileExtName);
return AjaxResult.me().setResultObj(filePath);
} catch (IOException e) {
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage("上传失败!");
}
}
}
将接口暴露给前台,直接调用就可以了。
● 面试官:ScheduleThreadPoolExecutor了解不?
不需要赞赏,点个在看,转发给你的好朋友吧!