0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マイクロサービスアーキテクチャは、アプリケーションを小さなサービスに分割して開発・デプロイを容易にする手法です。今回は、Laravelを使ったマイクロサービスアーキテクチャの基本とAPIゲートウェイの設定方法について記述します。

目次

  1. マイクロサービスアーキテクチャの基本
  2. Laravelでのマイクロサービスの構築
  3. APIゲートウェイの設定
  4. サービス間通信の実装

1. マイクロサービスアーキテクチャの基本

マイクロサービスアーキテクチャでは、アプリケーションを以下のような小さなサービスに分割します。

  • ユーザーサービス
  • 注文サービス
  • 在庫サービス

各サービスは独立して動作し、それぞれの責任範囲を持ちます。

2. Laravelでのマイクロサービスの構築

ユーザーサービスの作成

まず、ユーザーサービス用のLaravelプロジェクトを作成します。

composer create-project --prefer-dist laravel/laravel user-service

次に、ユーザーの登録と認証機能を実装します。

routes/api.php

use App\Http\Controllers\UserController;

Route::post('/register', [UserController::class, 'register']);
Route::post('/login', [UserController::class, 'login']);

app/Http/Controllers/UserController.php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;

class UserController extends Controller
{
    public function register(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ]);

        $user = User::create([
            'name' => $validated['name'],
            'email' => $validated['email'],
            'password' => Hash::make($validated['password']),
        ]);

        return response()->json(['message' => 'User registered successfully']);
    }

    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            $user = Auth::user();
            $token = $user->createToken('user-service')->plainTextToken;

            return response()->json(['token' => $token]);
        }

        return response()->json(['message' => 'Invalid credentials'], 401);
    }
}

3. APIゲートウェイの設定

APIゲートウェイは、複数のマイクロサービスを統合し、単一のエンドポイントとして提供します。Nginxを使用してAPIゲートウェイを設定します。

Nginxのインストールと設定

Nginxのインストール:

sudo apt-get update
sudo apt-get install nginx

設定ファイルの編集:

/etc/nginx/sites-available/default

server {
    listen 80;

    server_name your-domain.com;

    location /users/ {
        proxy_pass http://127.0.0.1:8001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /orders/ {
        proxy_pass http://127.0.0.1:8002/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

設定をテストしてNginxを再起動:

sudo nginx -t
sudo systemctl restart nginx

4. サービス間通信の実装

サービス間で通信するためにHTTPクライアントを使用します。Guzzleを使用して、ユーザーサービスから注文サービスにリクエストを送信する例を示します。

composer require guzzlehttp/guzzle

app/Http/Controllers/OrderController.php

namespace App\Http\Controllers;

use GuzzleHttp\Client;
use Illuminate\Http\Request;

class OrderController extends Controller
{
    public function createOrder(Request $request)
    {
        $client = new Client();
        $response = $client->post('http://127.0.0.1:8002/orders', [
            'json' => [
                'user_id' => $request->user_id,
                'product_id' => $request->product_id,
                'quantity' => $request->quantity,
            ]
        ]);

        return response()->json(json_decode($response->getBody()), $response->getStatusCode());
    }
}

まとめ

この記事では、Laravelを使ったマイクロサービスアーキテクチャの基本とAPIゲートウェイの設定方法について記述しました。マイクロサービスを導入することで、アプリケーションのスケーラビリティと保守性が向上します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?