FastAPI adalah framework Python untuk membangun API dengan cepat: kamu menulis fungsi dengan type hint, dan FastAPI otomatis memvalidasi request, mengubah data ke JSON, serta membuat dokumentasi interaktif. Framework ini cocok untuk microservice yang mengerjakan tugas khusus, misalnya memproses dokumen, menjalankan model machine learning, atau scraping, lalu dipanggil oleh aplikasi utama seperti Laravel.
Kapan Microservice FastAPI Masuk Akal
- Butuh pustaka yang hanya kuat di Python: pandas, scikit-learn, PyTorch, OCR, atau pengolahan PDF.
- Tugas berat yang ingin dipisahkan agar tidak membebani aplikasi utama.
- Tim data yang bekerja di Python, sementara aplikasi web di PHP atau JavaScript.
Kalau semua fitur bisa dikerjakan di aplikasi utama, satu aplikasi monolit biasanya lebih mudah dirawat daripada banyak layanan.
Instalasi
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install "fastapi[standard]"
Endpoint Pertama dengan Validasi Pydantic
# main.py
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI(title="Layanan Ongkir")
class QuoteRequest(BaseModel):
origin_city: str = Field(min_length=3)
destination_city: str = Field(min_length=3)
weight_grams: int = Field(gt=0, le=50_000)
class QuoteResponse(BaseModel):
courier: str
cost: int
eta_days: int
@app.post("/quotes", response_model=list[QuoteResponse])
def create_quote(payload: QuoteRequest) -> list[QuoteResponse]:
base = max(1, payload.weight_grams // 1000) * 9000
return [
QuoteResponse(courier="reguler", cost=base, eta_days=3),
QuoteResponse(courier="kilat", cost=int(base * 1.6), eta_days=1),
]
fastapi dev main.py
Buka http://127.0.0.1:8000/docs untuk dokumentasi interaktif Swagger UI. Request dengan weight_grams negatif otomatis ditolak dengan status 422 dan pesan error yang jelas.
Dependency Injection: Autentikasi API Key
import os
from fastapi import Depends, HTTPException, Security
from fastapi.security import APIKeyHeader
api_key_header = APIKeyHeader(name="X-API-Key")
def verify_key(key: str = Security(api_key_header)) -> None:
if key != os.environ["SERVICE_API_KEY"]:
raise HTTPException(status_code=401, detail="API key tidak valid")
@app.post("/quotes", dependencies=[Depends(verify_key)])
def create_quote(payload: QuoteRequest): ...
Layanan internal tetap harus diamankan. Buat key yang panjang dan acak dengan Generator Password, dan simpan di environment variable.
Async untuk Pekerjaan I/O
import httpx
@app.get("/rates/{currency}")
async def get_rate(currency: str) -> dict:
async with httpx.AsyncClient(timeout=5) as client:
response = await client.get(f"https://api.contoh.id/rates/{currency}")
response.raise_for_status()
return response.json()
Gunakan async def untuk pekerjaan yang banyak menunggu jaringan atau database. Untuk komputasi berat (misalnya inferensi model), fungsi biasa def dijalankan FastAPI di thread pool, dan untuk beban besar pindahkan ke worker terpisah.
Test
# test_main.py
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_berat_negatif_ditolak():
response = client.post("/quotes", json={"origin_city": "Bandung", "destination_city": "Bekasi", "weight_grams": -5},
headers={"X-API-Key": "rahasia-test"})
assert response.status_code == 422
pip install pytest
SERVICE_API_KEY=rahasia-test pytest
Docker
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["fastapi", "run", "main.py", "--port", "8000"]
Tambahkan sebagai service di compose.yaml yang sama dengan aplikasi Laravel, seperti dijelaskan di Docker untuk Laravel.
Memanggil dari Laravel
$response = Http::withHeaders(['X-API-Key' => config('services.ongkir.key')])
->timeout(5)
->retry(2, 200)
->post(config('services.ongkir.url').'/quotes', [
'origin_city' => 'Bandung',
'destination_city' => 'Bekasi',
'weight_grams' => 1200,
])
->throw()
->json();
Selalu pasang timeout dan retry, dan siapkan perilaku cadangan kalau layanan sedang mati, misalnya menampilkan pesan "ongkir belum bisa dihitung".
Siap Production
- Jalankan dengan beberapa worker, misalnya
fastapi run --workers 4, di belakang Nginx dengan HTTPS. - Tambahkan endpoint
/healthsederhana untuk pemeriksaan oleh load balancer atau Docker. - Catat log dalam format terstruktur agar mudah dicari saat terjadi error.
- Matikan atau lindungi halaman
/docsbila layanan tidak untuk publik.
Kesalahan yang Sering Terjadi
- Memecah aplikasi menjadi microservice terlalu dini, sehingga waktu habis untuk mengurus komunikasi antar layanan.
- Layanan internal tanpa autentikasi, padahal port-nya bisa diakses dari luar.
- Memanggil kode blocking di dalam
async def, misalnya pustaka HTTP sinkron, yang membuat seluruh server tersendat. - Tidak mengunci versi dependensi di
requirements.txt.
Langkah Berikutnya
Untuk menimbang bentuk API yang tepat, baca GraphQL vs REST API. Kalau microservice ini akan menjalankan model machine learning, mulai dari roadmap belajar machine learning.