Когда я только начинал свою карьеру, я удивлялся большому количеству сленга. В те дни большинство новостей про технологии поступали в печатных еженедельных газетах, таких как InformationWeek и Network World. Помню, как частенько думал про себя: «Они используют одни и те же слова снова и снова».
Это же относилось и к людям, постоянно использующим сленг. В то время двумя моими любимыми модными словечками были отсылки к Интернету как к «всемирной паутине» и «информационной супермагистрали». Я про себя посмеивался, будет ли когда-нибудь супер-пупер-шоссе.
Однако недавно я заметил, что сленг часто используется в качестве заполнителей там, где не совсем имеет смысл. Такие термины, как микросервисы, архитектура, управляемая событиями, искусственный интеллект и машинное обучение, зачастую используются в неподходящем контексте, что приводит меня к выводу о том, что многие понимают эти термины до конца. Также я не ожидал подобного…
Представьте себе простой разговор:
Собеседник №1: Во сколько вылетает ваш рейс?
Собеседник №2: Позже в этом году.
В то время как Собеседник № 2 дает ответ, который фактически не является неверным, ответ на самом деле не дает никакой ценности для Собеседника № 1.
В своем стремлении перейти на микросервисы я столкнулся с аналогичными проблемами. Чаще всего я работал с клиентами и корпорациями, чей «микросервисный» дизайн приводил к единому моносервису. По сути, монолитное приложение было заменено действительно большим RESTful API.
Я решил, что в этой статье было бы интересно рассмотреть пример создания целенаправленного микросервисного дизайна… правильным способом.
Целеориентированная разработка микросервиса
Целеориентированный микросервис — это сервис, который может работать сам по себе и при необходимости включать в себя отдельное персистентное хранилище. Будучи ориентированным на цель, микросервис будет предоставлять определенный набор информации и станет системой записи для данных, управляемых в рамках связанных с ним API.
Применяя целеориентированный микросервисный подход, пользователи могут добавлять дополнительные узлы и уменьшать масштаб существующих узлов, чтобы удовлетворить потребности API на данный момент времени.
Например, целеориентированный микросервис для работы с подоходным налогом может наиболее активно использоваться в первой половине года и требовать меньшего количества запущенных экземпляров во второй половине года.
Давайте сосредоточимся на простом примере разработки микросервиса.
Создание микросервиса на основе Docker
Chinese Gender Predictor — табличная система, используемая для прогнозирования пола будущего ребенка. Это делается путем указания месяца зачатия и возраста матери на момент зачатия.
Ходят слухи, что императорская семья династии Цин полагалась на ту же сетку так, чтобы запланировать рождение именно сыновей с целью продолжения семейного рода.
Ниже приведена иллюстрация таблицы Chinese Gender Predictor:
Например, 18-летняя мать, зачавшая ребенка в январе, родит ребенка женского пола.
Для данной публикации мы создадим микросервис, который возвращает прогноз пола на основе тех же критериев. Ответ с результатом для приведенного выше примера будет выглядеть так, как показано ниже:
{
"month": 1,
"age": 18,
"gender": "female",
"errorMessage": null
}
Микросервис будет использовать Java и Spring Boot, а также многоэтапный Dockerfile для сборки сервиса и создания образа Docker, в котором могут размещаться API-интерфейсы предикторов рождения.
Код сервиса располагается на GitLab по адресу: https://gitlab.com/johnjvester/birth-predictor
Создание воспроизводимого шаблона с использованием Render Blueprints
Я писал о платформе __Render__ в следующих публикациях:
Для своих личных серверов, работающих на Render, я использовал язык программирования Go, статические сайты и Postgres. На этот раз я написал сервис на Java/Spring Boot. Хотя встроенной поддержки Java еще не существует, платформа Render включает поддержку всего, что работает в контейнере Docker.
Поскольку сервис прогнозирования рождения включает в себя многоэтапный Dockerfile, я хотел посмотреть, насколько просто развернуть сервис на основе Docker на платформе Render. Однако я заметил спецификацию Blueprint и захотел посмотреть, как она работает.
Что такое Blueprint?
Blueprint — это имплементация Infrastructure as Code от Render. IaC — это то, что я объединяю в более крупную концепцию под названием «* как код». Организации, которым необходимо управлять развертыванием нескольких сервисов или которые владеют сервисами, требующими множества параметров, могут определить свою Render инфраструктуру (сервисы, базы данных и группы среды) в виде кода в файле render.yaml.
Использование Render Blueprint
Опираясь на приведенный здесь пример Blueprint, я смог быстро создать Blueprint для своих сервисов Spring Boot, работающих через контейнеры Docker:
services:
- type: web
name: restful-api-spring-boot
env: docker
region: ohio # optional (defaults to oregon)
plan: free # optional (defaults to starter)
branch: master # optional (uses repo default)
numInstances: 1 # optional (defaults to 1)
healthCheckPath: /actuator/health
envVars:
- key: SERVER_PORT
value: 443
Далее я кастомизировал данные YAML для сервиса прогнозирования рождения, чтобы обновить свойство имени и добавить свойство repo
, как указано ниже:
services:
- type: web
name: birth-predictor
env: docker
repo: https://gitlab.com/johnjvester/birth-predictor
region: ohio # optional (defaults to oregon)
plan: free # optional (defaults to starter)
branch: master # optional (uses repo default)
numInstances: 1 # optional (defaults to 1)
healthCheckPath: /actuator/health
envVars:
- key: SERVER_PORT
value: 443
Эта информация была сохранена в корне репозитория birth-predictor в файле с именем render.yaml. После коммита данного изменения сервис был готов к развертыванию на платформе Render.
На панели Render Dashboard я выбрал theNew | Blueprint option:
Затем я выбрал репозиторий birth-predictor, который я подключил к своей учетной записи GitLab, используя вот эти инструкции.
Поскольку я использовал Blueprint, все, что мне нужно было сделать, это указать имя группы сервисов для нового сервиса:
После нажатия на кнопку «Применить» начинается процесс развертывания:
Сервис без проблем развернулся за несколько минут:
Предсказатель в действии
Чтобы получить новый прогноз, я могу выполнить следующую команду cURL во время работы сервиса прогнозирования:
curl --location --request POST 'https://birth-predictor.onrender.com/predict' \
--header 'Content-Type: application/json' \
--data-raw '{
"conceptionMonth" : 11,
"conceptionAge" : 43
}'
Полученное тело ответа выглядит следующим образом:
{
"month": 11,
"age": 43,
"gender": "male",
"errorMessage": null
}
Эта информация совпадает с месяцем зачатия и возрастом моей жены на момент зачатия нашего сына (Финни). Он родился в августе 2017 года.
Как во времена династии Цин, мы положились на китайский предсказатель пола и успешно спрогнозировали пол нашего ребенка.
Заключение
С 2021 года я стараюсь жить в соответствии со следующей концепцией, которая, как мне кажется, вполне применима к любому ИТ-специалисту:
Сфокусируйтесь на поставке функциональности, которая повышает ценность вашей интеллектуальной собственности. Используйте фреймворки, продукты и сервисы для всего остального.
- Дж. Вестер
Спецификация Blueprints от Render соответствует этой концепции, позволяя группам разработки и администрирования сосредоточиться на достижении поставленных целей и задач, не беспокоясь ни о чем, связанном с DevOps.
Когда сервис, компонент или приложение готовы, командам нужно просто включить файл render.yaml в корень своего репозитория, а затем создать новый сервис на платформе Render с помощью опции Blueprint. В дальнейшем любые обновления в подключенном репозитории будут автоматически развертываться через несколько минут после внесения кода в нужную ветку.
Платформа Render основана на подходе Zero DevOps, что выражено в происхождении концепции Blueprint. Разработчики фич и сервисов хотят — и должны — сосредоточиться на поставке обновлений и фич, которые представляют наибольшую ценность для стейкхолдеров. Render действительно понимает эту реальность.
Я уверен, что модная терминология всегда будет частью технологического пространства. Тем не менее, я надеюсь, что специалисты будут стремиться понять и принять истинные цели, стоящие за словами.
Если вас интересует исходный код этой статьи, вы можете найти его на GitLab по адресу: https://gitlab.com/johnjvester/предиктор рождения
Приглашаем всех желающих на открытое занятие, на котором поговорим про различные паттерны аутентификации и авторизации. Также рассмотрим сессионную аутентификацию на основе кук и на основе токенов (jwt), работу identity провайдеров. Регистрируйтесь по ссылке.
Комментарии (3)
CrocodileRed
11.09.2022 13:52Или качество перевода не очень или переводчик начал переводить одну статью, но потом по каким-то причинам переключился на другую))
blood_develop
Что-то я нифига не понял. Начал за одно, закончил совсем другим. Что из второй половины статьи решает проблему, описанную в начале тоже не понял