Dengan perkembangan pesat teknologi IT, perusahaan moden menghadapi sistem perniagaan yang lebih kompleks Seni bina aplikasi tunggal tradisional tidak lagi dapat memenuhi keperluan, dan seni bina perkhidmatan mikro muncul mengikut keperluan masa. Seni bina perkhidmatan mikro ialah gaya seni bina di mana aplikasi terdiri daripada berbilang perkhidmatan kecil yang boleh digunakan, dijalankan, dikembangkan dan diselenggara secara bebas untuk mencapai kebolehskalaan, kebolehgunaan semula dan fleksibiliti yang lebih baik.
Jadi, bagaimana untuk menggunakan PHP untuk melaksanakan seni bina perkhidmatan mikro? Jawapannya ialah menggunakan Lumen - rangka kerja PHP yang ringan. Berdasarkan Laravel, Lumen ialah rangka kerja PHP yang direka untuk membina perkhidmatan mikro dan API. Artikel ini akan memperkenalkan cara mengintegrasikan seni bina perkhidmatan mikro dalam rangka kerja Lumen.
Mula-mula, kita perlu memasang rangka kerja Lumen secara setempat. Langkah pemasangan adalah sama seperti untuk Laravel. Ia boleh dipasang melalui komposer, seperti yang ditunjukkan di bawah:
composer create-project --prefer-dist laravel/lumen lumen_api
Selepas selesai, kita boleh memulakan persekitaran berjalan rangka kerja Lumen secara setempat:
php -S localhost:8000 -t public
Apabila "Pelayan pembangunan Lumen bermula:
Seterusnya, kami akan menggunakan rangka kerja Lumen untuk menulis perkhidmatan mikro pertama kami. Kami akan mencipta API mudah yang mendapat senarai semua pengguna. Langkah-langkah untuk melaksanakan API ini adalah seperti berikut:
Dalam laluan fail laluan/web.php, kita perlu menulis laluan untuk mengendalikan permintaan kepada API. Dalam contoh ini, kami akan menulis laluan GET dalam fail penghalaan untuk mengendalikan permintaan /get_users, seperti yang ditunjukkan di bawah:
$router->get('/get_users', function () use ($router) { return 'List of all users'; });
Pada masa ini, apabila anda meminta http://localhost:8000/get_users, "List" akan menjadi rentetan semua pengguna" dikembalikan.
Sekarang, kita perlu mencipta kelas pengawal untuk API kita. Mari buat kelas UserController yang akan bertanggungjawab untuk mengendalikan permintaan get_users dan mengembalikan senarai pengguna. Kami boleh mencipta fail UserController.php dalam direktori app/Http/Controllers dan salin kod berikut ke dalamnya:
<?php namespace AppHttpControllers; use IlluminateHttpRequest; class UserController extends Controller { public function getAllUsers() { $users = ['User 1', 'User 2', 'User 3']; return response()->json($users); } }
Dalam kod di atas, kami telah menentukan fungsi awam getAllUsers() yang akan mengembalikan Senarai semua pengguna sebagai respons dalam format JSON.
Sekarang kita perlu mendaftar laluan API ke pengawal UserController dalam fail laluan, petakan laluan kami /api/get_users kepada kaedah UserController@getAllUsers, dan ubah suai fail laluan seperti yang ditunjukkan di bawah :
$router->get('api/get_users', 'UserController@getAllUsers');
Pada ketika ini, apabila anda meminta http://localhost:8000/api/get_users, senarai pengguna dalam format JSON akan dikembalikan, seperti yang ditunjukkan di bawah:
{ "0": "User 1", "1": "User 2", "2": "User 3" }
Akhir sekali, kami juga perlu mengimport UserController kelas di bahagian atas, seperti berikut Ditunjukkan:
<?php use AppHttpControllersUserController;
Dengan cara ini, kami telah berjaya melaksanakan API paling asas dan boleh dijalankan di bawah rangka kerja Lumen.
Sebelum ini, kami telah mencipta API pertama kami dalam rangka kerja Lumen, tetapi ia bukan aplikasi perkhidmatan mikro sebenar. Untuk menjadikan Lumen sebagai aplikasi seni bina perkhidmatan mikro, kami perlu menggunakan idea reka bentuk model domain DDD untuk membina semula aplikasi kami. Kemudian, kami akan menggunakan idea perkhidmatan mikro untuk menguraikan setiap perkhidmatan kami kepada perkhidmatan mikro.
Pertama, kami perlu menentukan model domain kami, yang merupakan teras aplikasi kami. Dalam contoh ini, kami akan mencipta perkhidmatan mikro pengurusan pengguna mudah yang fungsi utamanya adalah untuk mengurus data pengguna.
Perkhidmatan mikro pengurusan pengguna kami mesti mempunyai fungsi berikut:
Sekarang kita perlu memetakan fungsi mikro ini.
Kami akan mereka bentuk antara muka perkhidmatan mikro yang berbeza mengikut fungsi berbeza dalam model domain. Di sini kami akan mentakrifkan antara muka perkhidmatan mikro berikut:
Perkhidmatan Mikro Pengesahan dan Kebenaran Pengguna
Seni Bina Perkhidmatan Mikro
API Gateway (Lumen) <--> User Authentication and Authorization Microservice <--> User Information Management Microservice <--> User Registration Microservice
现在,我们已经设计了微服务模块、微服务接口和整体微服务架构,我们可以开始实现我们的微服务。我们将针对上述三个微服务模块分别进行介绍。
我们的用户认证与授权微服务负责处理所有与用户认证相关的任务。它将接收用户凭据并验证它们的凭证是否正确。如果验证成功,它将生成一个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框架,开发者可以快速构建微服务,提高代码质量,加快项目进程。
Atas ialah kandungan terperinci PHP dan Lumen berintegrasi untuk merealisasikan pembangunan seni bina perkhidmatan mikro. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!