Как пройти (создать) библиотеку

Posted on: July 16th, 2011 by Spade No Comments »

Известный с детства любому мыслящему человеку принцип – решение сложной задачи необходимо разбить на решение более легких и менее объемных подзадач. В контексте программирования накладывается еще и must be reusable требование. Так рождается понятие библиотеки или фреймворка. Это не точные научные термины, и в общем мало кто знает чем они отличаются. Обычно библиотека просто упрощает работу с какой-то предметной областью, а фреймворк еще и добавляет функции и каркас для наиболее частых use cases. Но четко провести грань – что именно вы ваяете и что в итоге получилось – не всегда можно. Да и нужно ли?… Потому перейдем к практике – в серии статей мы опишем создание библиотек для работы с API интерфейсами известных вэб сервисов. И начнем с гиганта: встречайте в синем углу ринга – Amazon S3.

Не будем заниматься копипастом википедии и информации с оффсайта – достаточно расшифровать S3 – Simple Storage Service. Позволяет за смешные деньги хранить на их серверах файлы. Их можно загружать и скачивать. Есть функции управления доступом, иерархическая структура – подобие каталогов.

В целом это дает большой плюс не заморачиваться с хранением медиа контента на своем сайте (и траффика, которые он порождает) и кроме того решает известную проблему, которая волнует каждого newbie на тысячах форумов – «а де хранить картинки? Шо лучше – в базе или тупо в файловой системе пусть лежат?» (цитата от random guest). Кроме того, в распределенных системах исчезает лишняя морока – с синхронизацией файлов на серверах (остается только база – но это уже мало кого пугает). Таким образом мы просто храним в базе ссылки, а сами файлы – на S3.

Для регистрации нужна кредитка – тут большая часть посетителей ушла с этой статьи – после этого у нас появляется возможность войти в управляющую консоль – вэб интерфейс позволяющий выполнять основные операции. Далее требуется создать bucket – тут будут храниться ваши файлы – их можно создавать сколько угодно, одно требование – имя бакета должно иметь сквозную уникальность по всему амазону – потому для него нужно выбирать нечто, что не может встретиться у других – кусок е-мейла, или ваш домен. Ограничение на хранение файлов – тоже нет (напомню только что за все в этом мире нужно платить). Но размер одного загружаемого не может превышать 5Гб. Понятие каталогов у амазон – просто условность. Все файлы хранятся как пара – имя(путь)/файл. Имя может содержать разделители директорий – тогда в визуальном интерфейсе данные будут видны как дерево папок. Формат ссылки: https://s3.amazonaws.com/{bucket}/{chain_of_folders}/2.jpg. По умолчанию доступ к файлам закрыт, потому есть опция – Make public. После этого – ссылка открыта всему миру. Иначе при попытке просмотреть ваши фотки, юзера попросят залогиниться в амазон – а кому такое щастье надо, я вас спрашиваю…

Есть одна особенность: понятие Region. Чтоб уменьшить издержки на передачу содержимого с вашего сайта, нужно выбрать регион поближе к нему (а сам сайт – поближе к целевой аудитории). Amazon честно поделил весь мир на 5 зон. Есть US Standart – очевидно золотой миллиард – и все остальные (Европа, Азия). Про Африку никто не подумал – наверное, просто у Amazon S3 нет желания создавать интерфейс для хранения шкур и бивней…

Из интересных особенностей – поддержка торрент протокола и возможность создания статического вэб сайта на их сервере – по сути тоже хранение файлов, но уже не простых, а HTML. В этом случае имя вашего бакета используется субдоменом.

С теорией закончили, отложите тетрадки в сторону…

Так как мы все любим Яву – http://aws.amazon.com/sdkforjava/ ставим на закачку

То, что мы будем делать – сложно назвать библиотекой. Там будет всего один класс и одна функция – виной тому сам амазон – уж очень хороший и продуманный у него API (да и если все будет сделано – вам ведь будет неинтересно, правда?)

Как любой нормальный REST api требует в каждом запросе наличия двух ключей – accessKey, secretKey. Их вы можете получить на самом амазоне залогинившись (в случае кражи – можно сгенерить новую пару).

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;
 
import java.io.File;
import java.util.Map;
import java.util.Properties;
 
public class S3Client {
 
    private AmazonS3 s3;
    private Properties awsProperties;
 
    public S3Client() throws Exception{
        awsProperties = new Properties();
        awsProperties.load(getClass().getClassLoader().getResourceAsStream("aws.properties"));
        s3 = new AmazonS3Client(new BasicAWSCredentials(awsProperties.getProperty("accessKey"), awsProperties.getProperty("secretKey")));
    }
 
    public void saveFiles(Map files) {
 
        for (Map.Entry e: files.entrySet()) {
            s3.putObject(new PutObjectRequest(awsProperties.getProperty("mainBucket"), e.getKey(), e.getValue())
                    .withCannedAcl(CannedAccessControlList.PublicRead));
        }
    }
 
    public String getLinkCommonPart(String relativeLink) {
        return new StringBuilder("http://s3.amazonaws.com/")
                .append(awsProperties.getProperty("mainBucket")).append("/").append(relativeLink).toString();
    }
}

Как все умные – храним ключи в файле .properties. Зачитываем его из classpath getClass().getClassLoader().getResourceAsStream(“aws.properties”). На основе ключей – создаем объект типа AWSCredentials и уже сам сервис.

Для примера – только одна функция – загрузки набора картинок. У нас есть мап – пути, какими мы хотим их видеть в ссылке, и сами файлы. Единственный важный момент – CannedAccessControlList.PublicRead – при загрузке мы сразу делаем ресурс публично доступным по ссылке.

Еще одна функция – утилита для формирования ссылки (в своей версии у нас уже http, а не https), по относительному пути – чтоб инкапсулировать информацию так сказать…

Да библиотека не особая получилась. Ничего – в следующий раз будет лучче(быстрее! выше!! сильнее!!!)… Следующий сервис – от корпорации добра. Какой? Сюрприз будет! А я пока пойду, попью свой любимый напиток. Надеюсь мой кот уже справился с этим нелегким делом…

Leave a Reply