Kerangka kerja microservices PHP - Swoft 2.0.3 diterbitkan

gambar


Apa itu Swoft?


Swoft adalah kerangka kerja coroutine microservices PHP yang didasarkan pada ekstensi Swoole . Seperti halnya Go, Swoft memiliki server web coroutine bawaan dan klien coroutine yang umum dan terdapat dalam memori, tidak tergantung pada PHP-FPM tradisional. Ada operasi Go bahasa yang serupa, mirip dengan anonimasi kerangka kerja Spring Cloud, wadah injeksi ketergantungan global yang kuat, tata kelola layanan komprehensif, AOP fleksibel dan kuat, penerapan spesifikasi PSR standar, dan sebagainya.


Melalui tiga tahun akumulasi dan eksplorasi arah, Swoft telah menjadikan Swoft Spring Cloud di dunia PHP, yang merupakan pilihan terbaik untuk kerangka kerja kinerja tinggi PHP dan manajemen layanan mikro.


Tata kelola layanan yang elegan


Swoft secara resmi merekomendasikan bahwa pengembang menggunakan pola-pola mesh layanan, seperti kerangka kerja Istio / Utusan, untuk memisahkan tata kelola bisnis dan layanan, tetapi Swoft juga menyediakan satu set komponen layanan-mikro untuk bisnis kecil dan menengah untuk dengan cepat membangun layanan-mikro.



Pendaftaran dan penemuan layanan


Untuk registrasi dan penemuan layanan, komponen konsul swoft yang disediakan oleh Swoft diperlukan, jika pihak ketiga lainnya serupa.


Layanan pendaftaran dan pembatalan


Dengarkan acara SwooleEvent::START , daftarkan layanan


 /** * 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(); } } 

Dengarkan acara SwooleEvent::SHUTDOWN , batalkan layanan


 /** * 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(); } } 

Penemuan layanan


Menentukan penyedia layanan


 /** * 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; } } 

Penyedia layanan konfigurasi


 return [ 'user' => [ 'class' => ServiceClient::class, 'provider' => bean(RpcProvider::class) // ... ] ]; 

Pemecah layanan


Swoft menggunakan anotasi @Breaker untuk mendapatkan pukulan, yang dapat meledak pada metode apa pun.


 /** * 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'; } } 

Batas layanan


Swoft menggunakan anotasi @RateLimiter untuk mengimplementasikan @RateLimiter layanan, yang dapat @RateLimiter pada metode apa pun, tidak hanya pada pengontrol, dan KEY juga mendukung bahasa ekspresi symfony / ekspresi- bahasa.


 /** * 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]; } } 

Pusat konfigurasi


Pusat konfigurasi perlu menggunakan komponen Swoft-apollo yang disediakan oleh Swoft secara resmi, jika pihak ketiga lainnya serupa.


Menyatakan agen


 /** * 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(); } } } 

Mulai agen


Agen hanya perlu dijalankan sebelum layanan (Http / RPC / Websocket) dimulai.


 php bin/swoft agent:index 

Sumberdaya


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


All Articles