Aplikasi modern bukan satu blok besar, melainkan kumpulan service kecil yang saling berkomunikasi. Kalian belajar prinsip microservices, service discovery dan observability lintas service, lalu mengenal service mesh (Istio/Linkerd) sebagai lapisan yang mengelola lalu lintas, keamanan, dan tracing antar-service di Kubernetes cloud.

Sampai episode 11, kita membangun satu aplikasi utuh. Di episode 12 ini kita memecahnya — dan inilah titik di mana cloud engineer modern menghabiskan banyak waktunya: microservices. Aplikasi tidak lagi satu monolit besar, melainkan kumpulan service kecil (auth, orders, payments, notifications) yang dikembangkan, di-deploy, dan di-scale secara independen.
Episode 12 membahas prinsip microservices, tantangannya di cloud, service discovery dan observability lintas service, lalu pengenalan service mesh (Istio/Linkerd) — lapisan infrastruktur yang menangani lalu lintas antar-service, mTLS, dan tracing tanpa mengubah kode aplikasi.
Monolit sederhana di awal, tapi saat tim besar dan fitur banyak, setiap rilis berisiko tinggi (semua harus naik bareng) dan scaling boros (semua dinaikkan padahal hanya satu modul yang sibuk). Microservices memecahkan itu — setiap service bisa dirilis, di-scale, dan punya teknologi sendiri — tetapi dengan biaya: kompleksitas jaringan, distribusi, dan debugging yang lebih tinggi.
| Aspek | Monolit | Microservices |
|---|---|---|
| Deployment | Satu unit | Per-service, independen |
| Scaling | Seluruh aplikasi | Per-service |
| Kecepatan rilis | Lambat (bottleneck) | Cepat (paralel) |
| Kompleksitas | Rendah | Tinggi (network, konsistensi) |
| Cocok untuk | Tim kecil, aplikasi kecil | Tim besar, skala besar |
Aturan yang perlu kalian internalisasi sejak sekarang: jangan pecah microservices sebelum kebutuhan memaksa. Banyak tim memecah aplikasi 5.000 baris menjadi 20 service dan membayar kompleksitas yang tidak perlu. Pola yang benar: mulai monolit modular, pecah satu per satu saat beban atau tim membutuhkan.
Setiap microservice punya boundary yang jelas (bounded context) — misal service orders hanya mengelola data pesanan, tidak boleh menyentuh tabel user langsung. Komunikasi antar-service:
Di Kubernetes, setiap service adalah workload + service-nya sendiri:
apiVersion: apps/v1
kind: Deployment
metadata:
name: orders
namespace: shop
spec:
replicas: 3
selector:
matchLabels:
app: orders
template:
metadata:
labels:
app: orders
spec:
containers:
- name: orders
image: registry.example.com/orders:1.4.0
ports:
- containerPort: 8080
env:
- name: DB_HOST
value: orders-db.internal
readinessProbe:
httpGet:
path: /healthz
port: 8080
---
apiVersion: v1
kind: Service
metadata:
name: orders
namespace: shop
spec:
selector:
app: orders
ports:
- port: 8080
targetPort: 8080Perhatikan dua hal penting:
namespace: shop) — memisahkan environment/dept dalam satu cluster.Bagaimana service checkout menemukan orders? DNS internal Kubernetes menyelesaikan nama service: orders.shop.svc.cluster.local. Kalian tidak menulis IP statis — cukup nama. Ini service discovery: lokasi service didaftarkan dan dicari secara otomatis.
curl http://orders.shop.svc.cluster.local:8080/healthDi luar Kubernetes, provider punya solusi masing-masing: AWS Cloud Map, GCP Service Directory, Azure service registry. Konsepnya sama — daftar terpusat yang bisa dicari oleh service lain.
Important
Microservices tanpa observability adalah bencana: satu request bisa melewati 5 service, dan jika lambat, kalian tidak tahu siapa pelakunya. Distributed tracing (trace ID yang mengalir lintas service) bukan opsional — ini persyaratan. Kita mulai dari prinsipnya di episode ini dan dalami dengan service mesh di bawah.
Satu request melintasi banyak service; log di tiap service tidak lagi cukup. Dibutuhkan:
Prinsipnya sederhana: setiap service meneruskan header trace (misal x-trace-id) ke service berikutnya dan mencatatnya di log. Dengan begitu, satu ID bisa menelusuri seluruh perjalanan request.
Ketika jumlah service dan trafik antar-service membengkak, menangani retry, timeout, mTLS, dan metrics di setiap service menjadi tidak efisien. Service mesh memindahkan semua itu ke lapisan infrastruktur: sebuah sidecar proxy (Envoy) disuntikkan ke setiap pod, dan control plane mengatur perilaku semua sidecar secara terpusat.
┌───────────── pod ─────────────┐
│ [app container] │
│ [sidecar Envoy] ──↔── mesh │ ← semua traffic keluar-masuk lewat sidecar
└───────────────────────────────┘| Kemampuan | Tanpa Mesh | Dengan Mesh |
|---|---|---|
| mTLS antar-service | Manual per aplikasi | Otomatis, diatur mesh |
| Retry/timeout/circuit breaker | Kode aplikasi | Konfigurasi policy |
| Traffic split (canary) | Manual | Gridung oleh mesh |
| Metrics/tracing | Manual | Otomatis dari sidecar |
Contoh: memaksa semua traffic antar-service menggunakan mTLS (encrypted + mutual auth) dan melakukan canary 10% traffic ke versi baru — tanpa mengubah kode sama sekali:
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: shop
spec:
mtls:
mode: STRICT
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: orders
namespace: shop
spec:
hosts:
- orders
http:
- route:
- destination:
host: orders
subset: v1
weight: 90
- destination:
host: orders
subset: v2
weight: 10Managed options di cloud: AWS App Mesh, GCP Traffic Director / Anthos Service Mesh, Azure Service Mesh (Istio/Open Service Mesh). Untuk sekarang, cukup pahami masalah apa yang dipecahkan mesh; implementasi detailnya ada di episode 19 (zero trust & mTLS).
Tip
Jangan langsung pasang service mesh begitu aplikasi berubah microservices. Mulai dari yang sederhana: readiness probe, service discovery, tracing correlation ID. Tambah mesh saat jumlah service dan kebutuhan mTLS/canary sudah benar-benar menuntut — mesh menambah kompleksitas operasional yang nyata.
Kerjakan bertahap di cluster kalian:
orders (kode di atas) dan checkout yang memanggil orders via DNS service.checkout, curl http://orders.shop.svc.cluster.local:8080/healthz.Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan membahas message queues & streaming — SQS/SNS, Pub/Sub, Kinesis/Event Streaming — dan membangun event-driven pipeline yang menghubungkan microservices secara asynchronous. Sampai jumpa di episode 13!