🗂

【Dapr/python】- サイドカーパターンを実装してみる

2024/11/14に公開

執筆日

2024/11/14

やること

Daprにおけるサイドカーパターンについて検証を行います。

サイドカーパターンとは?

サイドカーパターンは、マイクロサービスアーキテクチャにおいて、主要なアプリケーションコンテナと共に補助的なコンテナ(サイドカー)をデプロイするパターンです。Daprはこのパターンを採用しており、サービス間の通信、状態管理、パブリッシュ/サブスクライブ、シークレット管理などを簡素化します。

詳細は、Microsoftの方がわかりやすくまとめてくださっていますので、こちらをご確認ください。

https://qiita.com/takashiuesaka/items/bdae30de41b0daab881f

検証する際のアーキテクチャ図

検証手順

1. 以下のファイルを作成

app.py

from flask import Flask, request, jsonify
import requests
import os
import logging

app = Flask(__name__)

# 環境変数またはデフォルトの設定を使用
PORT = os.getenv("PORT", "5000")
DAPR_HTTP_PORT = os.getenv("DAPR_HTTP_PORT", "3500")
TARGET_SERVICE_NAME = os.getenv("TARGET_SERVICE_NAME", "target-service")

# ロギングの設定
logging.basicConfig(level=logging.INFO)

@app.route("/invoke", methods=["POST"])
def invoke_service():
    try:
        # メッセージを受け取る
        data = request.json
        logging.info(f"Received request data: {data}")

        if not data or "message" not in data:
            return jsonify({"error": "Invalid input"}), 400

        message = data.get("message", "Hello from Python!")

        # Daprのサイドカーを通してターゲットサービスを呼び出す
        url = f"http://localhost:{DAPR_HTTP_PORT}/v1.0/invoke/{TARGET_SERVICE_NAME}/method/receive"
        response = requests.post(url, json={"message": message}, timeout=5)

        if response.status_code != 200:
            logging.error(f"Error invoking service: {response.status_code} - {response.text}")
            return jsonify({"error": "Failed to invoke service"}), response.status_code

        return response.text, response.status_code
    except requests.exceptions.RequestException as e:
        logging.error(f"Request exception: {e}")
        return jsonify({"error": "Service invocation failed"}), 500
    except Exception as e:
        logging.error(f"Unexpected error: {e}")
        return jsonify({"error": "Internal server error"}), 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=int(PORT))

target_service.py

from flask import Flask, request, jsonify
import os
import logging

app = Flask(__name__)

# 環境変数またはデフォルトの設定を使用
PORT = os.getenv("TARGET_SERVICE_PORT", "6000")

# ロギングの設定
logging.basicConfig(level=logging.INFO)

@app.route("/receive", methods=["POST"])
def receive_message():
    try:
        data = request.json
        logging.info(f"Received message: {data}")

        if not data or "message" not in data:
            return jsonify({"error": "Invalid input"}), 400

        message = data.get("message")
        logging.info(f"Processed message: {message}")
        return "Message received", 200
    except Exception as e:
        logging.error(f"Unexpected error: {e}")
        return jsonify({"error": "Internal server error"}), 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=int(PORT))

2. 以下を実行し、アプリケーションを立ち上げる

ターゲットサービスを立ち上げる

dapr run --app-id target-service --app-port 6000 --dapr-http-port 3501 -- python target_service.py

メインアプリケーションを立ち上げる

dapr run --app-id myapp --app-port 5000 --dapr-http-port 3500 -- python app.py

3. 以下を実行し、メインアプリケーションにメッセージを送る

curl -X POST http://localhost:5000/invoke -H "Content-Type: application/json" -d "{\"message\": \"Hello from client\"}"

4. ログを確認する

メインアプリケーションのログ

ターゲットサービスのログ

まとめ

今回、Daprを使用してサイドカーパターンの検証を行いました。メインアプリケーションとターゲットサービスがDaprサイドカーを通じて正常に通信できることを確認しました。
次は、AKS上にデプロイしたり異なるPodにDeployしてみようかなと。

ヘッドウォータース

Discussion