Rumah  >  Artikel  >  pembangunan bahagian belakang  >  PHP dan Lumen berintegrasi untuk merealisasikan pembangunan seni bina perkhidmatan mikro

PHP dan Lumen berintegrasi untuk merealisasikan pembangunan seni bina perkhidmatan mikro

PHPz
PHPzasal
2023-06-25 12:07:231269semak imbas

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.

Langkah 1: Pasang 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: 9e9ead522d5c283aed9850c47cee60c2" muncul , menunjukkan bahawa rangka kerja Lumen telah berjaya menggunakan persekitaran operasi tempatan, dan kami boleh mengakses halaman lalainya melalui http://localhost:8000.

Langkah 2: Tulis Microservices

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:

  1. Buat laluan API

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.

  1. Mengendalikan Permintaan API

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.

  1. Daftar laluan API ke pengawal

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.

Langkah 3: Integrasikan rangka kerja mikroperkhidmatan

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.

  1. Reka Bentuk Domain

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:

  • Pendaftaran pengguna
  • Pengesahan pengguna
  • Keizinan pengguna
  • Pengurusan maklumat pengguna

Sekarang kita perlu memetakan fungsi mikro ini.

  1. Antara muka perkhidmatan mikro

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:

  • Antara muka pendaftaran pengguna (registerUser)
  • Antara muka pengesahan pengguna (authenticateUser)
  • Antara muka kebenaran pengguna (authorizeUser)
  • Antara muka pengurusan maklumat pengguna (pengurusan maklumat pengguna)
  1. Kini, kami perlu membahagikan antara muka perkhidmatan mikro kami kepada modul perkhidmatan mikro yang berbeza. Dalam contoh ini, kami akan menggunakan tiga modul perkhidmatan mikro berikut:

Perkhidmatan Mikro Pengesahan dan Kebenaran Pengguna

    Perkhidmatan Mikro Pengurusan Maklumat Pengguna
  • Perkhidmatan Mikro Pendaftaran Pengguna
  • Modul perkhidmatan mikro ini akan bersambung terus dengan pangkalan data kami untuk berinteraksi.

Seni Bina Perkhidmatan Mikro

  1. Kami kini mempunyai komponen model domain kami, antara muka perkhidmatan mikro dan modul perkhidmatan mikro, dan kini kami boleh menggabungkannya ke dalam seni bina perkhidmatan mikro. Keseluruhan seni bina kelihatan seperti ini:
  2. API Gateway (Lumen) <--> User Authentication and Authorization Microservice <--> User Information Management Microservice <--> User Registration Microservice
Kami mendayakan Gerbang API Lumen, yang merupakan titik awal sistem kami dan akan menerima semua permintaan dan mengarahkannya ke modul perkhidmatan mikro yang sesuai. Model domain kami ialah logik perniagaan kami dan antara muka perkhidmatan mikro akan mengawal interaksi data kami.

第四步:实现微服务

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

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框架,开发者可以快速构建微服务,提高代码质量,加快项目进程。

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn