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

Проблема сервитизации

Php использует traditional framework (_2 _, _ 3_, symfony) для реализации микросервиса, эффект очень плохой.

Почему?

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

Кроме того, соединение с базой данных не может быть повторно использовано и не может быть защищено, потому что fpm является процессным, а количество fpm процессов также определяет количество одновременных. Это проблемы, которые нам дала простая разработка fpm.

Он недостаточно дружелюбен с инструментами микросервисов, такими как докер, и должен полагаться на nginx для предоставления услуг.

Итак, это причины, по которым Java сейчас более популярен в Интернет-платформе, чем PHP. Помимо PHP non-memory resident, необходимо решить множество других вопросов.

Посмотрим, как Swoft реализует микросервис.

Что такое свофт?

Swoft - это фреймворк сопрограмм для микросервисов PHP, основанный на расширении Swoole. Как и Go, Swoft имеет встроенный веб-сервер сопрограмм и общий клиент сопрограмм и находится в памяти, независимо от традиционного PHP-FPM.

Существуют аналогичные операции на языке Go, аналогичные гибким аннотациям инфраструктуры Spring Cloud, мощному контейнеру внедрения глобальных зависимостей, комплексному управлению услугами, гибкому и мощному AOP, стандартной реализации спецификации PSR и так далее.

Swoft Github

Что нам нужно для создания микросервиса?

  • Платформа высокопроизводительных приложений
  • Регистрация и обнаружение услуг
  • Сервисный автоматический выключатель
  • Ограничение обслуживания
  • Центр конфигурации

О, все готово в swoft

Высокая производительность Swoft

Вы можете себе представить, какие преимущества дает нам резидентная память.

  • Запустите инициализацию фреймворка только один раз, мы можем сконцентрироваться на обработке запросов, поскольку фреймворк может быть инициализирован в памяти только при запуске один раз для резидентной памяти
  • Мультиплексирование соединений, некоторые инженеры не могут понять, если не использовать пул соединений, каковы последствия установления соединений для каждого запроса? Это вызывает слишком много внутренних ресурсов в соединениях. Для некоторых базовых сервисов, таких как Redis, базы данных, соединения - дорогостоящая утечка.

Итак, есть хорошее решение? Ответ - да, и многие люди используют фреймворк под названием Swoft. Swoft - это фреймворк RPC с функцией Service Governance. Swoft - это первая полностековая структура сопрограмм с резидентной памятью PHP, основанная на базовой концепции Spring Boot, соглашение больше, чем конфигурация.

Swoft обеспечивает более элегантный способ использования RPC таких служб, как Dubbo, а Swoft имеет отличную производительность, аналогичную производительности Golang. Вот результат стресс-теста Swoft производительности в моем PC.

В стресс-тесте ab скорость обработки данных просто потрясающая. С i7 generation 8 процессором и 16GB памятью 100000requests использует только 5s. Достичь времени в fpm режиме разработки принципиально невозможно.

Теста также достаточно, чтобы продемонстрировать высокую производительность и стабильность Swoft.

Регистрация и открытие службы

В процессе управления микросервисами часто вовлекается регистрация сервисов, инициированных сторонними кластерами, такими как consul / etcd. В этой главе используется компонент swoft-consul в структуре Swoft для реализации регистрации и обнаружения служб.

Логика реализации

Сервисный выключатель

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

Одно из возможных решений состоит в том, что автоматический выключатель периодически определяет, возобновлены ли услуги поставщика. После возобновления статус становится закрытым. Состояние - полуоткрытое состояние, когда автоматический выключатель повторяет попытку.

Использование предохранителя простое и мощное. Он может быть аннотирован @Breaker. Предохранитель Swoft может использоваться в любом сценарии, например при вызове службы. Он может быть понижен или не вызван при запросе сторонней услуги.

Ограничение услуги

Ограничение потока, автоматический выключатель, понижение уровня обслуживания. Их можно многократно подчеркивать, потому что они действительно важны. Когда служба не работает, ее необходимо сломать. Ограничение потока - это инструмент самозащиты. Если нет механизма самозащиты и соединения принимаются независимо от их количества, интерфейсная часть обязательно зависнет, когда трафик очень большой, в то время как серверная часть не может обрабатывать все соединения.

Ограничение потока состоит в том, чтобы ограничить количество одновременных и количество запросов при доступе к ограниченным ресурсам, таким как товары для быстрой продажи, чтобы эффективно сократить пик и сгладить кривую потока.

Целью ограничения потока является ограничение скорости одновременного доступа и одновременных запросов или ограничение скорости запроса в пределах временного окна для защиты системы. Как только предел скорости достигнут или превышен, запросы могут быть отклонены или поставлены в очередь.

Нижний уровень ограничения потока Swoft использует алгоритм сегмента токенов, а нижележащий уровень полагается на Redis для реализации ограничения распределенного потока.

Ограничение потока Swoft не только ограничивает контроллеры, оно также ограничивает методы в любом bean-компоненте и контролирует скорость доступа к методам. В следующем примере приводится подробное объяснение.

<?php declare(strict_types=1);
namespace App\Model\Logic;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Limiter\Annotation\Mapping\RateLimiter;
/**
 * Class LimiterLogic
 *
 * @since 2.0
 *
 * @Bean()
 */
class LimiterLogic
{
    /**
     * @RequestMapping()
     * @RateLimiter(rate=20, fallback="limiterFallback")
     *
     * @param Request $request
     *
     * @return array
     */
    public function requestLimiter2(Request $request): array
    {
        $uri = $request->getUriPath();
        return ['requestLimiter2', $uri];
    }
    
    /**
     * @param Request $request
     *
     * @return array
     */
    public function limiterFallback(Request $request): array
    {
        $uri = $request->getUriPath();
        return ['limiterFallback', $uri];
    }
}

Это поддерживает выражение symfony/expression-language. Если скорость ограничена, будет вызван метод limiterFallback, определенный в fallback.

Центр конфигурации

Прежде чем говорить о центре конфигурации, давайте поговорим о файле конфигурации. Мы в этом не новички. Это дает нам возможность динамически изменять программу. Цитата от кого-то:

Динамическая регулировка полета системы во время выполнения!

Для автономной версии мы называем это конфигурацией (файлом); для распределенной кластерной системы мы называем ее конфигурационным центром (системой);

В этой главе Apollo используется в качестве примера для получения конфигурации и безопасного перезапуска служб из удаленного центра конфигурации. Если вы не знакомы с Apollo, вы можете сначала взглянуть на компонент Swoft extension Apollo и прочитать Apollo Официальную документацию.

В этой главе в качестве примера используется Apollo из Swoft. Когда конфигурация Apollo изменится, перезапустите службу (http-server / rpc-server / ws-server). Ниже приведен пример агента:

<?php declare(strict_types=1);

namespace App\Model\Logic;
use Swoft\Apollo\Config;
use Swoft\Apollo\Exception\ApolloException;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Bean\Annotation\Mapping\Inject;
/**
 * Class ApolloLogic
 *
 * @since 2.0
 *
 * @Bean()
 */
class ApolloLogic
{
    /**
     * @Inject()
     *
     * @var Config
     */
    private $config;
    /**
     * @throws ApolloException
     */
    public function pull(): void
    {
        $data = $this->config->pull('application');
        
        // Print data
        var_dump($data);
    }
}

Выше приведено простое извлечение конфигурации Apollo, в дополнение к этому методу Swoft-Apollo предоставляет другие способы использования.

Заключение

На этом этапе наша простая структура микросервисов создана. Если вы используете традиционный фреймворк PHP, этого очень сложно добиться. Но пользоваться Swoft очень просто.