🗂
【Dapr/python】- サイドカーパターンを実装してみる
執筆日
2024/11/14
やること
Daprにおけるサイドカーパターンについて検証を行います。
サイドカーパターンとは?
サイドカーパターンは、マイクロサービスアーキテクチャにおいて、主要なアプリケーションコンテナと共に補助的なコンテナ(サイドカー)をデプロイするパターンです。Daprはこのパターンを採用しており、サービス間の通信、状態管理、パブリッシュ/サブスクライブ、シークレット管理などを簡素化します。
詳細は、Microsoftの方がわかりやすくまとめてくださっていますので、こちらをご確認ください。
検証する際のアーキテクチャ図
検証手順
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