>  기사  >  백엔드 개발  >  PHP와 Lumen이 통합되어 마이크로서비스 아키텍처 개발 실현

PHP와 Lumen이 통합되어 마이크로서비스 아키텍처 개발 실현

PHPz
PHPz원래의
2023-06-25 12:07:231272검색

IT 기술의 급속한 발전으로 현대 기업은 점점 더 복잡한 비즈니스 시스템에 직면해 있습니다. 기존의 단일 애플리케이션 아키텍처는 더 이상 요구 사항을 충족할 수 없으며 시대의 요구에 따라 마이크로서비스 아키텍처가 등장했습니다. 마이크로서비스 아키텍처는 더 나은 확장성, 재사용성 및 유연성을 달성하기 위해 독립적으로 배포, 실행, 확장 및 유지 관리할 수 있는 여러 개의 소규모 서비스로 애플리케이션을 구성하는 아키텍처 스타일입니다.

그렇다면 PHP를 사용하여 마이크로서비스 아키텍처를 구현하는 방법은 무엇일까요? 대답은 경량 PHP 프레임워크인 Lumen을 사용하는 것입니다. Laravel을 기반으로 하는 Lumen은 마이크로서비스 및 API 구축을 위해 설계된 PHP 프레임워크입니다. 이 글에서는 Lumen 프레임워크에 마이크로서비스 아키텍처를 통합하는 방법을 소개합니다.

1단계: Lumen 설치

먼저 Lumen 프레임워크를 로컬에 설치해야 합니다. 설치 단계는 Laravel과 동일합니다. 아래와 같이 작곡가를 통해 설치할 수 있습니다.

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

완료 후 Lumen 프레임워크 실행 환경을 로컬에서 시작할 수 있습니다.

php -S localhost:8000 -t public

"Lumen 개발 서버 시작: 9e9ead522d5c283aed9850c47cee60c2"이 나타나면, 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를 요청하면 "List"가 됩니다. 모든 사용자의 반환" 문자열입니다.

  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 경로 등록

이제 경로 파일의 UserController 컨트롤러에 API 경로를 등록하고, /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. 마이크로서비스 모듈

이제 마이크로서비스 인터페이스를 다양한 마이크로서비스 모듈로 나누어야 합니다. 이 예에서는 다음 세 가지 마이크로서비스 모듈을 사용합니다.

  • 사용자 인증 및 권한 부여 마이크로서비스
  • 사용자 정보 관리 마이크로서비스
  • 사용자 등록 마이크로서비스

이러한 마이크로서비스 모듈은 데이터베이스와 직접 인터페이스하여 상호 작용합니다.

  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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.