Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
26 Sep 2025 · 5 mnt baca ·Artikel 110 / 110
Go

110. Studi Kasus: Desain API yang Konsisten untuk Microservices Multi-Bahasa dengan Protobuf

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

title: 110. Studi Kasus: Desain API yang Konsisten untuk Microservices Multi-Bahasa dengan Protobuf
author: Rifqi Ramadhan
date: 2024-06-10

Studi Kasus: Desain API yang Konsisten untuk Microservices Multi-Bahasa dengan Protobuf

Salah satu tantangan terbesar dalam pengembangan arsitektur microservices adalah memastikan konsistensi kontrak API antara banyak layanan yang ditulis dalam bahasa pemrograman berbeda (multi-bahasa). Dengan semakin beragamnya kebutuhan bisnis, tidak jarang sebuah sistem terdiri dari layanan berbasis Go, Java, Python, bahkan Node.js yang harus saling berkomunikasi dengan efisien, aman, dan tentunya konsisten.

Di artikel ini, saya akan membahas praktik terbaik mendesain API konsisten untuk microservices multi-bahasa menggunakan Protocol Buffers (Protobuf), dimulai dari studi kasus nyata, sample kode, hingga simulasi komunikasi, serta diagram alur implementasi-nya.


Studi Kasus: Layanan E-Commerce

Bayangkan sebuah platform e-commerce yang terdiri dari beberapa layanan utama:

  • Order Service (Go)
  • Inventory Service (Java)
  • User Service (Python)
  • Notification Service (Node.js)

Bagaimana kita bisa memastikan setiap service dapat berkomunikasi tanpa harus khawatir tentang perbedaan struktur data, konversi tipe, dan dokumentasi yang sulit dijaga?

Danger
Jawaban: DENGAN DESAIN API BERBASIS PROTOBUF.

Mengapa Protobuf?

Sebelum masuk ke teknis, mari kita bandingkan beberapa cara untuk mendesain API:

MetodeKelebihanKekurangan
REST+JSONMudah dibaca manusia, tooling luasTidak strict, rentan mismatch tipe, parsing lambat
GraphQLFleksibel query, self-docsOver-fetching, learning curve, eksekusi lambat
gRPC + ProtobufCepat, schema strict, tooling lintas bahasaKurang familiar, instalasi awal lebih rumit

Protobuf memaksa kita mendefinisikan kontrak secara eksplisit yang kemudian bisa digunakan untuk generate code client/server berbagai bahasa. For this use-case, it’s a winner!


Mendesain Kontrak Layanan Berbasis Protobuf

Contoh Kontrak: Service Order

File: order.proto

proto
 1syntax = "proto3";
 2
 3package ecommerce.order.v1;
 4
 5message OrderRequest {
 6  string user_id = 1;
 7  repeated Item items = 2;
 8}
 9
10message Item {
11  string sku = 1;
12  int32 quantity = 2;
13}
14
15message OrderResponse {
16  string order_id = 1;
17  string status = 2; // PENDING, CONFIRMED, FAILED
18}
19
20service OrderService {
21  rpc PlaceOrder (OrderRequest) returns (OrderResponse);
22}

Penjelasan

  • Pendefinisian struktur data OrderRequest, Item, dan OrderResponse dijaga tetap sederhana, eksplisit, dan dapat digunakan lintas bahasa.
  • Service OrderService mendeskripsikan fungsi yang tersedia: misal RPC untuk memproses pemesanan.

Generate Kode untuk Bermacam Bahasa

Setelah mendefinisikan .proto, developer dapat generate kode client/server:

bash
1# Untuk Go
2protoc --go_out=. --go-grpc_out=. order.proto
3
4# Untuk Java
5protoc --java_out=. --grpc-java_out=. order.proto
6
7# Untuk Python
8python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. order.proto

Setiap language mempunyai library hasil generate yang 100% konsisten dengan definisi .proto.


Simulasi Interaksi Antar Microservices

Mari simulasikan Order Service (Go) yang mengakses Inventory Service (Java) memakai Protobuf.

Order Service (Go) — Memanggil Cek Stok

