Давайте начнем урок этого месяца с двух утверждений, которые доставят мне неприятности:
- Эликсир - самый производительный язык из существующих.
- Bit.ly взимает большую плату за свой платный план
Elixir, фреймворк Phoenix и виртуальная машина Erlang позволяют нам быстро, легко и быстро создавать готовые к производству системы с очень небольшим количеством движущихся частей. На этом этапе вы можете увидеть, к чему мы идем. Давайте воспользуемся тем, что идет в комплекте с Elixir, чтобы сократить количество ссылок и предотвратить ежемесячный счет в 500 долларов.
Давайте нырнем!
Начальная настройка
Прежде чем ты начнешь
Убедитесь, что у вас есть следующее:
- "Эликсир"
- "Феникс"
Создать новый проект Phoenix
Первое, что нужно сделать, как всегда, - попросить Феникса создать каркас проекта. Для этой демонстрации у нас не будет «внешнего интерфейса», поэтому мы можем сказать инициализатору, чтобы он оставил их в стороне.
В вашем терминале введите:
mix phx.new shorten_api --no-html --no-brunch
Обновите свои зависимости
Затем мы собираемся добавить несколько зависимостей в mix.exs
. Обновите функцию deps/0
в этом файле, чтобы она выглядела так:
Логика!
Хорошо, базовая настройка не мешает. Это означает, что мы настраиваем логику, которая будет:
- Позвольте нам сохранять URL
- Ссылка на эти URL-адреса с помощью уникального HashId (например,
abc123
) - Перейдите к
/abc123
, и он выполнит перенаправление на URL-адрес, на который ссылается.
Во-первых, создание способа хранения этих ссылок.
Создание способа хранения этих ссылок
Давайте воспользуемся встроенными генераторами Phoenix, чтобы сделать это за нас. В вашем терминале запустите:
mix phx.gen.json Links Link links hash:string:unique url:string:unique
Это создаст
Links
контекстLink
модельLink
контроллер- Перенос базы данных
Честно говоря, это конец этого шага. Он попросит вас поместить несколько строк в ваш router.ex
файл, но пока вы можете пропустить это, если хотите, поскольку мы коснемся этого позже. Давайте перейдем к тому, как мы можем изменить то, что было создано выше, чтобы автоматически создавать идентификаторы, которые мы будем использовать для ссылки на эти ссылки.
Автоматическое создание HashId при создании ссылки
По умолчанию в этих системах модели получают столбец id
в базе данных, который представляет собой номер, уникальный и автоматически увеличивающийся: 1, 2, 3 и так далее. В нашей системе мы хотим, чтобы id
был:
- короткий
- Уникальный
- Нить
- Это генерируется автоматически.
Ecto упрощает эту задачу.
Первое, что нужно сделать, это создать собственный тип Ecto Type, который будет обрабатывать все это за нас. Создайте новый файл shorten_api/ecto/hash_id.ex
и заполните его следующим образом:
То, что мы сделали выше, - это, по сути, создание нового типа, который можно использовать так же, как мы определяем поле как String
или Integer
. Теперь мы можем определить поле как HashId
.
Подробнее об этом можно узнать в документации Ecto.
Итак, давайте сделаем это и обновим shorten_api/links/link.ex
, чтобы использовать HashId
, поскольку это первичный ключ вместо Integer
:
Обновите миграцию
Теперь, когда HashId
настроен в нашем коде, мы хотим обновить миграцию, чтобы настроить базу данных, чтобы отразить то, что происходит в нашем файле модели. В вашем проекте должен быть файл, заканчивающийся на _create_links.exs
. Найдите его, откройте и измените, чтобы он напоминал приведенный ниже код:
Хорошо, это большинство наших шагов по сантехнике, теперь мы собираемся перейти к основной логике всего этого проекта.
Перенаправление с идентификатора на URL
Во-первых, нам нужна функция в нашем контроллере, которая
- Получает
Id
изLink
- Ищет
Link
- Перенаправляет на
URL
, прикрепленный к этомуLink
Для этого давайте добавим новую функцию к нашему контроллеру ссылок, который находится здесь: shorten_api_web/controllers/link_controller.ex
Подключите все это к нашему роутеру
Теперь, когда у нас есть эта новая функция контроллера, осталось только подключить ее. Обновите файл router.ex
, чтобы отразить следующее:
Примечание: мы также будем добавлять маршруты к
mix phx.gen
, предложенные ранее
ТАДА! 🎉
На этом этапе вы сможете запустить проект с mix phx.server
, и все будет работать должным образом! Однако на этом мы не останавливаемся.
Секретный соус
Поскольку сокращатели ссылок находятся между пользователем и фактическим контентом, очень важно, чтобы эти системы были быстрыми. Хотя Elixir уже работает быстро, основное время задержки в этом процессе исходит из нашей базы данных. Чтобы найти ссылку, прикрепленную к идентификатору, требуется время.
Чтобы ускорить это, укорочители ссылок часто предпочитают использовать хранилище данных в памяти, такое как Redis, в отличие от базы данных на диске, такой как Postgres (которую Phoenix устанавливает по умолчанию). К счастью, поскольку Elixir построен на основе виртуальной машины Erlang, у нас уже есть встроенное хранилище данных в памяти: Mnesia!
В следующем разделе мы собираемся изменить нашу конфигурацию, чтобы использовать Mnesia вместо Postgres.
Переход с Postgres на Mnesia
На самом деле этот процесс очень прост. Сначала обновите config.exs
, как показано:
Создайте свою базу данных Mnesia
Затем создайте место, где Mnesia будет выполнять резервное копирование данных и инициализировать базу данных через Ecto:
mkdir priv/data mkdir priv/data/mnesia mix ecto.create mix ecto.migrate
Готово! Теперь вы используете базу данных в памяти для хранения информации о ссылках. Разве это не было просто?
Начни это
Теперь ты можешь
- начать проект (опять же для многих из вас):
mix phx.server
2. Создайте сокращенную ссылку через curl
:
curl --request POST \ --url http://localhost:4000/api/links/ \ --header 'content-type: application/json' \ --data '{ "link": { "url": "https://twitter.com/bnchrch" } }'
3. Возьмите hash
, возвращенный в ответе.
{“data”:{“url”:”https://twitter.com/bnchrch","hash":"7cJY_ckq"}}
4. И будете перенаправлены соответствующим образом, когда вы перейдете на localhost:4000/{hash}
:
Заворачивать
Удивительно, насколько легко со всеми этими инструментами было создать быстрый, простой в обслуживании и простой в расширении инструмент сокращения ссылок. Большая заслуга здесь принадлежит BEAM (Erlang VM), Хосе Валиму (создателю Elixir) и Крису МакКорду (создателю Phoenix). Остальная часть похвалы заключается в том, насколько проста идея сокращения ссылок, никоим образом не оправдывающая вводную цену в 500 долларов в месяц. Все еще смотрю на тебя Bit.ly.