Представь: ты построил дом из одного большого куска бетона. Всё вроде бы крепко, но если нужно заменить окно — приходится ломать стену. Вот так и с монолитными приложениями. Микросервисы — это как конструктор: каждый блок живёт своей жизнью, но вместе они собирают целый дом. Yii2 — мощный фреймворк, но обычно его используют для монолитов. Однако никто не запрещает разбить его на микросервисы. В этой статье я покажу, как это сделать без боли.

Почему Yii2 и микросервисы — не враги

Многие думают, что Yii2 подходит только для классических MVC-монолитов. Это не совсем так. Yii2 — это просто набор инструментов: ORM, роутинг, компоненты. Ничто не мешает использовать его как скелет для отдельного микросервиса. Например, один микросервис отвечает за пользователей, другой — за заказы, третий — за платежи. Каждый из них может быть написан на Yii2, но работать независимо.

Микросервисная архитектура — это про разделение ответственности. 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. Это спасёт, когда сервисов станет много.
Лайфхак: Для обмена данными между сервисами используй RabbitMQ или Redis. Это быстрее, чем HTTP, и не блокирует выполнение. Yii2 легко интегрируется с этими инструментами через компоненты.

Как настроить общую аутентификацию

Одна из частых проблем — как сделать так, чтобы пользователь мог зайти в один сервис, а его данные были доступны везде. Решение — централизованный сервис аутентификации с 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 — это реально. Они дают гибкость, масштабируемость и упрощают поддержку. Но помни: с большой силой приходит большая ответственность. Начинай с малого, и всё получится.

Студия WNDER