ホームページ  >  記事  >  バックエンド開発  >  PHPとLumenを統合してマイクロサービスアーキテクチャ開発を実現

PHPとLumenを統合してマイクロサービスアーキテクチャ開発を実現

PHPz
PHPzオリジナル
2023-06-25 12:07:231269ブラウズ

IT テクノロジーの急速な発展に伴い、現代の企業はますます複雑化するビジネス システムに直面しており、従来の単一アプリケーション アーキテクチャではニーズを満たせなくなり、時代の要求に応じてマイクロサービス アーキテクチャが登場しました。マイクロサービス アーキテクチャは、より優れたスケーラビリティ、再利用性、柔軟性を実現するために、アプリケーションを独立してデプロイ、実行、拡張、保守できる複数の小さなサービスで構成されるアーキテクチャ スタイルです。

それでは、PHP を使用してマイクロサービス アーキテクチャを実装するにはどうすればよいでしょうか?答えは、軽量の PHP フレームワークである Lumen を使用することです。 Lumen は、Laravel に基づいて、マイクロサービスと API を構築するために設計された PHP フレームワークです。この記事では、マイクロサービス アーキテクチャを Lumen フレームワークに統合する方法を紹介します。

ステップ 1: Lumen をインストールする

まず、Lumen フレームワークをローカルにインストールする必要があります。インストール手順はLaravelと同じです。以下に示すように、composer を通じてインストールできます:

composer create-project --prefer-dist laravel/lumen lumen_api

完了後、ローカルで Lumen フレームワーク実行環境を開始できます:

php -S localhost:8000 -t public

When "Lumen 開発サーバーが開始されました: 769e36aef6d7e070a35665dea52ee15e と表示されます。これは、Lumen フレームワークがローカル実行環境を正常にデプロイし、http://localhost:8000 を通じてそのデフォルト ページにアクセスできることを意味します。

ステップ 2: マイクロサービスを作成する

次に、Lumen フレームワークを使用して最初のマイクロサービスを作成します。すべてのユーザーのリストを取得する単純な API を作成します。この API を実装する手順は次のとおりです。

  1. API ルートの作成

ルーティング ファイル Routes/web.php に、リクエストを処理するルートを記述する必要があります。 APIに。この例では、以下に示すように、/get_users リクエストを処理するためにルート ファイルに GET ルートを書き込みます。

$router->get('/get_users', function () use ($router) {
    return 'List of all users';
});

この時点で、http://localhost:8000/get_users をリクエストすると、文字列「全ユーザーのリスト」が返されます。

  1. API リクエストの処理

次に、API のコントローラー クラスを作成する必要があります。 get_users リクエストを処理し、ユーザーのリストを返す役割を担う UserController クラスを作成しましょう。 app/Http/Controllers ディレクトリに UserController.php ファイルを作成し、次のコードをコピーします。

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    public function getAllUsers()
    {
        $users = ['User 1', 'User 2', 'User 3'];
        return response()->json($users);
    }
}

上記のコードでは、リストを返すパブリック関数 getAllUsers() を定義します。すべてのユーザーの情報を JSON 形式の応答として返します。

  1. API ルーティングをコントローラーに登録する

次に、API ルーティングをルーティング ファイル内の UserController コントローラーに登録し、ルート /api/get_users をUserController@getAllUsers メソッドを実行し、ルート ファイルを次のように変更します。

$router->get('api/get_users', 'UserController@getAllUsers');

この時点で、http://localhost:8000/api/get_users をリクエストすると、次のように JSON 形式のユーザー リストが返されます。以下に示す :

{
    "0": "User 1",
    "1": "User 2",
    "2": "User 3"
}

最後に、以下に示すように、先頭に UserController クラスをインポートする必要もあります:

<?php

use AppHttpControllersUserController;

このようにして、最も基本的な API を正常に実装しました。 Lumen フレームワークの実行下で使用できます。

ステップ 3: マイクロサービス フレームワークの統合

この前に、Lumen フレームワークで最初の API を作成しましたが、これは実際のマイクロサービス アプリケーションではありません。 Lumen をマイクロサービス アーキテクチャ アプリケーションに変えるには、DDD ドメイン モデルの設計アイデアを使用してアプリケーションを再構築する必要があります。次に、マイクロサービスの考え方を使用して、各サービスをマイクロサービスに分解します。

  1. ドメイン設計

まず、アプリケーションの核となるドメイン モデルを定義する必要があります。この例では、主な機能がユーザー データの管理である単純なユーザー管理マイクロサービスを作成します。

ユーザー管理マイクロサービスには次の機能が必要です:

  • ユーザー登録
  • ユーザー認証
  • ユーザー認可
  • ユーザー情報管理

次に、これらの関数をマイクロサービスのインターフェイスにマップする必要があります。

  1. マイクロサービス インターフェイス

ドメイン モデルのさまざまな機能に従って、さまざまなマイクロサービス インターフェイスを設計します。ここでは、次のマイクロサービス インターフェイスを定義します。

  • ユーザー登録インターフェイス (registerUser)
  • ユーザー認証インターフェイス (authenticateUser)
  • ユーザー認可インターフェイス (authorizeUser)
  • ユーザー情報管理インターフェイス (manageUserInfo)
  1. マイクロサービス モジュール