proto
 1// inventory/v1/inventory.proto
 2syntax = "proto3";
 3
 4package ecommerce.inventory.v1;
 5
 6message StockRequest {
 7  string sku = 1;
 8}
 9
10message StockResponse {
11  int32 available_quantity = 1;
12}
13
14service InventoryService {
15  rpc CheckStock(StockRequest) returns (StockResponse);
16}

Pemanggilan dari Order Service (Go)

go
1conn, _ := grpc.Dial("inventory-service:50051", grpc.WithInsecure())
2client := inventorypb.NewInventoryServiceClient(conn)
3
4resp, err := client.CheckStock(context.Background(), &inventorypb.StockRequest{
5  Sku: "SKU1234",
6})
7fmt.Printf("Stok: %d\n", resp.AvailableQuantity)
Danger
Poin Penting: Type safety dan struktur data konsisten walau berbeda implementasi.

Diagram Alur Proses Order

MERMAID
sequenceDiagram
    actor User
    participant OrderService (Go)
    participant InventoryService (Java)
    participant UserService (Python)
    participant NotificationService (NodeJS)

    User->>OrderService (Go): PlaceOrder(OrderRequest)
    OrderService (Go)->>InventoryService (Java): CheckStock(StockRequest)
    InventoryService (Java)-->>OrderService (Go): StockResponse
    OrderService (Go)->>UserService (Python): GetUserDetail(UserID)
    UserService (Python)-->>OrderService (Go): UserDetail
    OrderService (Go)->>NotificationService (NodeJS): SendNotif(Order)
    NotificationService (NodeJS)-->>OrderService (Go): NotifResponse
    OrderService (Go)-->>User: OrderResponse

Best Practices Desain Protobuf untuk Microservices Multi-bahasa

Berikut beberapa rekomendasi untuk menjaga konsistensi dan maintainability:

  1. Gunakan Nama Versi pada Paket

    • Contoh: package ecommerce.order.v1;
    • Memudahkan breaking change tanpa mengganggu klien lama.
  2. Komentar Isian penting

    • Lengkapi setiap field dengan komentar jelas, gunakan plugin doc/extractor bila perlu.
  3. Field Tag Tidak Pernah diubah

    • Tag (nomor di setiap field: sku = 1) tidak boleh berubah, rename field harus baru (misal tambahkan sku_code = 3 dan deprecated-kan sku = 1).
  4. Protobuf Lint

    • Gunakan linter/protobuf-lint di CI agar setiap definisi schema mengikuti gaya yang konsisten.
  5. Shared Protobuf Repo

    • Semua tim/service pointing ke repo yang sama sehingga schema selalu terbaru.

Studi Kasus: Penambahan Field Tanpa Breaking Change

Sebelum:

proto
1message OrderResponse {
2  string order_id = 1;
3  string status = 2;
4}

Setelah (Penambahan Field):

proto
1message OrderResponse {
2  string order_id = 1;
3  string status = 2;
4  string payment_reference = 3;
5}

Semua klien lama tetap dapat memproses message! Klien baru akan memperoleh payment_reference jika disediakan.


Kelebihan untuk Bisnis dan Engineering

  • Adaptasi Bahasa Bebas: Tim dapat memilih bahasa/tools terbaik tanpa takut integrasi macet.
  • Type Safety: Developer yakin data yang masuk/keluar benar sesuai schema.
  • API-first Documentation: .proto file sekaligus dokumentasi formal API.
  • Otomatisasi & Generasi Kode: Proses update schema langsung memicu re-generasi interface client/server.

Kesimpulan

Pemilihan Protobuf untuk komunikasi microservices multi-bahasa secara signifikan mengurangi friction, meningkatkan kecepatan pengembangan, dan menjaga konsistensi kontrak antar tim developer. Studi kasus di atas membuktikan bahwa desain API yang kuat dan konsisten mampu menopang skala bisnis digital yang terus berkembang tanpa harus mengorbankan disiplin engineering.

Sudah siap mengadopsi Protobuf untuk ekosistem microservices-mu? Jangan lupa, mulailah dengan desain schema yang rapi, lintas bahasa, dan otomatis. Happy coding!


Referensi:


Artikel Terkait

💬 Komentar