
Qu'est-ce que Swoft?
Swoft est un framework de coroutine de microservices PHP basé sur l'extension Swoole . Comme Go, Swoft possède un serveur Web coroutine intégré et un client coroutine commun et réside en mémoire, indépendamment du PHP-FPM traditionnel. Il existe des opérations de langage Go similaires, similaires aux annotations flexibles du framework Spring Cloud, un puissant conteneur d'injection de dépendance globale, une gouvernance de service complète, un AOP flexible et puissant, une implémentation de spécification PSR standard, etc.
Grâce à trois années d'accumulation et d'exploration de directions, Swoft a fait de Swoft le Spring Cloud dans le monde PHP, qui est le meilleur choix pour le cadre hautes performances de PHP et la gestion des microservices.
Gouvernance de service élégante
Swoft recommande officiellement aux développeurs d'utiliser des modèles de maillage de services, tels que le framework Istio / Envoy, pour séparer la gouvernance des entreprises et des services, mais Swoft fournit également un ensemble de composants de microservices pour les petites et moyennes entreprises afin de créer rapidement des microservices.
Inscription et découverte du service
Pour l'enregistrement et la découverte du service, le composant swoft-consul fourni par Swoft est requis, si d'autres tiers sont similaires.
Services d'inscription et d'annulation
Écoutez l' SwooleEvent::START
, inscrivez le service
class RegisterServiceListener implements EventHandlerInterface { private $agent; public function handle(EventInterface $event): void { $httpServer = $event->getTarget(); $service = [
Écoutez l' SwooleEvent::SHUTDOWN
, annulez le service
class DeregisterServiceListener implements EventHandlerInterface { private $agent; public function handle(EventInterface $event): void { $httpServer = $event->getTarget(); $scheduler = Swoole\Coroutine\Scheduler(); $scheduler->add(function () use ($httpServer) { $this->agent->deregisterService('swoft'); }); $scheduler->start(); } }
Découverte de service
Définition d'un fournisseur de services
class RpcProvider implements ProviderInterface { private $agent; public function getList(Client $client): array {
Fournisseur de services de configuration
return [ 'user' => [ 'class' => ServiceClient::class, 'provider' => bean(RpcProvider::class)
Disjoncteur de service
Swoft utilise l'annotation @Breaker
pour obtenir un coup, qui peut être soufflé sur n'importe quelle méthode.
class BreakerLogic { public function func(): string {
Limite de service
Swoft utilise l'annotation @RateLimiter
pour implémenter la limitation de service, qui peut être limitée sur n'importe quelle méthode, pas seulement sur le contrôleur, et KEY prend également en charge le langage d' expression symfony / expression- language.
class LimiterController { public function requestLimiter(Request $request): array { $uri = $request->getUriPath(); return ['requestLimiter', $uri]; } public function limiterFallback(Request $request): array { $uri = $request->getUriPath(); return ['limiterFallback', $uri]; } }
Centre de configuration
Le centre de configuration doit utiliser le composant Swoft-apollo fourni officiellement par Swoft, si d'autres tiers sont similaires.
Déclarer l'agent
class AgentCommand { private $config; public function index(): void { $namespaces = [ 'application' ]; while (true) { try { $this->config->listen($namespaces, [$this, 'updateConfigFile']); } catch (Throwable $e) { CLog::error('Config agent fail(%s %s %d)!', $e->getMessage(), $e->getFile(), $e->getLine()); } } } public function updateConfigFile(array $data): void { foreach ($data as $namespace => $namespaceData) { $configFile = sprintf('@config/%s.php', $namespace); $configKVs = $namespaceData['configurations'] ?? ''; $content = '<?php return ' . var_export($configKVs, true) . ';'; Co::writeFile(alias($configFile), $content, FILE_NO_DEFAULT_CONTEXT); CLog::info('Apollo update success!'); $server = bean('httpServer'); $server->restart(); } } }
Démarrer l'agent
L'agent doit uniquement s'exécuter avant le démarrage du service (Http / RPC / Websocket).
php bin/swoft agent:index
Ressource