隨著IT技術的快速發展,現代企業面對越來越複雜的業務系統,傳統的單體應用架構已經無法滿足需求,微服務架構應運而生。微服務架構是一種架構風格,其中應用由多個小型服務組成,這些服務可以獨立部署、獨立運行、獨立擴展、獨立維護,以實現更好的可擴展性、可重複使用性和更好的靈活性。
那麼,如何使用PHP實作微服務架構呢?答案是使用Lumen - 一個輕量級的PHP框架。 Lumen基於Laravel,是為建構微服務和API設計的PHP框架。本文將介紹如何在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框架來寫我們的第一個微服務。我們要建立一個簡單的API,用於取得所有使用者的清單。實作這個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」這個字串。
現在,我們需要為我們的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格式的回應。
現在我們需要在路由檔案中註冊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領域模型設計想法來重新建構我們的應用。然後,我們將使用微服務的想法來將我們的各個服務分解為微服務。
首先,我們需要定義我們的領域模型,這是我們應用程式的核心。在本例中,我們將建立一個簡單的使用者管理微服務,該微服務的主要功能是管理使用者資料。
我們的使用者管理微服務必須具備以下功能:
現在我們需要把這些功能對應到微服務的介面中。
我們將根據領域模型中的不同功能設計不同的微服務介面。這裡我們將定義以下微服務介面:
現在,我們需要將我們的微服務介面分割到不同的微服務模組中。在本例中,我們將使用以下三個微服務模組:
這些微服務模組將直接與我們的資料庫互動。
我們現在已經擁有了我們的領域模型、微服務介面和微服務模組這些元件,我們現在可以將它們簡單地組合成一個微服務架構。整個架構如下所示:
API Gateway (Lumen) <--> User Authentication and Authorization Microservice <--> User Information Management Microservice <--> User Registration Microservice
我們啟用Lumen API Gateway, 它是我們的系統的初始點,它將接收所有請求並路由到適當的微服務模組。我們的領域模型是我們的業務邏輯,微服務介面將控制我們的資料互動。
现在,我们已经设计了微服务模块、微服务接口和整体微服务架构,我们可以开始实现我们的微服务。我们将针对上述三个微服务模块分别进行介绍。
我们的用户认证与授权微服务负责处理所有与用户认证相关的任务。它将接收用户凭据并验证它们的凭证是否正确。如果验证成功,它将生成一个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(); } }
用户信息管理微服务将负责向用户提供用户相关信息。在本例中,我们将创建以下操作的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.']); } }
注册微服务将处理用户注册过程。在本例中,我们将创建以下功能:
首先,我们将创建一个新控制器来处理用户注册。它应该读取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中文網其他相關文章!