Framework de microservices PHP - Swoft 2.0.3 publié

image


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 * * @since 2.0 * * @Listener(event=SwooleEvent::START) */ class RegisterServiceListener implements EventHandlerInterface { /** * @Inject() * * @var Agent */ private $agent; /** * @param EventInterface $event */ public function handle(EventInterface $event): void { /* @var HttpServer $httpServer */ $httpServer = $event->getTarget(); $service = [ // .... ]; $scheduler = Swoole\Coroutine\Scheduler(); $scheduler->add(function () use ($service) { // Register $this->agent->registerService($service); CLog::info('Swoft http register service success by consul!'); }); $scheduler->start(); } } 

Écoutez l' SwooleEvent::SHUTDOWN , annulez le service


 /** * Class DeregisterServiceListener * * @since 2.0 * * @Listener(SwooleEvent::SHUTDOWN) */ class DeregisterServiceListener implements EventHandlerInterface { /** * @Inject() * * @var Agent */ private $agent; /** * @param EventInterface $event */ public function handle(EventInterface $event): void { /* @var HttpServer $httpServer */ $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 * * @since 2.0 * * @Bean() */ class RpcProvider implements ProviderInterface { /** * @Inject() * * @var Agent */ private $agent; /** * @param Client $client * * @return array * @example * [ * 'host:port' * ] */ public function getList(Client $client): array { // Get health service from consul $services = $this->agent->services(); $services = [ ]; return $services; } } 

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 * * @since 2.0 * * @Bean() */ class BreakerLogic { /** * @Breaker(fallback="funcFallback") * * @return string * @throws Exception */ public function func(): string { // Do something throw new Exception('Breaker exception'); } /** * @return string */ public function funcFallback(): string { return 'funcFallback'; } } 

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 * * @since 2.0 * * @Controller(prefix="limiter") */ class LimiterController { /** * @RequestMapping() * @RateLimiter(key="request.getUriPath()", fallback="limiterFallback") * * @param Request $request * * @return array */ public function requestLimiter(Request $request): array { $uri = $request->getUriPath(); return ['requestLimiter', $uri]; } /** * @param Request $request * * @return array */ 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 * * @since 2.0 * * @Command("agent") */ class AgentCommand { /** * @Inject() * * @var Config */ private $config; /** * @CommandMapping(name="index") */ 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()); } } } /** * @param array $data * * @throws ContainerException * @throws ReflectionException */ 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!'); /** @var HttpServer $server */ $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


Source: https://habr.com/ru/post/fr460147/


All Articles