Swoft 2.0.3重大な更新、優雅なマイクロサービスガバナンスの発表


Swoftとは?
Swoftは、Swoole拡張に基づいて実現されたPHPマイクロサービス連携フレームワークである.SwoftはGoのように、従来のPHP-FPMに依存せずに、コモンネットワークサーバと一般的なコモンクライアントを内蔵し、メモリを常駐させることができる.Go言語のようなコラボレーション操作方式があり、Spring Cloudフレームワークのような柔軟な注釈、強力なグローバル依存注入容器、完全なサービスガバナンス、柔軟で強力なAOP、標準的なPSR規範の実現などがある.
Swoftは3年間にわたる蓄積と方向の探索を通じて、SwoftをPHP界のSpring Cloudにし、PHP高性能フレームワークとマイクロサービスガバナンスの最適な選択である.
優雅なサービスガバナンス
Swoftの公式提案開発者は、Istio/Envoyフレームワークのようなサービスmeshモデルを使用して、ビジネスとサービスガバナンスを分離することを提案していますが、Swoftは中小規模企業にマイクロサービスを迅速に構築するためにマイクロサービスコンポーネントを提供しています.
  • サービス登録と発見
  • サービス溶断
  • サービスストリーム
  • 配置センタ
  • サービスの登録と検出
    サービス登録と発見は、Swoftが公式に提供しているswoft-consulコンポーネントを使用する必要があります.他のサードパーティも同様です.
    登録とキャンセルサービスSwooleEvent::STARTイベントの傍受、登録サービス
    /**
     * 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();
        }
    }
    SwooleEvent::SHUTDOWNイベントをリスニングし、サービスをキャンセル
    /**
     * 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();
        }
    }    

    サービス発見
    サービスプロバイダの定義
    /**
     * 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;
        }
    }

    サービスプロバイダの設定
    return [
        'user'           => [
          'class'   => ServiceClient::class,
          'provider' => bean(RpcProvider::class)
          // ...
        ]
    ];

    サービスヒューズ
    Swoftは@Breaker注記を用いて溶断を実現し、任意の方法の上で溶断操作を行うことができる.
    /**
     * 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';
        }
    }

    サービス制限フロー
    Swoftでは@RateLimiter注記を使用してサービス制限フローを実現し、コントローラだけでなく任意の方法で制限フローを実現することができ、KEYは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];
        }
    }

    コンフィギュレーションセンタ
    センターを構成するには、Swoftが公式に提供するSwoft-apolloコンポーネントを使用する必要があります.他のサードパーティも同様です.
    エージェントの宣言
    /**
     * 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   = 'restart();
            }
        }
    }

    エージェントの起動
    Agentは、サービス(Http/RPC/Websocket)が起動する前に実行するだけです.
    php bin/swoft agent:index

    コンテンツの更新
    除去(Remove)
  • request->json()除去方法(c 9 e 8 f 04)
  • 新規(Enhancement):
  • 新規インタフェース依存注入(6169 f 84)
  • 新規getFileメソッドファイルアップロード保存後の情報(fe 7 e 3 a 6)
  • を取得する.
  • 新規restart()サービス新規再開方法(2 ffec 37)
  • 新規呼び出し1.x RPCサービスサポート(30 d 73 c 3)
  • AOPクラス名マッチング追加正規表現(bc 5 e 479)
  • をサポート
  • RPC Server/Http Serverミドルウェアネーミングスペースuseエラーメッセージ(b 1 cec 04)
  • 新規ベリファイア除外属性フィールドunfields(b 1 bf 44 f)
  • 自動書き込みタイムスタンプ(dc 58011)
  • を追加
  • モデルアクションイベント(dc 58011)
  • を追加
  • 新規データベース移行(26 bb 464)
  • エンティティがjsonおよび配列と自動的に相互に回転する(dc 58011)
  • 新規モデル一括更新方法batchUpdateByIds(dc 58011)
  • 修復(Fixed):
  • cookies設定時のいくつかの問題を修復し、withCookie関連方法(b 05 afbb 01)
  • を追加します.
  • consoleがコモン方式でコマンドを実行する場合、処理エラー(8 a 5418 bf)
  • がキャプチャされなかったことを修復する.
  • websocket server再起動コマンドが古いserver問題を先に停止していないことを修復する(db 2 d 935)
  • 修復タスク戻り値null問題(a 69347 c)
  • RPC Serverがクラスミドルウェアのみ使用できない問題を修正する()204 bc 7 f
  • RPC Server戻り値nullの問題を修正(4 d 091 be)
  • ロガーおよびCLogログレベルが上書きできない問題および無効な問題を修正する(8 eb 8 aba)
  • 修復モデルのプロパティはカスタム式(dc 58011)
  • をサポートしていません.
    更新(Update):
  • ベリファイア最適化、カスタム検証ルール(d 959 a 4 f)
  • をサポート
  • 名前変更エラー処理管理クラスErrorHanldersErrorManager(f 3 a 8 f 04 b)
  • である.
  • consoleコンポーネントの異常処理はerrorコンポーネントが提供する統一処理スタイル(4 f 47204)
  • に変更された.
  • consoleコンポーネントは、無効化コマンドグループ(c 5 a 0269)
  • を設定することを可能にする.
  • デフォルトのエラー処理では、エラーキャプチャレベルの設定を許可します.デフォルトレベルはE_ALL | E_STRICT(aff 9029)
  • です.
  • ws serverの起動を最適化すると同時にhttp処理機能が有効になり、情報パネル追加プロンプト(83 a 81170)
  • ws serverの起動を最適化し、rpc serverの起動を同時に追加する.情報パネルにはrpc server情報(3 d 1 d 0 d 848)
  • が表示されない.
    拡張(Extra):
  • ドキュメント追加サポートgoogleによる検索
  • apolloコンポーネント
  • を追加
  • consulコンポーネント
  • を追加
  • breakerコンポーネント
  • を追加
  • limterコンポーネント
  • を追加
    しげん
  • Gitee: https://gitee.com/swoft/swoft
  • GitHub: https://github.com/swoft-cloud/swoft
  • 公式サイト:https://www.swoft.org
  • ドキュメント:https://www.swoft.org/docs