Представь: ты построил дом из одного большого куска бетона. Всё вроде бы крепко, но если нужно заменить окно — приходится ломать стену. Вот так и с монолитными приложениями. Микросервисы — это как конструктор: каждый блок живёт своей жизнью, но вместе они собирают целый дом. Yii2 — мощный фреймворк, но обычно его используют для монолитов. Однако никто не запрещает разбить его на микросервисы. В этой статье я покажу, как это сделать без боли.
Почему Yii2 и микросервисы — не враги
Многие думают, что Yii2 подходит только для классических MVC-монолитов. Это не совсем так. Yii2 — это просто набор инструментов: ORM, роутинг, компоненты. Ничто не мешает использовать его как скелет для отдельного микросервиса. Например, один микросервис отвечает за пользователей, другой — за заказы, третий — за платежи. Каждый из них может быть написан на Yii2, но работать независимо.
Микросервисная архитектура — это про разделение ответственности. Yii2 с этим справляется отлично, если правильно настроить взаимодействие между сервисами. Главное — не тащить всё в один код.
Как разбить монолит на микросервисы в Yii2
Допустим, у тебя есть монолитное приложение на Yii2. Ты хочешь выделить модуль аутентификации в отдельный сервис. Вот пошаговая инструкция.
Шаг 1. Создай новый проект Yii2 для микросервиса. Используй базовый шаблон или advanced — неважно. Главное, чтобы он был лёгким.
composer create-project --prefer-dist yiisoft/yii2-app-basic auth-serviceШаг 2. Настрой роутинг и контроллеры. Микросервис должен отвечать только за свои задачи. Например, для аутентификации:
// config/web.php
$config = [
'id' => 'auth-service',
'basePath' => dirname(__DIR__),
'components' => [
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
],
],
'response' => [
'format' => 'json',
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'rules' => [
'POST login' => 'auth/login',
'POST register' => 'auth/register',
],
],
];
return $config;Шаг 3. Напиши контроллер, который принимает JSON и возвращает JSON. Yii2 для этого отлично подходит.
namespace app\controllers;
use yii\rest\ActiveController;
class AuthController extends ActiveController
{
public $modelClass = 'app\models\User';
public function actionLogin()
{
$data = \Yii::$app->request->post();
// логика проверки
return ['status' => 'ok', 'token' => 'some-token'];
}
}Шаг 4. Настрой коммуникацию между сервисами. Используй HTTP-запросы или очереди. Например, через Guzzle:
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'http://auth-service.local']);
$response = $client->post('/login', [
'json' => ['username' => 'test', 'password' => '123']
]);
$data = json_decode($response->getBody(), true);Вот и всё. Твой первый микросервис готов. Дальше — масштабируй.
Сравнение подходов: монолит vs микросервисы на Yii2
| Характеристика | Монолит | Микросервисы |
|---|---|---|
| Разработка | Быстрая на старте | Медленная на старте, но гибкая |
| Масштабирование | Всё приложение целиком | Только нужные сервисы |
| Тестирование | Проще интеграционное | Сложнее, нужно моки |
| Развёртывание | Один деплой | Много деплоев, CI/CD |
| Ошибки | Одна ошибка валит всё | Изолированы |
Как видишь, у каждого подхода есть плюсы и минусы. Для стартапа монолит — норм. Для большого проекта — микросервисы.
Лайфхаки для работы с Yii2 в микросервисах
Вот несколько советов, которые я накопил за годы работы.
- Не используй Yii2 встроенную сессию. Микросервисы должны быть stateless. Все данные храни в JWT-токенах или Redis.
- Разделяй базы данных. Каждый сервис — своя БД. Если нужно что-то общее, используй API или очереди.
- Используй конфигурацию через окружение. Не хардкодь URL других сервисов. Выноси в .env или переменные среды.
- Документируй API. Для Yii2 есть расширения под Swagger/OpenAPI. Это спасёт, когда сервисов станет много.
Как настроить общую аутентификацию
Одна из частых проблем — как сделать так, чтобы пользователь мог зайти в один сервис, а его данные были доступны везде. Решение — централизованный сервис аутентификации с JWT.
Пример: сервис auth выдает токен, а другие сервисы проверяют его через middleware.
// в каждом микросервисе
\Yii::$app->request->headers->add('Authorization', 'Bearer ' . $token);
// проверка
$user = \Yii::$app->user->loginByAccessToken($token);Но лучше сделать отдельный компонент для валидации токенов. Например, через библиотеку firebase/php-jwt.
use Firebase\JWT\JWT;
$key = 'secret';
$decoded = JWT::decode($token, $key, ['HS256']);
\Yii::$app->user->identity = User::findIdentity($decoded->sub);Так ты избегаешь дублирования кода и упрощаешь поддержку.
Что в итоге
Yii2 — это не приговор для монолита. Он отлично подходит для микросервисной архитектуры, если подойти с умом. Главное — не пытаться засунуть всё в один проект. Разделяй, властвуй и не забывай про документацию.
Микросервисы на Yii2 — это реально. Они дают гибкость, масштабируемость и упрощают поддержку. Но помни: с большой силой приходит большая ответственность. Начинай с малого, и всё получится.