次に、マイクロサービス インターフェイスをサービス モジュール内のさまざまなマイクロサービスに分割する必要があります。 。この例では、次の 3 つのマイクロサービス モジュールを使用します。

  • ユーザー認証および認可マイクロサービス
  • ユーザー情報管理マイクロサービス
  • ユーザー登録マイクロサービス サービス

これらのマイクロサービス モジュールはデータベースと直接対話します。

  1. マイクロサービス アーキテクチャ

ドメイン モデル、マイクロサービス インターフェイス、マイクロサービス モジュール コンポーネントが完成したので、これらを簡単に組み合わせてマイクロサービス アーキテクチャを構築できるようになりました。アーキテクチャ全体は次のようになります。

API Gateway (Lumen) <--> User Authentication and Authorization Microservice <--> User Information Management Microservice <--> User Registration Microservice

Lumen API ゲートウェイを有効にします。これはシステムの最初のポイントであり、すべてのリクエストを受信し、適切なマイクロサービス モジュールにルーティングします。ドメイン モデルはビジネス ロジックであり、マイクロサービス インターフェイスはデータのやり取りを制御します。

第四步:实现微服务

现在,我们已经设计了微服务模块、微服务接口和整体微服务架构,我们可以开始实现我们的微服务。我们将针对上述三个微服务模块分别进行介绍。

1. 用户认证与授权微服务

我们的用户认证与授权微服务负责处理所有与用户认证相关的任务。它将接收用户凭据并验证它们的凭证是否正确。如果验证成功,它将生成一个JWT标记并将其返回给用户。

我们将针对以下任务编写用户认证与授权微服务:

  • 为用户生成JWT标记
  • 验证用户凭据

我们可以通过安装tymon / jwt-auth组件来编写我们的用户认证与授权微服务。使用以下命令进行安装:

composer require tymon/jwt-auth

然后,我们需要在配置文件中配置JWT密钥。现在,我们可以使用以下代码为用户认证与授权微服务创建一个新控制器:

<?php

namespace AppHttpControllers;

use IlluminateSupportFacadesAuth;
use AppModelsUser;
use IlluminateHttpRequest;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }
  
    /**
     * Get a JWT token.
     *
     * @return void
     */
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');
        if ($token = $this->guard()->attempt($credentials)) {
            return $this->respondWithToken($token);
        }
        return response()->json(['error' => 'Unauthorized'], 401);
    }
  
    /**
     * Get the authenticated User.
     *
     * @return void
     */
    public function me()
    {
        return response()->json(auth()->user());
    }
  
    /**
     * Log the user out (Invalidate the token).
     *
     * @return void
     */
    public function logout()
    {
        auth()->logout();
        return response()->json(['message' => 'Successfully logged out']);
    }
  
    /**
     * Refresh a token.
     *
     * @return void
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }
  
    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return mixed
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
  
    /**
     * Get the guard to be used during authentication.
     *
     * @return IlluminateContractsAuthGuard
     */
    public function guard()
    {
        return Auth::guard();
    }
}

2. 用户信息管理微服务

用户信息管理微服务将负责向用户提供用户相关信息。在本例中,我们将创建以下操作的API:

  • 获取用户个人信息
  • 更新用户密码

首先,我们将创建一个新控制器来管理用户信息:

<?php

namespace AppHttpControllers;

use IlluminateSupportFacadesHash;
use AppModelsUser;
use IlluminateHttpRequest;

class UserController extends Controller
{
    public function getUser(Request $request)
    {
        $user = User::where('id', $request->id)->first();
        if (!$user) {
            return response()->json(['message' => 'User not found.'], 404);
        }
        return response()->json(['user' => $user]);
    }
  
    public function updateUserPassword(Request $request)
    {
        $user = User::where('id', $request->id)->first();
        if (!$user) {
            return response()->json(['message' => 'User not found.'], 404);
        }
        $user->password = Hash::make($request->password);
        $user->save();
        return response()->json(['message' => 'User password updated successfully.']);
    }
  
}

3. 用户注册微服务

注册微服务将处理用户注册过程。在本例中,我们将创建以下功能:

  • 创建一个新用户,保存到数据库中
  • 发送电子邮件以验证用户的电子邮件地址

首先,我们将创建一个新控制器来处理用户注册。它应该读取POST有效载荷并保存新用户到数据库中。然后,它应该生成用户验证令牌并将其发送到用户的电子邮件地址。

<?php

namespace AppHttpControllers;

use IlluminateSupportFacadesHash;
use AppModelsUser;
use IlluminateHttpRequest;

class RegisterController extends Controller
{
    public function create(Request $request)
    {
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);
        $user->sendEmailVerificationNotification(); // send verification email
        return response()->json(['message' => 'User created successfully.']);
    }
  
}

现在,我们可以在Lumen框架中实现我们的微服务。我们的系统现在有三个微服务模块:“用户认证和授权微服务”、“用户信息管理微服务”和“用户注册微服务”,这些微服务与数据库交互,并由Lumen API Gateway处理。

总结

本文介绍了如何在Lumen框架中集成微服务架构,包括领域模型设计、微服务接口和微服务模块的开发。以上代码展示了Lumen框架如何开发微服务的过程。通过使用Lumen框架,开发者可以快速构建微服务,提高代码质量,加快项目进程。

以上がPHPとLumenを統合してマイクロサービスアーキテクチャ開発を実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。