マイクロサービスアーキテクチャとAPIゲートウェイ

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

### 目次

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

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

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

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

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

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

### ユーザーサービスの作成

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

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

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

`routes/api.php`

```php
use App\Http\Controllers\UserController;

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

`app/Http/Controllers/UserController.php`

```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のインストール：

```bash
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を再起動：

```bash
sudo nginx -t
sudo systemctl restart nginx
```

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

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

`composer require guzzlehttp/guzzle`

`app/Http/Controllers/OrderController.php`

```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ゲートウェイの設定方法について記述しました。マイクロサービスを導入することで、アプリケーションのスケーラビリティと保守性が向上します。