popov . dev

Main

Library

Articles

Разработка микро...

Разработка микросервисов на чистом PHP без фреймворков

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

1. Обзор архитектуры

  • Разделение сервисов: Каждый микросервис отвечает за определенный домен (например, за аутентификацию, управление пользователями, каталог продуктов).
  • Независимое развертывание: Каждый микросервис может быть развернут независимо от других, даже с использованием разных версий PHP, если это необходимо.
  • Коммуникация: Микросервисы могут взаимодействовать друг с другом с помощью:
  • HTTP/REST API (с cURL или Guzzle на PHP)
  • Очереди сообщений (например, RabbitMQ)
  • gRPC (для более быстрой передачи данных на основе двоичного кода)

2. Структура проекта

Каждый сервис должен быть структурирован как самостоятельный проект:

  • Сервис A (Управление пользователями)
  • Сервис В (Обработка заказов)
  • Сервис C (аутентификация)

Каждый сервис должен иметь свой собственный репозиторий Git или, по крайней мере, быть разделен каталогом/модулем.

3. HTTP-связь с PHP

Используйте встроенные возможности PHP (или cURL для более продвинутых функций) для взаимодействия между микросервисами по протоколу HTTP.

Пример HTTP-запроса на PHP с использованием file_get_contents:

$url = 'http://userservice.local/api/users/1';
$response = file_get_contents($url);
$data = json_decode($response, true);

Пример использования cURL:

$ch = curl_init('http://authservice.local/api/login');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'username' => 'user',
    'password' => 'pass',
]));
$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);

4. Автозагрузка и пространства имен

Используйте автозагрузчик Composer для управления зависимостями и PSR-4 для автоматической загрузки классов в ваши микросервисы.

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

5. Маршрутизация

Вы можете реализовать свою собственную логику маршрутизации или использовать легкий PHP-фреймворк, такой как Slim или Silex, для обработки HTTP-запросов.

Простой пример встроенной маршрутизации:

$requestUri = $_SERVER['REQUEST_URI'];

if ($requestUri == '/users') {
    // Логика для операций, связанных с пользователем
} elseif ($requestUri == '/products') {
    // Логика операций, связанных с продуктом
}

6. Доступ к базе данных

Каждый микросервис должен иметь свою собственную базу данных или схему. Используйте PDO или облегченную ORM- подобную Doctrine для управления взаимодействиями с базой данных.

Пример использования PDO:

$pdo = new PDO('mysql:host=localhost;dbname=user_service', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch()) {
    echo $row['name'];
}

7. Межсервисная связь (асинхронная)

Для асинхронной связи вы можете использовать посредника сообщений, такого как RabbitMQ или Kafka.

Используйте библиотеки PHP, такие как php-amqplib, для взаимодействия с RabbitMQ.

Пример отправки сообщения:

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);

$data = "Зарегистрирован новый пользователь";
$msg = new AMQPMessage($data);
$channel->basic_publish($msg, '', 'task_queue');

$channel->close();
$connection->close();

8. Безопасность (аутентификация JWT)

Для аутентификации пользователей в разных службах реализуйте JWT (веб-токен JSON) для аутентификации без учета состояния.

  • Такие библиотеки, как firebase/php-jwt, можно использовать для обработки токенов JWT в PHP.
  • Токены JWT могут передаваться между службами через заголовки для аутентификации запросов.

Пример проверки JWT:

use \Firebase\JWT\JWT;

$jwt = $_SERVER['HTTP_AUTHORIZATION'];
$key = 'your_secret_key';
try {
    $decoded = JWT::decode($jwt, $key, array('HS256'));
    echo "ID пользователя: " . $decoded->userId;
} catch (Exception $e) {
    echo 'Неавторизован: ' . $e->getMessage();
}

9. Обнаружение служб

В архитектуре микросервисов может потребоваться динамическое обнаружение служб. Для обнаружения служб могут быть интегрированы такие инструменты, как Consul или Eureka. Для небольших приложений, работающих на PHP, вы можете жестко закодировать URL-адреса служб или использовать переменные окружения.

10. Балансировка нагрузки и масштабирование

  • Используйте Nginx или HAProxy в качестве балансировщика нагрузки для распределения трафика между экземплярами ваших PHP-микросервисов.
  • Контейнеризируйте свои микросервисы PHP с помощью Docker и организуйте их масштабирование с помощью Kubernetes.

11. Мониторинг и ведение журнала

Используйте библиотеки ведения журналов, такие как Monolog, для централизации журналов со всех микросервисов. Пример ведения журнала с помощью Monolog:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
$log->warning('Foo');

12. Обработка ошибок и сбоев

  • Реализуйте автоматические выключатели (с использованием библиотек, таких как PHP Circuit Breaker) для управления сбоями между службами.
  • Используйте механизмы повторных попыток и ограничения по времени ожидания при выполнении межсервисных HTTP-вызовов или вызовов на основе сообщений.

Заключение

Встроенные микросервисы PHP могут быть созданы с использованием существующих инструментов и библиотек PHP для обмена данными, маршрутизации, управления базами данных и ведения журнала. Главное - сохранить независимость сервисов, следовать рекомендациям по разработке API и внедрить асинхронный обмен сообщениями для более сложных рабочих процессов.

Comments

In order to leave your opinion, you need to register on the website