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

75. Studi Kasus: API Gateway untuk gRPC Service

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

75. Studi Kasus: API Gateway untuk gRPC Service

Kebutuhan akan sistem yang scalable, maintainable, dan performa tinggi mendorong banyak perusahaan untuk mengadopsi pendekatan microservices. Salah satu teknologi komunikasi antar service yang populer adalah gRPC, terutama untuk interaksi internal yang mengutamakan efisiensi dan contract-first API. Namun, gRPC belum terlalu ramah bagi konsumsi publik atau oleh client tradisional, seperti web browser atau mobile app, yang terbiasa dengan protokol HTTP/JSON. Masalah lain yang sering dihadapi adalah mengontrol akses, otentikasi, transformasi data, monitoring, dan sebagainya di satu pintu (API Gateway). Pada studi kasus kali ini, kita akan membahas rancangan dan implementasi sederhana API Gateway untuk gRPC Service.


Problem Statement

Misalkan Anda membangun sistem core banking dengan beberapa microservices, salah satunya adalah AccountService berbasis gRPC. Client eksternal (seperti front-end web atau mobile) hanya bisa berkomunikasi via REST. Anda butuh sebuah API Gateway yang:

  • Mengkonversi permintaan REST menjadi request gRPC.
  • Menyediakan endpoint RESTful agar dapat dengan mudah diintegrasikan ke front-end/client publik.
  • Melakukan authentication/authorization di gateway.
  • Mudah di-scale dan di-monitor.

Diagram Alur Sistem

MERMAID
flowchart LR
    A[Client (Web/Mobile)] -- HTTP/JSON --> B(API Gateway)
    B -- gRPC --> C[gRPC AccountService]
    C -- Response gRPC --> B
    B -- HTTP/JSON --> A

Pendekatan: Skenario dan Tools

Untuk studi kasus ini, kita akan menggunakan:

  • gRPC: Sebagai backend service utama.
  • Envoy Proxy atau grpc-gateway: Sebagai API Gateway.
  • Go: Bahasa untuk implementasi karena dukungan tool yang solid untuk gRPC dan grpc-gateway.
  • JWT Auth: Untuk simulasi autentikasi.

Definisi Service: AccountService

Mari mulai dengan mendefinisikan contract (protobuf) untuk AccountService.

protobuf
 1// account.proto
 2syntax = "proto3";
 3
 4package account;
 5
 6service AccountService {
 7  rpc GetAccount(GetAccountRequest) returns (GetAccountResponse) {}
 8}
 9
10message GetAccountRequest {
11  string account_id = 1;
12}
13
14message GetAccountResponse {
15  string account_id = 1;
16  string name = 2;
17  double balance = 3;
18}

Setelah menulis file account.proto, generate stub server (dan client) menggunakan plugin protoc.


1. Implementasi gRPC Service

Buat implementasi server sederhana menggunakan Go.

go
 1// account_server.go
 2package main
 3
 4import (
 5	"context"
 6	pb "path/to/accountpb"
 7)
 8
 9type server struct {
10	pb.UnimplementedAccountServiceServer
11}
12
13func (s *server) GetAccount(ctx context.Context, req *pb.GetAccountRequest) (*pb.GetAccountResponse, error) {
14	// Simulasi database lookup
15	if req.GetAccountId() == "123" {
16		return &pb.GetAccountResponse{
17			AccountId: "123",
18			Name:      "Jane Doe",
19			Balance:   2500000.0,
20		}, nil
21	}
22	return nil, status.Error(codes.NotFound, "account not found")
23}

2. Kenapa Tidak REST Langsung?

Pertanyaan umum: Kenapa tidak expose gRPC service ini langsung sebagai REST?
Jawabannya adalah: gRPC lebih efisien (binary, multiplexing), lebih mudah contract-first, dan mendukung streaming. Namun, tidak semua client bisa native gRPC. Maka, API Gateway adalah solusi jembatan yang clean.


3. API Gateway dengan grpc-gateway

gRPC-Gateway adalah proyek open-source yang meng-generate proxy “reverse-proxy” HTTP RESTful ke gRPC endpoints.

Tambahan pada Proto File

Tambahkan annotation HTTP di proto:

protobuf
1import "google/api/annotations.proto";
2
3service AccountService {
4  rpc GetAccount(GetAccountRequest) returns (GetAccountResponse) {
5    option (google.api.http) = {
6      get: "/v1/accounts/{account_id}"
7    };
8  }
9}

Menjalankan Gateway

  • Jalankan gRPC server di port misal :9090.
  • Jalankan grpc-gateway server di port misal :8080 yang akan meneruskan request ke gRPC server.

main.go:

