Разработка микросервисов на чистом 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