首頁 > 後端開發 > php教程 > PHP和Lumen整合實現微服務架構開發

PHP和Lumen整合實現微服務架構開發

PHPz
發布: 2023-06-25 12:08:02
原創
1350 人瀏覽過

隨著IT技術的快速發展,現代企業面對越來越複雜的業務系統,傳統的單體應用架構已經無法滿足需求,微服務架構應運而生。微服務架構是一種架構風格,其中應用由多個小型服務組成,這些服務可以獨立部署、獨立運行、獨立擴展、獨立維護,以實現更好的可擴展性、可重複使用性和更好的靈活性。

那麼,如何使用PHP實作微服務架構呢?答案是使用Lumen - 一個輕量級的PHP框架。 Lumen基於Laravel,是為建構微服務和API設計的PHP框架。本文將介紹如何在Lumen框架中整合微服務架構。

第一步:安裝Lumen

首先,我們需要在本機上安裝Lumen框架。安裝步驟與Laravel相同。可以透過composer來進行安裝,如下所示:

composer create-project --prefer-dist laravel/lumen lumen_api
登入後複製

完成後,我們可以在本地啟動Lumen框架運行環境:

php -S localhost:8000 -t public
登入後複製

當出現「Lumen development server started: 」時,說明Lumen框架已經成功部署本地運行環境,我們可以透過http://localhost:8000來存取它的預設頁面。

第二步:寫微服務

接下來,我們將使用Lumen框架來寫我們的第一個微服務。我們要建立一個簡單的API,用於取得所有使用者的清單。實作這個API的步驟如下:

  1. 建立API路由

在路由檔案routes/web.php中,我們需要寫一個路由來處理對API的請求。在本例中,我們將在路由檔案中編寫一個GET路由,用於處理/get_users請求,如下所示:

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

此時,當你請求http://localhost:8000/get_users,會回傳「List of all users」這個字串。

  1. 處理API請求

現在,我們需要為我們的API建立一個控制器類別。讓我們建立UserController類,該類別將負責處理get_users請求並傳回使用者清單。我們可以在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,並修改route文件,如下所示:

$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框架下運行。

第三步:整合微服務框架

在此之前,我們已經在Lumen框架中創建了我們的第一個API,但是它並不是真正的微服務應用。為了將Lumen變成一個微服務架構應用程序,我們需要使用DDD領域模型設計想法來重新建構我們的應用。然後,我們將使用微服務的想法來將我們的各個服務分解為微服務。

  1. 領域設計

首先,我們需要定義我們的領域模型,這是我們應用程式的核心。在本例中,我們將建立一個簡單的使用者管理微服務,該微服務的主要功能是管理使用者資料。

我們的使用者管理微服務必須具備以下功能:

  • 使用者註冊
  • 使用者認證
  • 使用者授權
  • #使用者資訊管理

現在我們需要把這些功能對應到微服務的介面中。

  1. 微服務介面

我們將根據領域模型中的不同功能設計不同的微服務介面。這裡我們將定義以下微服務介面:

  • 使用者註冊介面(registerUser)
  • 使用者認證介面(authenticateUser)
  • 使用者授權介面(authorizeUser)
  • 使用者資訊管理介面(manageUserInfo)
  1. 微服務模組

現在,我們需要將我們的微服務介面分割到不同的微服務模組中。在本例中,我們將使用以下三個微服務模組:

  • 使用者認證與授權微服務
  • 使用者資訊管理微服務
  • 使用者註冊微服務

這些微服務模組將直接與我們的資料庫互動。

  1. 微服務架構

我們現在已經擁有了我們的領域模型、微服務介面和微服務模組這些元件,我們現在可以將它們簡單地組合成一個微服務架構。整個架構如下所示:

API Gateway (Lumen) <--> User Authentication and Authorization Microservice <--> User Information Management Microservice <--> User Registration Microservice
登入後複製

我們啟用Lumen API Gateway, 它是我們的系統的初始點,它將接收所有請求並路由到適當的微服務模組。我們的領域模型是我們的業務邏輯,微服務介面將控制我們的資料互動。

第四步:实现微服务

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

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板