查看原文
其他

一文带你玩转FastDFS

丶为来 SpringForAll社区 2021-05-27

点击上方☝SpringForAll社区 轻松关注!

及时获取有趣有料的技术文章

本文来源:http://rrd.me/g4rnk


对于fastdfs的具体介绍网络上资料很多,同时对于本地在虚拟机上搭建fastdfs前面文章介绍过了,这里不再多说,用最简单的业务逻辑介绍fastdfs文件服务器的使用。

  • 微服务结构

  • fastdfs-parent 父模块

  • feign模块 用于其他微服务与fastdfs-server模块fastdfs文件服务器通信

    • fastdfs-server微服务模块

  • 实现业务流程

  • 这里以saas模式入驻的注册界面为例,通过文件上传方式(Element UI前端),将入驻公司的logo上传到fastdfs服务器,同时将文件上传到fastdfs的路径返回给后台,存储到数据库。

  • 搭建fastdfs代码实现

  • 模块环境配置

  • 这里的maven依赖包括微服务注册中心,配置中心,网关等环境

  1. <dependencies>

  2. <dependency>

  3. <groupId>org.springframework.cloud</groupId>

  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  5. </dependency>

  6. <dependency>

  7. <groupId>org.springframework.boot</groupId>

  8. <artifactId>spring-boot-starter-web</artifactId>

  9. </dependency>

  10. <dependency>

  11. <groupId>org.springframework.cloud</groupId>

  12. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>

  13. </dependency>

  14. <dependency>

  15. <groupId>org.csource</groupId>

  16. <artifactId>fastdfs-client-java</artifactId>

  17. </dependency>

  18. <dependency>

  19. <groupId>commons-io</groupId>

  20. <artifactId>commons-io</artifactId>

  21. </dependency>

  22. <dependency>

  23. <groupId>org.springframework.cloud</groupId>

  24. <artifactId>spring-cloud-config-client</artifactId>

  25. </dependency>

  26. <dependency>

  27. <groupId>cn.future</groupId>

  28. <artifactId>hrm-basic-utils</artifactId>

  29. </dependency>

  30. <dependency>

  31. <groupId>io.springfox</groupId>

  32. <artifactId>springfox-swagger2</artifactId>

  33. </dependency>

  34. <dependency>

  35. <groupId>io.springfox</groupId>

  36. <artifactId>springfox-swagger-ui</artifactId>

  37. </dependency>

  38. </dependencies>

  • 配置中心(远程仓库)的配置文件yml配置

  1. #dataSource

  2. spring:

  3. application:

  4. name: fastdfs-server


  5. #注册到eureka-Server注册中心

  6. server:

  7. port: 2040


  8. eureka:

  9. client:

  10. serviceUrl:

  11. defaultZone: http://eureka-server:1010/eureka/

  12. #表示eureka client间隔多久去拉取服务器注册信息,默认为30秒

  13. registry-fetch-interval-seconds: 30

  14. server:

  15. #开启自我保护模式

  16. enable-self-preservation: false

  17. #清理无效节点,默认60*1000毫秒,即60秒

  18. eviction-interval-timer-in-ms: 5000

  19. instance:

  20. prefer-ip-address: true

  21. instance-id: fastdfs-server:2040

  22. #eureka客户端需要多长时间发送心跳给eureka服务器,表明他仍然或者,默认30秒

  23. lease-renewal-interval-in-seconds: 5

  24. #eureka服务器在接受到实力的最后一次发出的心跳后,需要等待多久才可以将此实力删除

  25. lease-expiration-duration-in-seconds: 10

  26. metadata-map:

  27. company-name: future

  28. ribbon: #ribbon超时

  29. ReadTimeout: 30000

  30. ConnectTimeout: 30000

  31. hystrix:

  32. command:

  33. default:

  34. execution:

  35. isolation:

  36. thread:

  37. timeoutInMilliseconds: 30000

  • 本地配置(bootstrap.yml)

  1. #指向配置中心,拉取对应模块的配置文件

  2. spring:

  3. cloud:

  4. config:

  5. uri: http://localhost:1030 #本机模拟配置中心微服务 域名+端口

  6. name: application-fastdfs-server-2040 #配置中心配置文件的名字

  7. profile: dev #配置文件环境

  • fastdfs所需要的配置(fast_client.conf),用于本为服务来接fastdfs微服务的tracker

  1. #tracker_server 访问地址

  2. tracker_server=10.211.55.11:22122

  • fastdfs工具类,用来完成基本的文件上传和下载功能。

  1. public class FastDfsApiOpr {


  2. //读取配置文件信息

  3. public static String CONF_FILENAME = FastDfsApiOpr.class.getClassLoader()

  4. .getResource("fast_client.conf").getFile();



  5. /**

  6. * 上传文件

  7. * @param file

  8. * @param extName

  9. * @return

  10. */

  11. public static String upload(byte[] file,String extName) {


  12. try {

  13. ClientGlobal.init(CONF_FILENAME);


  14. TrackerClient tracker = new TrackerClient();

  15. TrackerServer trackerServer = tracker.getTrackerServer();

  16. StorageServer storageServer = null;


  17. StorageClient storageClient = new StorageClient(trackerServer, storageServer);

  18. String fileIds[] = storageClient.upload_file(file,extName,null);


  19. return "/"+fileIds[0]+"/"+fileIds[1];


  20. } catch (Exception e) {

  21. e.printStackTrace();

  22. return null;

  23. }

  24. }

  25. /**

  26. * 下载文件

  27. * @param groupName

  28. * @param fileName

  29. * @return

  30. */

  31. public static byte[] download(String groupName,String fileName) {

  32. try {


  33. ClientGlobal.init(CONF_FILENAME);


  34. TrackerClient tracker = new TrackerClient();

  35. TrackerServer trackerServer = tracker.getTrackerServer();

  36. StorageServer storageServer = null;


  37. StorageClient storageClient = new StorageClient(trackerServer, storageServer);

  38. byte[] b = storageClient.download_file(groupName, fileName);

  39. return b;

  40. } catch (Exception e) {

  41. e.printStackTrace();

  42. return null;

  43. }

  44. }


  45. /**

  46. * 删除文件

  47. * @param groupName

  48. * @param fileName

  49. */

  50. public static void delete(String groupName,String fileName){

  51. try {

  52. ClientGlobal.init(CONF_FILENAME);


  53. TrackerClient tracker = new TrackerClient();

  54. TrackerServer trackerServer = tracker.getTrackerServer();

  55. StorageServer storageServer = null;


  56. StorageClient storageClient = new StorageClient(trackerServer,

  57. storageServer);

  58. int i = storageClient.delete_file(groupName,fileName);

  59. System.out.println( i==0 ? "删除成功" : "删除失败:"+i);

  60. } catch (Exception e) {

  61. e.printStackTrace();

  62. throw new RuntimeException("删除异常,"+e.getMessage());

  63. }

  64. }

  65. }

  • controller层用来接收前台发来的上传入驻公司logo图片,同时返回该logo在fastdfs文件服务器的资源路径给前台,前台可以处理将该路径保存到数据库,以便后用。

  1. @RestController

  2. @RequestMapping("/fastdfs")

  3. public class FastDfsController {


  4. /*

  5. * 上传文件到文件服务器

  6. */

  7. @RequestMapping(value = "/upload",method = RequestMethod.POST)

  8. public AjaxResult upload(MultipartFile file) {


  9. try {

  10. //获取文件后缀

  11. String fileExtName = FilenameUtils.getExtension(file.getOriginalFilename());

  12. //上传

  13. String filePath = FastDfsApiOpr.upload(file.getBytes(), fileExtName);

  14. return AjaxResult.me().setResultObj(filePath);

  15. } catch (IOException e) {

  16. e.printStackTrace();

  17. return AjaxResult.me().setSuccess(false).setMessage("上传失败!");

  18. }

  19. }

  20. }

  • 将接口暴露给前台,直接调用就可以了。





● 神操作自定义Annotation实现通用的接口自动幂等

● Zuul:构建高可用网关之多维度限流

● 阿里云发布新脚手架真香

● 解决Redis分布式锁业务代码超时导致锁失效问题

● 阿里云发布新脚手架真香

● Code Review最佳实践

● jedis用过没?讲讲原理呗

● Spring容器启动@Value属性无法注入?

● 聊聊Spring Bean实例化

● Spring IOC流程清楚不?聊聊看

● 面试官:ScheduleThreadPoolExecutor了解不?

● 配置中心只有Apollo么?看看点评的Lion

● 面试官说从源码角度说说Java线程池

● JedisPool连接池相关配置

● Hystrix初探

● 别再关注删库跑路了,谈谈数据库架构

● 那些年非常火的MyCAT是什么?

● Java14带来了许多新功能

                                       不需要赞赏,点个在看,转发给你的好朋友吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存