Давайте начнем урок этого месяца с двух утверждений, которые доставят мне неприятности:

  1. Эликсир - самый производительный язык из существующих.
  2. Bit.ly взимает большую плату за свой платный план

Elixir, фреймворк Phoenix и виртуальная машина Erlang позволяют нам быстро, легко и быстро создавать готовые к производству системы с очень небольшим количеством движущихся частей. На этом этапе вы можете увидеть, к чему мы идем. Давайте воспользуемся тем, что идет в комплекте с Elixir, чтобы сократить количество ссылок и предотвратить ежемесячный счет в 500 долларов.

Давайте нырнем!

Начальная настройка

Прежде чем ты начнешь

Убедитесь, что у вас есть следующее:

  1. "Эликсир"
  2. "Феникс"

Создать новый проект Phoenix

Первое, что нужно сделать, как всегда, - попросить Феникса создать каркас проекта. Для этой демонстрации у нас не будет «внешнего интерфейса», поэтому мы можем сказать инициализатору, чтобы он оставил их в стороне.

В вашем терминале введите:

mix phx.new shorten_api --no-html --no-brunch

Обновите свои зависимости

Затем мы собираемся добавить несколько зависимостей в mix.exs. Обновите функцию deps/0 в этом файле, чтобы она выглядела так:

Логика!

Хорошо, базовая настройка не мешает. Это означает, что мы настраиваем логику, которая будет:

  1. Позвольте нам сохранять URL
  2. Ссылка на эти URL-адреса с помощью уникального HashId (например, abc123)
  3. Перейдите к /abc123, и он выполнит перенаправление на URL-адрес, на который ссылается.

Во-первых, создание способа хранения этих ссылок.

Создание способа хранения этих ссылок

Давайте воспользуемся встроенными генераторами Phoenix, чтобы сделать это за нас. В вашем терминале запустите:

mix phx.gen.json Links Link links hash:string:unique url:string:unique

Это создаст

  1. Links контекст
  2. Link модель
  3. Link контроллер
  4. Перенос базы данных

Честно говоря, это конец этого шага. Он попросит вас поместить несколько строк в ваш router.ex файл, но пока вы можете пропустить это, если хотите, поскольку мы коснемся этого позже. Давайте перейдем к тому, как мы можем изменить то, что было создано выше, чтобы автоматически создавать идентификаторы, которые мы будем использовать для ссылки на эти ссылки.

Автоматическое создание HashId при создании ссылки

По умолчанию в этих системах модели получают столбец id в базе данных, который представляет собой номер, уникальный и автоматически увеличивающийся: 1, 2, 3 и так далее. В нашей системе мы хотим, чтобы id был:

  1. короткий
  2. Уникальный
  3. Нить
  4. Это генерируется автоматически.

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

Во-первых, нам нужна функция в нашем контроллере, которая

  1. Получает Id из Link
  2. Ищет Link
  3. Перенаправляет на 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

Готово! Теперь вы используете базу данных в памяти для хранения информации о ссылках. Разве это не было просто?

Начни это

Теперь ты можешь

  1. начать проект (опять же для многих из вас):

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.

🧞‍ Это открытый исходный код! вы можете найти это здесь, на Github

❤️ Я пишу только о программировании и удаленной работе. Если вы следите за мной в Твиттере, я не буду тратить ваше время зря.