クラウド コンピューティングとマイクロサービス アーキテクチャの普及に伴い、API ゲートウェイはマイクロサービス システムに不可欠な部分となり、その機能はますます重要になっています。 API ゲートウェイは、システム内外のすべてのリクエストをインターセプトして転送することができ、セキュリティ、アクセス制御、トラフィック制御、負荷分散などの機能を担当します。
この記事では、PHP7.0 を使用して、次の機能を実現する単純な API ゲートウェイを実装する方法を紹介します。
始める前に、次のソフトウェアがインストールされていることを確認してください:
ステップ 1: 基本的な API ゲートウェイを作成する
まず、リクエストをマイクロサービスにルーティングするための基本的な API ゲートウェイを作成する必要があります。ルーティングを処理するために Symfony Routing Component を使用します。
新しい PHP ファイル (例:index.php) を作成し、次のコードを追加します。
require_once 'vendor/autoload.php'; use SymfonyComponentRoutingRouteCollection; use SymfonyComponentRoutingRoute; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingMatcherUrlMatcher; use SymfonyComponentRoutingExceptionResourceNotFoundException; $routes = new RouteCollection(); $routes->add('hello', new Route('/hello/{name}', array( 'controller' => function ($request) { return new Response(sprintf("Hello, %s!", $request->attributes->get('name'))); } ))); $matcher = new UrlMatcher($routes, getRequest()); try { $request = Request::createFromGlobals(); $parameters = $matcher->matchRequest($request); $response = call_user_func($parameters['controller'], $request); } catch (ResourceNotFoundException $exception) { $response = new Response('Not Found', Response::HTTP_NOT_FOUND); } catch (Exception $exception) { $response = new Response('An error occurred', Response::HTTP_INTERNAL_SERVER_ERROR); } $response->send();
このコードでは、リクエストが転送される「hello」というルートを作成します。匿名のコントローラー メソッド。このルートが処理されると、応答で「Hello, {name}!」が返されます。ここで、{name} はルート パラメータです。
Symfony の Request クラスと Response クラスを使用して、HTTP リクエストとレスポンスを作成および送信します。 Symfony のルーティング コンポーネントは、リクエストを一致するルートにルーティングし、一致するコントローラー メソッドを呼び出す役割を果たします。
この時点で、このファイルを実行して http://localhost:8080/hello/world にアクセスすると、「Hello, world!」という出力が表示されます。
ステップ 2: 電流制限機能を追加する
API ゲートウェイが各 API リクエストを制限して、サーバー側の過負荷のリスクを軽減できることを期待しています。これを行うには、Redis を使用して各 API のスロットル カウンターを保存します。
まず、Composer を使用して、PHP の Redis クライアント ライブラリである Predis をインストールする必要があります:
composer require predis/predis
次に、次のコードをindex.php に追加して、マイクロサービスがチェックされるたびにリクエスト前のカウンター:
use PredisClient; // ... $redis = new Client(); // Limit requests to 100 per minute per user. $maxRequests = 100; $timeWindow = 60; // seconds $ip = $_SERVER['REMOTE_ADDR']; $key = "ratelimit:{$ip}"; $currentRequests = $redis->incr($key); $redis->expire($key, $timeWindow); if ($currentRequests > $maxRequests) { $response = new Response('Rate limit exceeded', Response::HTTP_TOO_MANY_REQUESTS); $response->headers->set('Retry-After', $timeWindow); $response->send(); exit; }
このコードでは、Predis クライアントを使用して Redis サーバーに接続し、各リクエストの IP アドレスをキー名として使用します。ユーザーごとに 1 分あたり 100 リクエストの制限を設定し、Incr 関数を使用してカウンターをインクリメントします。
カウンターの現在の値が最大制限を超えた場合、HTTP 429「リクエストが多すぎます」応答が返され、リクエストを再試行する時期をクライアントに通知するために「Retry-After」ヘッダーが設定されます。
ステップ 3: 認証および認可関数を追加する
API リクエストごとに基本的な認証および認可関数を追加する必要もあります。このために、JSON Web Token (JWT) 標準を使用します。
JWT を使用するには、まず firebase/php-jwt ライブラリをインストールしてください:
composer require firebase/php-jwt
次に、index.php に次のコードを追加して、JWT 標準の認証と認可を実装します:
use FirebaseJWTJWT; // ... $key = 'secret'; $token = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; if ($token) { try { $decoded = JWT::decode($token, $key, array('HS256')); $user_id = $decoded->sub; $roles = $decoded->roles; } catch (Exception $e) { $response = new Response('Invalid token', Response::HTTP_UNAUTHORIZED); $response->send(); exit; } // Check user roles and permissions here... } else { $response = new Response('Token required', Response::HTTP_UNAUTHORIZED); $response->send(); exit; }
このコードでは、HTTP ヘッダーから抽出された JWT トークンを使用してリクエストを識別し、認証します。 JWT ライブラリを使用してトークンをデコードし、署名と有効性を検証します。トークンが有効な場合、ユーザー ID とロール情報がトークンから抽出され、その権限がチェックされます。トークンが無効な場合は、HTTP 401「Unauthorized」応答が返されます。
ステップ 4: 統計関数を追加する
最後に、API の使用状況を記録するための簡単な統計関数を追加します。これを行うには、Redis を使用してリクエストの数や応答時間などのメトリクスを保存します。
まず、phpredis 拡張機能をインストールする必要があります:
sudo apt-get install php7.0-redis
次に、index.php に次のコードを追加して、各リクエストの統計を記録します:
use PredisClient; // ... $redis = new Client(); $ip = $_SERVER['REMOTE_ADDR']; $key = "stats:{$ip}"; $now = time(); $timestamp = strtotime(date('Y-m-d H:i:00', $now)); $redis->zincrby($key, 1, $timestamp); $redis->expire($key, 3600);
Here Inコードでは、IP アドレスごと (つまりユーザーごと) のリクエスト数を考慮し、Redis の ZINCRBY コマンドを使用してリクエスト カウンタの値を 1 増やします。また、Redis での有効期限の設定を使用して、期限切れのレコードを削除します。
ステップ 5: API ゲートウェイのデプロイ
これで、ルーティング、制限、認証、承認、統計などの基本機能が API ゲートウェイに追加されました。 Apache や Nginx などの従来の Web サーバーを使用してデプロイすることも、テスト用に PHP 組み込みサーバーを使用することもできます。
まず、ターミナルで次のコマンドを実行して、PHP 組み込みサーバーを起動し、index.php ファイルを指定します。
php -S localhost:8080
次に、http:/ にアクセスします。 / ブラウザーで /localhost:8080/ を実行し、URL パスに /hello/world などのルートを追加して、API ゲートウェイのさまざまな機能をテストします。
概要
この記事では、PHP7.0 とさまざまなオープン ソース ライブラリを使用して、基本的な API ゲートウェイを実装し、制限、認証、認可、統計などの基本的な機能を追加します。 API ゲートウェイはマイクロサービス アーキテクチャの不可欠な部分であり、パフォーマンス、セキュリティ、スケーラビリティの向上に役立ちます。
実際には、現在では、Kong、Tyk、AWS API Gateway など、ロード バランシング、キャッシュ、セキュリティ、モニタリング、管理など
ただし、PHP や Symfony などのライブラリを使用して API ゲートウェイを構築する方法を知ることは依然として価値があり、シンプルな API ゲートウェイを迅速に構築する必要がある場合には優れた選択肢です。
以上がPHP7.0 を使用してマイクロサービス アーキテクチャで API ゲートウェイを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。