Рубрики
Без рубрики

Как создать и запустить бесплатный трекер ссылок с использованием VS Code, Java, GitHub, MongoDB и Лазурь

Многие разработчики заинтересованы в том, чтобы научиться создавать и запускать программное обеспечение на облачных платформах, но это не так… С тегами azure, java, mongodb, github.

Многие разработчики заинтересованы в том, чтобы научиться создавать и запускать программное обеспечение на облачных платформах, но опасаются потенциальных скрытых затрат и | или шока от выставления счетов .

Часто этот шок от счета возникает из-за непонимания того, как работают сервисы, основанные на потреблении, и из-за ложного чувства безопасности, вызванного относительно небольшой суммой за запрос/за МБ, которую взимают многие сервисы. Все это хорошо и хорошо, пока вы не создадите что-то неожиданно популярное, что взорвется за ночь и увеличит ваш счет.

Однако большинство из нас на самом деле никогда не столкнется с этой дилеммой, и я думаю, что это позор, что люди ограничивают себя в изучении чего-то нового, основываясь на том, что может произойти, а не на том, что произойдет . Сказав это, давайте посмотрим, как мы можем устранить некоторую неопределенность при создании с помощью Azure.

Создание экономически безопасных решений

Большинство решений, которые я создал за последние 18 месяцев, легко вписываются в категорию “работает по цене кофе (по ценам Сиднея) или меньше”, но я всегда ищу способы добиться большего. С этой целью я попытаюсь найти для вас способы учиться с помощью Azure, не беспокоясь о том, что вам может понадобиться вторая ипотека.

Первое, что я бы рекомендовал сделать, – это посмотреть Azure Free Tier и понять, какие сервисы он содержит и каковы их ограничения, уделяя особое внимание тому, что происходит, когда вы превышаете предложение бесплатного уровня. Вам следует периодически возвращаться к нему по мере добавления или изменения сервисов с течением времени – например, Cosmos DB недавно увеличила количество единиц запроса (RUs) и хранилища, доступных в рамках их бесплатного предложения.

Кроме того, подумайте, что вы хотите делать или чему научиться с помощью платформы. Если вы совершенно новичок в Azure и хотите воспользоваться финансовыми кредитами с ограниченным сроком действия и повышенным уровнем бесплатного обслуживания на 12 месяцев, убедитесь, что у вас есть определенные цели, иначе вы потеряете свои преимущества. Я писал об этом в 2018 , так что это стоит прочитать, прежде чем начинать.

Наконец, всегда настраивайте Бюджетные оповещения для платных подписок, за которые вы платите. Это не остановит экспоненциальный рост, но, по крайней мере, вы узнаете об этом раньше, чем ваш следующий счет, и сможете действовать соответствующим образом, чтобы ограничить свои расходы.

Наш демонстрационный сценарий

Для этого поста я создам простой REST API, который можно использовать для создания и отслеживания коротких ссылок на URL (подумайте bit.ly ). Их можно использовать в блогах, подобных моему, для отслеживания переходов по исходящим ссылкам.

Если я хочу отслеживать любую исходящую ссылку (скажем, когда я ссылаюсь на репозиторий GitHub), я создаю короткую ссылку для адресата, использую эту короткую ссылку в своем блоге вместо фактического адресата, и когда посетитель блога нажимает на ссылку, его запрос сначала попадает в мою систему коротких ссылок, прежде чем перенаправляться на фактический адресат. Код короткой ссылки регистрирует запрос, и я могу сообщить об этом позже.

Поскольку мне нравится путать вещи, я собираюсь создать решение, используя Java Spring Boot и MongoDB.

Бесплатная локальная разработка и развертывание

Если я собираюсь бросить себе вызов, чтобы запускать службы бесплатно, я мог бы также распространить это на весь жизненный цикл моего приложения. С этой целью я собираюсь использовать следующее, чтобы помочь мне создать и отладить мое решение локально.

Как только я закончу писать свое решение, я хочу где-нибудь опубликовать свой код, а затем развернуть его в Azure, поэтому для этого я буду использовать GitHub и Действия GitHub .

Бесплатный хостинг в Azure

Как разработчик, я ненавижу управлять инфраструктурой. Если для этого требуется виртуальная машина, вы делаете это неправильно! Итак, для размещения нашего решения я собираюсь использовать Azure App Service и Azure Cosmos DB, настроенные с поддержкой MongoDB API. Обе эти услуги предлагают привлекательный бесплатный уровень:

  • Служба приложений: Бесплатный уровень F1 – не предназначен для рабочих нагрузок prod, но гарантирует, что вы останетесь бесплатными. Когда ваше приложение потребляет более 60 минут процессорного времени в день, веб-приложение будет остановлено, а абоненты получат сообщение 503 (Недоступно).
  • Cosmos DB: Бесплатный уровень – вы можете запустить несколько хороших небольших решений на этом уровне. 1000 единиц запроса (RUs) и 25 ГБ – это щедро и должно подходить для большинства случаев использования. Если вы генерируете вызовы, превышающие лимит RU, вы получите сообщение 429 (Слишком много запросов), и его необходимо будет обработать в вашем коде вызова. Вы можете управлять увеличением объема хранилища, используя настройки времени ожидания (TTL), чтобы убедиться, что вы не превышаете лимиты, хотя 25 ГБ – это много документов!

