Краткое описание FastDFS
FastDFS — это распределённая файловая система с открытым исходным кодом, разработанная на чистом языке C. FastDFS представляет собой легковесную распределённую файловую систему с открытым исходным кодом для управления файлами, которая включает функции: хранение файлов, синхронизация файлов, доступ к файлам (загрузка и скачивание файлов) и решает проблемы хранения больших объёмов данных и балансировки нагрузки. Особенно подходит для онлайн-сервисов, использующих файлы в качестве носителя, таких как фотохостинги и видеохостинги. Официальный форум http://bbs.chinaunix.net/forum-240-1.html
Поскольку предоставленный официальной командой код Java-клиента не реализует пул соединений (возникнут проблемы с производительностью при высоком параллелизме), а стиль кода, предоставленного официальной командой, похож на язык C, структура не очень хороша, и его трудно использовать в онлайн-проектах. Поэтому был написан собственный код на основе официального, а также вдохновением послужил проект [FastDFS_Client] на GitHub.
[FastDFS_Client] имеет недостаток, заключающийся в том, что он зависит от слишком большого количества фреймворков (зависит от SpringBoot, commons-io, commons-pool2, hibernate-validator, thumbnailator и т. д.), что не подходит ни для отдельного использования, ни для гибкого использования, поэтому была проведена переработка исходного кода проекта, после чего осталась только зависимость от commons-pool2.
Основные характеристики
Описание структуры пакетов
cfg - конфигурационные параметры (не используются)
client - упаковка StorageClient и TrackerClient
conn - информация о соединениях с сервером
constant - определение коммуникационных констант
exception - определение исключений
mapper - отображение запросов и ответов данных в model
model - упаковка модели запроса и ответа
pool - параметры пула соединений
protocol - протокол запроса и ответа
storage - storage протокол запроса и ответа
tracker - tracker протокол запроса и ответа
utils - определения классов инструментов
Обзор основных интерфейсов
Connection - интерфейс подключения к серверу
ProtocolHead - заголовок данных протокола запроса и ответа
BaseRequest - интерфейс объекта запроса
BaseResponse - интерфейс объекта ответа
BaseCommand - интерфейс выполнения команд
AbstractCommand - абстрактный класс выполнения команд
StorageCommand - абстрактный класс команд storage
TrackerCommand - абстрактный класс команд tracker
CommandExecutor - интерфейс исполнителя команд (используется для выполнения команд)
DownloadCallback - интерфейс обратного вызова загрузки файла
StorageClient - клиент storage (упаковка различных операций с сервером Storage)
TrackerClient - трекер-клиент (упаковка различных операций с трекером-сервером)
// 1. Создание фабрики соединений (пользователь создаёт новое соединение)
PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(500, 500);
// 2. Конфигурация пула соединений
GenericKeyedObjectPoolConfig conf = new GenericKeyedObjectPoolConfig();
conf.setMaxTotal(200);
conf.setMaxTotalPerKey(200);
conf.setMaxIdlePerKey(100);
// 3. Пул соединений
ConnectionPool connectionPool = new ConnectionPool(pooledConnectionFactory, conf);
Set<String> trackerSet = new HashSet<String>();
trackerSet.add("192.168.10.128:22122");
// 4. Исполнитель команд
DefaultCommandExecutor commandExecutor = new DefaultCommandExecutor(trackerSet, connectionPool);
// 5. Трекер-клиент
TrackerClient trackerClient = new DefaultTrackerClient(commandExecutor);
// 6. Клиент storage
StorageClient storageClient = new DefaultStorageClient(commandExecutor, trackerClient);
// 7. Получение информации о узле Storage сервера через трекер-клиент
StorageNode storageNode = trackerClient.getStorageNode("group1");
// 8. Получение информации о файле
StorageNodeInfo storageNodeInfo = trackerClient.getFetchStorage("group1", "M00/00/00/wKg4i1gxz_6AIPPsAAiCQSk77jI661.png");
// 9. Загрузка файла
File file = new File("F:\\123456.txt");
FileInputStream fileInputStream = FileUtils.openInputStream(file);
StorePath storePath = storageClient.uploadFile("group1", fileInputStream, file.length(), "txt");
// 10. Скачивание файла
DownloadFileWriter downloadFileWriter = new DownloadFileWriter("F:\\123.xlsx");
String filePath = storageClient.downloadFile("group1", "M00/00/00/wKgKgFg02TaAY3mTADCUhuWQdRc53.xlsx", downloadFileWriter);
// ... дополнительные операции
// 11. Закрытие пула соединений
connectionPool.close();
cleverframe-filemanager.properties
файл конфигурации
# IP-адрес сервера Tracker
fileupload.FastDFS.trackers=192.168.10.128:22122,192.168.10.129:22122
# Настройка времени ожидания соединения
fileupload.FastDFS.soTimeout=10000
# Установка таймаута соединения
fileupload.FastDFS.connectTimeout=5000
# Максимальное количество соединений в пуле
fileupload.FastDFS.maxTotal=200
# Максимальное количество подключений на ключ в пуле
fileupload.FastDFS.maxTotalPerKey=200
# Максимальное количество незанятых подключений на ключ (влияет на производительность при параллельной работе)
fileupload.FastDFS.maxIdlePerKey=50
spring-context-filemanager.xml
файл конфигурации
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"
default-lazy-init="false">
<!--Конфигурация пула FastDFS-->
<bean id="fastDfsConnectionPool" class="org.cleverframe.fastdfs.pool.ConnectionPool" destroy-method="close">
<constructor-arg index="0" type="org.apache.commons.pool2.KeyedPooledObjectFactory">
<bean
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )