
Содержание статьи
Бен Черч

Давайте начнем учебник этого месяца с двух утверждений, которые создадут у меня проблемы:
- Elixir – самый продуктивный язык.
- Bit.ly взимает гораздо больше своего платного плана
Elixir, фреймворк Phoenix и Erlang VM позволяют нам создавать готовые к производству системы быстро, легко и очень мало движущихся частей. На этом этапе можно увидеть, куда мы идем с этим. Давайте используем то, что выходит из коробки из 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, который справится со всем этим за нас. Создайте новый файл shorten_api/ecto/hash_id.ex
и заполнить его следующим образом:
То, что мы сделали выше, по сути создали новый тип, который можно использовать так же, как мы определяем поле как a String
или an Integer
. Теперь мы можем определить поле как a HashId
.
Вы можете узнать больше об этом в документации Ecto.
Давайте сделаем это и обновим shorten_api/links/link.ex
использовать а HashId
поскольку это первичный ключ вместо an 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/datamkdir priv/data/mnesiamix ecto.createmix ecto.migrate
Бум готов! Теперь вы используете базу данных In-Memory для хранения информации о ссылках. Разве это было нелегко?
Запустите
Теперь вы можете
- начать проект (опять для многих из вас):
mix phx.server
2. Создайте сокращенную ссылку через curl
:
curl --request POST \ --url \ --header 'content-type: application/json' \ --data '{ "link": { "url": " }}'
3. Возьмите hash
возвращен в ответ
{“data”:{“url”:”,"hash":"7cJY_ckq"}}
4. И получить соответствующее перенаправление, когда вы переходите к localhost:4000/{hash}
:

Заверните
Удивительно, как легко с помощью всех этих инструментов было создать быстрое, простое в обслуживании и простое в расширении средство сокращения ссылок. Здесь велика заслуга BEAM (Erlang VM), Хосе Валима (создателя Elixir) и Криса МакКорда (создателя Phoenix). Остальные похвалы касаются того, насколько проста идея сокращения ссылок, что никоим образом не оправдывает начальную цену в 500 долларов в месяц. До сих пор смотрю на вас Bit.ly.
? Это открытый код! вы можете найти его здесь, на Github
❤️ Я пишу только о программировании и удаленной работе. Если вы подпишитесь на меня в Twitter, я не буду тратить ваше время.