Давайте создадим наше приложение!

В качестве отправной точки подключитесь к вашему экземпляру MongoDB и убедитесь, что у вас есть доступная пустая база данных. Я назвал свою базу данных “bloglinks”, но вы можете использовать любое имя, которое захотите. Скопируйте URI подключения и имя базы данных для последующего использования.

Вы также можете создать пустое хранилище на GitHub, где исходный код приложения будет сохранен, когда вы закончите и будете готовы к развертыванию в Azure.

Теперь, используя Visual Studio Code, откройте пустую папку на вашем компьютере, а затем откройте палитру команд (Вид > Палитра команд) и выберите Spring Initialzr, начав вводить “spring”. Выберите “Создать проект Maven…”

Далее давайте выберем версию Spring Boot. Я склоняюсь к стабильным выпускам, но выбор за вами. Обратите внимание, что ваши версии, вероятно, будут отличаться от приведенной ниже, в зависимости от того, когда вы читаете этот блог.

Сделайте проект на языке Java.

Теперь настройте необходимые данные для создания имени вашего пакета.

Установите тип упаковки на ‘Jar’, а версию Java – на ’11’.

Наконец, давайте включим зависимости Spring, которые помогут нам быстро приступить к работе с нашим решением. Для нашего приложения мы будем использовать Spring Web, Spring Data MongoDB и Spring Security.

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

Обязательно обратите внимание на application.properties.файл prod. Вы можете использовать это локально на своем компьютере (переименуйте его в application.properties) для управления конфигурацией базовой аутентификации и подключения к MongoDB. Однако важно убедиться, что вы добавили этот файл в свой gitignore при переходе на GitHub, особенно если вы используете удаленный экземпляр MongoDB.

Как только вы завершите кодирование решения, вы обнаружите, что библиотека Spring Data MongoDB автоматически создаст для вас необходимые коллекции в вашей базе данных. Мы будем использовать эти два имени коллекций при создании заполнителей в Azure на нашем следующем шаге.

Настройка Azure

Мы будем использовать Azure CLI для выполнения этих шагов, поэтому убедитесь, что он у вас установлен и что вы вошли в подписку, которую хотите развернуть.

Сначала мы создадим Группу ресурсов, которая может содержать все наши сервисы. Вы можете выбрать подходящее вам место.

az group create --name MyResourceGroup --location westus2

Создайте бесплатный план обслуживания приложений Azure.

az appservice plan create \
    --resource-group MyResourceGroup \
    --name MyAppsPlan \
    --is-linux \
    --sku FREE

Создайте веб-приложение, используя План. Мы предварительно настроим веб-приложение с подходящей средой Java (Java SE web server 8 с Java 11).

az webapp create \
    --name myuniquewebappid123 \ 
    --resource-group MyResourceGroup \
    --runtime "JAVA|8-java11" \
    --plan MyAppsPlan

Создайте бесплатную базу данных Cosmos уровня, сконфигурированную с помощью MongoDB API v4.0.

az cosmosdb create \
    --name MyCosmosAccount \
    --resource-group MyResourcegroup \
    --enable-free-tier true \
    --kind MongoDB \
    --server-version 4.0 \
    --default-consistency-level "Session"

Теперь мы можем создать вашу базу данных и коллекции в Cosmos DB.

# Create 'bloglinks' Database
az cosmosdb mongodb database create \
     --account-name MyCosmosAccount \
     --resource-group MyResourcegroup \
     --name bloglinks 

# Create 'shortLink' Collection
az cosmosdb mongodb collection create \
     --account-name MyCosmosAccount \
     --resource-group MyResourcegroup \
     --database-name bloglinks \
     --name shortLink

# Create 'linkClick' Collection
az cosmosdb mongodb collection create \
     --account-name MyCosmosAccount \
     --resource-group MyResourcegroup \
     --database-name bloglinks \
     --name linkClick \
     --idx '[{"key":{"keys": ["_ts"]},"options":{"expireAfterSeconds": 5184000}}]'