go
 1package main
 2
 3import (
 4	"context"
 5	"log"
 6	"net/http"
 7
 8	gw "path/to/accountpb"
 9	"google.golang.org/grpc"
10	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
11)
12
13func main() {
14	grpcEndpoint := "localhost:9090"
15	ctx := context.Background()
16	ctx, cancel := context.WithCancel(ctx)
17	defer cancel()
18
19	mux := runtime.NewServeMux()
20	opts := []grpc.DialOption{grpc.WithInsecure()}
21	err := gw.RegisterAccountServiceHandlerFromEndpoint(ctx, mux, grpcEndpoint, opts)
22	if err != nil {
23		log.Fatalf("failed to start HTTP gateway: %v", err)
24	}
25
26	http.ListenAndServe(":8080", mux)
27}

4. Simulasi Request

Bayangkan client mengirimkan permintaan HTTP GET /v1/accounts/123:

http
1GET /v1/accounts/123
2Authorization: Bearer <jwt_token>

API Gateway akan:

  • Men-translate request HTTP ke gRPC GetAccount.
  • Menambah atau memvalidasi authentikasi (di interceptors).
  • Mengembalikan hasil format JSON ke client.

Response example:

json
1{
2  "account_id": "123",
3  "name": "Jane Doe",
4  "balance": 2500000.0
5}

5. Middleware: Auth & Logics di Gateway

Letakkan middleware secara sentral di API Gateway, supaya downstream service tetap simple.

go
 1// Middleware HTTP untuk validasi JWT
 2type AuthMiddleware struct {
 3	Next http.Handler
 4}
 5
 6func (am *AuthMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 7	auth := r.Header.Get("Authorization")
 8	if !ValidateJWT(auth) {
 9		http.Error(w, "Unauthorized", http.StatusUnauthorized)
10		return
11	}
12	am.Next.ServeHTTP(w, r)
13}
14
15// Penambahan pada main.go
16authHandler := &AuthMiddleware{Next: mux}
17http.ListenAndServe(":8080", authHandler)

6. Penggunaan Envoy sebagai API Gateway Alternatif

Selain grpc-gateway (yang cocok untuk prototyping atau Go stack), Anda bisa menggunakan Envoy untuk production grade. Envoy dapat mengkonfigurasi HTTP->gRPC transcoding, mendaftarkan rate limit, JWT validation, dll.

yaml
 1# Config potongan Envoy untuk HTTP-GRPC transcoding
 2static_resources:
 3  listeners:
 4    - address:
 5        socket_address: { address: 0.0.0.0, port_value: 8080 }
 6      filter_chains:
 7        - filters:
 8            - name: envoy.filters.network.http_connection_manager
 9              typed_config:
10                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
11                route_config:
12                  #...
13                http_filters:
14                  - name: envoy.filters.http.grpc_json_transcoder
15                    typed_config:
16                      "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
17                      proto_descriptor: "/etc/protos/account.pb"
18                      services: ["account.AccountService"]
19                      print_options:
20                        add_whitespace: true

Tabel Perbandingan

Berikut ringkasan perbandingan API Gateway yang umum untuk gRPC service:

GatewayBahasaKeunggulanKekuranganFitur Advanced
grpc-gatewayGoSimpel, native GoTidak mendukung TLS kompleks, Hanya GoLogging, Auth (custom)
Envoy ProxyC++Performant, production provenKonfigurasi lebih rumitRate limit, JWT
KongLua/GoPlugin ekosistem luasResource lebih beratRate limit, Auth

7. Scaling dan Monitoring

Untuk kapasitas produksi:

  • Gateway bisa dibungkus di container, lalu di-scale horizontal via Kubernetes.
  • gRPC service bisa tetap di scale tersendiri.
  • Monitoring request masuk/keluar di gateway, audit log, metrik latensi dsb.

Kesimpulan

API Gateway untuk gRPC service memungkinkan kita:

  • Menggunakan gRPC secara internal untuk kinerja dan maintainability.
  • Menyediakan API REST untuk client eksternal tanpa perlu memodifikasi setiap microservice.
  • Menerapkan authentication, logging, monitoring, dan business logic di satu pintu.
  • Infrastructure-agnostic; bisa diganti Envoy atau implementasi lain sesuai kebutuhan.

Dengan pendekatan ini, developer dapat fokus pada core business logic di masing-masing service sementara security, observability, dan device compatibility tetap terjaga.


Kesimpulan

Studi kasus ini secara sederhana mencerminkan salah satu best-practice pattern pada modern backend architecture. Memanfaatkan API Gateway sebagai jembatan antara dunia RESTful dan gRPC, Anda dapat menjaga sistem tetap modular dan future-proof. Experiment dan eksplorasi dengan berbagai gateway, temukan trade off paling cocok untuk kebutuhan Anda. Semoga studi kasus ini memberi inspirasi desain arsitektur dan eksekusi proyek Anda berikutnya!

Artikel Terkait

💬 Komentar