
Was ist Swoft?
Swoft ist ein PHP-Microsoutices-Coroutine-Framework, das auf der Swoole- Erweiterung basiert. Wie Go verfügt Swoft über einen integrierten Coroutine-Webserver und einen gemeinsamen Coroutine-Client und befindet sich unabhängig vom herkömmlichen PHP-FPM im Speicher. Es gibt ähnliche Go-Sprachoperationen, ähnlich wie bei den flexiblen Annotationen des Spring Cloud-Frameworks, dem leistungsstarken globalen Abhängigkeitsinjektionscontainer, der umfassenden Service-Governance, dem flexiblen und leistungsstarken AOP, der Standardimplementierung der PSR-Spezifikation usw.
Durch drei Jahre Akkumulation und Erforschung der Richtung hat Swoft Swoft zur Spring Cloud in der PHP-Welt gemacht, die die beste Wahl für das Hochleistungs-Framework und das Microservices-Management von PHP ist.
Elegante Service-Governance
Swoft empfiehlt Entwicklern offiziell, Service-Mesh-Muster wie das Istio / Envoy-Framework zu verwenden, um Geschäfts- und Service-Governance zu trennen. Swoft bietet jedoch auch eine Reihe von Microservices-Komponenten für kleine und mittlere Unternehmen, um schnell Microservices aufzubauen.
Serviceregistrierung und -erkennung
Für die Registrierung und Ermittlung von Diensten wird die von Swoft bereitgestellte Swoft-Consul- Komponente benötigt, wenn andere Dritte ähnlich sind.
Registrierungs- und Stornierungsdienste
SwooleEvent::START Sie auf das SwooleEvent::START Ereignis und registrieren Sie den Dienst
  class RegisterServiceListener implements EventHandlerInterface {  private $agent;  public function handle(EventInterface $event): void {  $httpServer = $event->getTarget(); $service = [  
SwooleEvent::SHUTDOWN Ereignis SwooleEvent::SHUTDOWN den Dienst ab
  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(); } } 
Serviceerkennung
Dienstleister definieren
  class RpcProvider implements ProviderInterface {  private $agent;  public function getList(Client $client): array {  
Konfigurationsdienstanbieter
 return [ 'user' => [ 'class' => ServiceClient::class, 'provider' => bean(RpcProvider::class)  
Service Breaker
Swoft verwendet die Annotation @Breaker , um einen Schlag zu erzielen, der bei jeder Methode ausgeblasen werden kann.
  class BreakerLogic {  public function func(): string {  
Servicelimit
Swoft verwendet die Annotation @RateLimiter , um die Service-Drosselung zu implementieren, die für jede Methode gedrosselt werden kann, nicht nur für den Controller. KEY unterstützt auch die Ausdruckssprache Symfony / Ausdruckssprache .
  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]; } } 
Konfigurationscenter
Das Konfigurationscenter muss die von Swoft offiziell bereitgestellte Swoft-Apollo- Komponente verwenden, wenn andere Dritte ähnlich sind.
Agent deklarieren
  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(); } } } 
Agent starten
Der Agent muss nur ausgeführt werden, bevor der Dienst (HTTP / RPC / Websocket) gestartet wird.
 php bin/swoft agent:index 
Ressource