Теперь вы можете посмотреть на это последнее заявление о создании коллекции и задаться вопросом, что я здесь делаю? Ну, помнишь, что было раньше Я упомянул, что нам нужен способ гарантировать, что мы не превысим наш лимит хранилища (хотя это вряд ли когда-нибудь произойдет … но зачем выяснять?!), Что ж, вот как я справлюсь с этим в этом сценарии.

Cosmos DB имеет отличную функцию времени жизни (TTL), которая может использоваться для истечения срока действия документов, что означает, что они удаляются из наборов результатов и в конечном итоге удаляются из хранилища. Лучше всего? Никаких затрат!!

Если вы хотите использовать эту функцию с API MongoDB, вам необходимо использовать индексы Mongo поверх свойства документа Cosmos-internal “_ts” для управления этой функцией. На основе официальной документации Microsoft вы можете определить эти индексы при создании коллекции (как указано выше) или отдельно позже, используя клиент MongoDB для создания индекса. Я установил срок годности в 60 дней, так как в идеале я должен был обработать данные сбора к этому моменту, а если нет … это на мне!!

В качестве последнего шага давайте возьмем URI подключения MongoDB для нашей базы данных Cosmos, которую мы можем использовать в нашей конфигурации ниже.

az cosmosdb keys list \
     --name MyCosmosAccount \
     --resource-group MyResourcegroup \
     --type connection-strings

Итак, на данном этапе у нас есть веб-сервер и база данных MongoDB, готовые к развертыванию нашего приложения.

Развертывание и настройка нашего веб-приложения

Последняя часть головоломки – это развертывание и настройка вашего веб-приложения.

Давайте начнем с настройки. У нас есть четыре элемента конфигурации, которые нам нужны для работы нашего веб-приложения:

  • У нас есть четыре элемента конфигурации, которые нам нужны для работы нашего веб-приложения:
  • spring.безопасность.пользователь.пароль
  • spring.data.mongodb.база данных
  • spring.data.mongodb.uri

Локально мы храним значения в нашем файле application.properties, но мы не хотим отправлять этот файл на GitHub, поэтому убедитесь, что при публикации решения на GitHub вы исключаете этот файл.

Служба приложений Azure предоставляет удобный способ предоставления этих четырех значений с помощью настроек приложения, которые мы можем развернуть следующим образом. Преобразуйте каждый заполнитель application.properties в эквивалент с подчеркиванием вместо точек.

az webapp config appsettings set \
    --resource-group MyResourcegroup \
    --name myuniquewebappid123 \
    --settings SPRING_SECURITY_USER_NAME=youruser \
SPRING_SECURITY_USER_PASSWORD=5ecureP4ssword \
SPRING_DATA_MONGODB_DATABASE=bloglinks \
SPRING_DATA_MONGODB_URI=mongodb://your_cosmos_uri/

Наконец, давайте настроим действие GitHub для развертывания приложения для нас.

az webapp deployment github-actions add \
    --resource-group MyResourcegroup \
    --name myuniquewebappid123 \
    --repo "youruser/your-repo" \
    --runtime "JAVA|8-java11" \
    --login-with-github

Вам будет предложено войти в GitHub по адресу https://github.com/login/device используя определенный идентификатор, и после завершения вы должны обнаружить, что в вашем репозитории теперь есть новая папка, содержащая рабочий процесс, который будет создавать и развертывать ваше решение!

Через несколько минут вы обнаружите, что рабочий процесс запускается, и ваше приложение теперь развернуто и готово к обслуживанию запросов!

Проверяю это на себе

Прежде чем мы завершим, давайте протестируем наше развернутое решение. Самый простой способ сделать это – установить Thunder client для VS Code, а затем открыть коллекцию, которую я включил в репозиторий примеров приложений . Убедитесь, что вы обновили имя хоста, чтобы оно соответствовало тому, которое вы использовали в Azure, и что вы также установили имя пользователя и пароль для базовой аутентификации, соответствующие вашим.

Когда вы используете POST-вызов для создания новой короткой ссылки, вы получите код HTTP-ответа “201 Создан”, а сведения о созданной записи указаны в заголовке HTTP-ответа в качестве поля “местоположение”. Это показано ниже. Если вы попытаетесь создать ссылку, которая уже существует, вы получите код ответа HTTP “200 OK”, и данные короткой ссылки будут возвращены в теле ответа.

Подведение итогов

Мы многое сделали в этом посте, но я еще не закончил на 100%. Если вы выполнили все запросы, вы заметите, что есть поле под названием “посетители”, значение которого равно нулю. Нам нужно создать решение, которое будет периодически заполнять это поле для использования, в идеале также с нулевыми затратами. В следующем посте я рассмотрю, как мы можем это сделать.

А пока… счастливых дней! 😎

Оригинал: “https://dev.to/simonwaight/how-to-build-and-run-a-free-link-tracker-using-vs-code-java-github-mongodb-and-azure-2ahg”