Всім привіт! У даній статті ми:
- розглянемо переваги й недоліки Monolith, Microservices і Serverless архітектур;
- створимо перший застосунок з використанням AWS Lambda і Serverless Framework.
Типи архітектур бек-енду:
Припустимо, що у нас виникло бажання зробити свій супер-мега застосунок. Ми обрали всі інструменти для розробки. Застосунок у нас поки маленький і відповідно реалізувати його ми будемо просто. Створимо роутер, який на певний запит буде викликати функцію, а та в свою чергу діставатиме дані з бази й повертатиме їх.
Тут ми знайомимось з першим типом архітектури:
Monolith
У монолітній архітектурі ми маємо один застосунок і всі частини цього застосунку знаходяться тісно зв'язані. Така архітектура має наступні плюси:
- легко встановлюються (пишемо один скрипт і ніяких танців з бубном);
- проста підтримка додатку, моніторинг, логування;
- додавання нової функціональності не викликає проблем;
- легкість у розгортанні застосунку.
Але разом з тим така простота має і свої недоліки:
- з часом база коду тільки розростається і виникають проблеми з розумінням того, як все працює;
- деплой починає займати багато часу;
- створення нової функціональності робиться все складніше і постійно викликає проблеми в інших частинах застосунку.
Наш застосунок набув шаленої популярності й ми вже починаємо відчувати всі недоліки монолітної архітектури.
І тут з'являються мікросервіси, щоб врятувати наш проект.
Microservices
У мікросервісній архітектурі ми маємо не один великий застосунок, а декілька маленьких застосунків, які між собою спілкуються. Вони незалежні й будь-який з них може бути замінений на інший застосунок з таким же інтерфейсом.
Ми розбиваємо нашого суцільного монстра на декілька дрібних і отримуємо наступні переваги:
- кожний сервіс незалежний і деплоїться теж незалежно;
- застосунок стає простіший для розробника, що відповідно зменшує час на розробку і тестування;
- заміна одного сервісу на інший не викликає проблем.
Але:
- налаштування такої системи потребує часу;
- виникають у складнощі моніторингу і логування кожної частини.
Ми витратили 100500 годин на налаштування, все налаштували й щасливі.
А що якщо все може бути набагато простіше в налаштуванні й не потребує танців з бубном?
І тут з'являється наш новий герой.
Serverless
На Вікіпедії можна знайти наступне визначення:
Serverless — модель хмарних обчислень для яких платформа динамічно керує виділенням машинних ресурсів. Іноді безсерверні обчислення також іменують «Функція як послуга» (англ. Function as a Service, FaaS), тому що одиницею коду є функція, яка виконується платформою. По суті для виконання одного запиту створюється окремий контейнер, який знищується після виконання.
І як на мене це визначення дуже хороше. З першого погляду виглядає так ніби ми знову повернулись на монолітну архітектуру. На запит викликається функція, яка щось робить і повертає дані або виконує якісь дії. Але тут все набагагато краще. Як сказано вище, кожна функція — це одиниця коду, тобто маленький блок з яких ми будемо складати наш застосунок. Ці блоки ізольовані. І ще одна важлива деталь — наш код не запущений постійно, а залишається на хмарі Амазона, наприклад, і викликається тільки тоді, коли у цьому є потреба.
Отже, така архітектура моє такі переваги:
- просте встановлення системи;
- простий деплой, оскільки нам потрібно розгортати кожну функцію окремо;
- вартість такої системи вкрай мала (наприклад, перший мільйон запитів на AWS Lambda безкоштовний і по 20 центів за кожний наступний мільйон). Для порівняння вартість найдешевшої конфігурації сервера на DigitalOcean 5$/місяць;
- така архітектура проста для розуміння;
- і, напевно, найбільший плюс — автоматичне масштабування. Вам більше не потрібно переживати чи ваші сервери витримають навантаження, про це потурбується Amazon, Google чи Microsoft.
Звучить круто, але куди ж без мінусів ?
- структура проекту може виглядати заплутаною, але для вирішення таких проблем є Claudia.js;
- перший запит потребує додаткового часу (розгортання контейнеру тощо). Близько 2-3 секунд.
Як бачимо така архітектура добре підходить як для стартапів, оскільки все буде працювати практично безкоштовно, так і для великих застосунків, оскільки масштабуванням займається провайдер послуг.
Теорія звичайно добре, але як це все самому спробувати?
Для старту нам потрібні наступні речі:
Перше. Акаунт AWS. Створити можна тут.
Друге. Налаштувати AWS акаунт:
- Переходимо на Identity & Access Management (IAM) сторінку
- Натискаємо на 'Users', а далі на 'Add user'
- Далі потрібно дати ім'я користувачу. Для кращого розуміння назвіть
serverless-admin
- Виберіть 'Programmatic access' і 'Next'
- Далі клікаємо на 'Attach existing policies directly' і вибираємо 'AdministratorAccess' (перший рядок у таблиці)
- 'Next' i 'Create User'
- Далі з'явиться сторінка на якій будуть API Key & Secret. Скопіюйте їх або завантажте як CSV. Ці ключі нам і потрібні.
Третє. Node.js
Найважливіше. Хороший настрій.
Для початку потрібно становити Serverless CLI.
npm install -g serverless
Далі встановимо проект:
serverless create --template aws-nodejs --path my-service
Створяться serverless.yml. Це конфіг файл у якому ми вказуємо ім'я сервісу, ім'я провайдера й ім'я контейнеру, який потрібно підняти. І функції, які ми будемо деплоїти.
service: my-service
provider:
name: aws
runtime: nodejs6.10
functions:
hello:
handler: handler.hello
І handler.js у якому і буде жити наша функція.
module.exports.hello = (event, context, callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
}),
};
callback(null, response);
};
Задамо ключі (API Key & Secret):
serverless config credentials --provider aws --key YOUR-API-KEY --secret YOUR-SECRET-KEY
Тепер потрібно розгорнути наш сервіс:
serverless deploy -v
І функцію:
serverless deploy function -f hello
Щоб викликати цю функцію:
serverless invoke -f hello -l
Наша функція працює:
{
"statusCode": 200,
"body": "{\\"message\\":\\"Go Serverless v1.0! Your function executed successfully!\\",\\"input\\":{}}"
}
Для перегляду логів:
- Відрийте нову вкладку у терміналі;
serverless logs -f hello -t
І якщо вам потрібно буде видалити весь сервіс з AWS Lamda:
serverless remove
На цьому у мене все. Це моя перша стаття і я був би дуже радий отримати будь-які відгуки. Всім добра)
Ще немає коментарів