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

99. Studi Kasus: Dashboard Admin berbasis grpc-gateway

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

Dashboard admin adalah jantung utama dalam mengelola aplikasi berskala besar. Di balik tombol dan tabel statistiknya, tersimpan tantangan arsitektur nyata tentang komunikasi antar service backend. Salah satu cara modern untuk membangun API kuat sekaligus tetap developer-friendly adalah grpc-gateway. Dalam studi kasus ini, kita akan membongkar bagaimana membangun dashboard admin berbasis grpc-gateway, lengkap dengan studi desain, contoh kode, simulasi alur, dan best practices.


Pendahuluan: Ketika REST Tak Lagi Cukup

Banyak aplikasi mulai dengan REST API. Namun, seiring bertambahnya volume data, kebutuhan real-time, dan demand integrasi multi-platform, protokol ini mulai terasa kurang efisien. gRPC, yang berbasis HTTP/2 dan Protocol Buffers, menawarkan performa dan type safety. Namun, gRPC murni belum universal: tidak setiap frontend siap bicara gRPC-native. Inilah celah yang diisi oleh grpc-gateway: sebuah bridge otomatis dari gRPC ke RESTful API.


Studi Kasus: Dashboard Admin Kinerja User

Misalkan kita punya aplikasi SaaS, dengan tim admin yang mengelola user, melakukan monitoring penggunaan, dan melakukan intervensi bila terjadi anomaly. Kita ingin dashboard admin yang:

  • Menampilkan statistik user secara real-time.
  • CRUD user dengan response cepat.
  • Bisa diakses oleh frontend web (through RESTful endpoints).
  • Backend efisien, schema terdesain dengan baik, dan mudah untuk di-scale.

Pilihan Arsitektur

LayerStack yang DipilihRationale
FrontendReact + fetchFamiliar, REST endpoint ready
API Gatewaygrpc-gateway (Go)Translasi HTTP(JSON) <-> gRPC
BackendgRPC Microservices (GoLang)High-perf, strong typing
StoragePostgreSQLKonsisten, cocok untuk analytics

Protobuf Definition: Mendefinisikan API Sekali untuk Semua

gRPC berawal dari satu sumber kebenaran: .proto file. Contohnya, user.proto:

proto
 1syntax = "proto3";
 2
 3package admin;
 4
 5service UserService {
 6    rpc GetUserStats (StatsRequest) returns (StatsResponse) {
 7        option (google.api.http) = {
 8            get: "/admin/users/stats"
 9        };
10    }
11
12    rpc ListUsers (ListUsersRequest) returns (ListUsersResponse) {
13        option (google.api.http) = {
14            get: "/admin/users"
15        };
16    }
17
18    rpc CreateUser (CreateUserRequest) returns (User) {
19        option (google.api.http) = {
20            post: "/admin/users"
21            body: "*"
22        };
23    }
24
25    rpc DeleteUser (DeleteUserRequest) returns (Empty) {
26        option (google.api.http) = {
27            delete: "/admin/users/{id}"
28        };
29    }
30}
31
32message StatsRequest {}
33message StatsResponse {
34    int32 active_user_count = 1;
35    int32 total_user_count = 2;
36}
37
38message User {
39    string id = 1;
40    string name = 2;
41    string email = 3;
42}
43
44message ListUsersRequest {
45    int32 page = 1;
46    int32 per_page = 2;
47}
48message ListUsersResponse {
49    repeated User users = 1;
50}
51
52message CreateUserRequest {
53    string name = 1;
54    string email = 2;
55}
56
57message DeleteUserRequest {
58    string id = 1;
59}
60message Empty {}
Danger
Dengan sebuah file .proto, endpoint gRPC untuk backend dan REST untuk frontend ter-generate otomatis.

Implementasi gRPC Backend

Misal, di GoLang (implementation yang populer untuk gRPC):

go
 1// user_service.go
 2func (s *Server) GetUserStats(ctx context.Context, req *pb.StatsRequest) (*pb.StatsResponse, error) {
 3    stats, err := s.repo.FetchStats() // Ambil dari Postgres misal
 4    if err != nil {
 5        return nil, status.Errorf(codes.Internal, "FetchStats: %v", err)
 6    }
 7    return &pb.StatsResponse{
 8        ActiveUserCount: stats.Active,
 9        TotalUserCount:  stats.Total,
10    }, nil
11}

Setting up grpc-gateway

grpc-gateway membaca anotasi google.api.http pada proto dan menghasilkan proxy HTTP -> gRPC converter.

Misal, pada Go Mod Project:

  1. Generate code dari .proto:

    bash
    1protoc -I. --go_out=. --go-grpc_out=. --grpc-gateway_out=. user.proto
  2. Implementasikan gateway handler:

    go
    1mux := runtime.NewServeMux()
    2err := admin.RegisterUserServiceHandlerServer(ctx, mux, userServer)
    3if err != nil {
    4   log.Fatalf("Failed to register: %v", err)
    5}
    6http.ListenAndServe(":8080", mux)
Danger
grpc-gateway akan expose /admin/users/stats, /admin/users, dll sebagai endpoint REST, sementara forwards request ke handler gRPC.

Simulasi Alur Request

Contoh, frontend React fetch statistik user:

js
1fetch("/admin/users/stats")
2  .then(res => res.json())
3  .then(res => console.log(res));

Pada backend:

  • HTTP GET /admin/users/stats
  • grpc-gateway mengkonversi ke GetUserStats gRPC
  • Handler GoLang menjalankan logic bisnis
  • Hasil direturunkan ke frontend dalam format JSON

Diagram Alur (mermaid)

MERMAID
sequenceDiagram
  participant Frontend
  participant grpc-gateway
  participant UserService (gRPC)
  participant Database

  Frontend->>grpc-gateway: GET /admin/users/stats
  grpc-gateway->>UserService (gRPC): GetUserStats()
  UserService (gRPC)->>Database: SQL SELECT COUNT()
  Database-->>UserService (gRPC): Stats
  UserService (gRPC)-->>grpc-gateway: StatsResponse
  grpc-gateway-->>Frontend: JSON Stats

Benchmark: Efisiensi

Analisa ringkas simulasi performance:

Metode KoneksiRPS (req/sec)Median Latency (ms)
REST API Legacy950120
Native gRPC1.50040
grpc-gateway API1.40045

Dengan grpc-gateway, kita mendapatkan performance hampir setara gRPC native, sekaligus fleksibilitas REST.


Testing dan Observabilitas

Anda tetap bisa menulis unit/integration test pada gRPC handler, dan hanya perlu test e2e pada layer grpc-gateway. grpc-gateway telah mature dan mendukung OpenAPI docs serta logging middleware dengan mudah, memastikan observabilitas.

go
1mux := runtime.NewServeMux(
2   runtime.WithForwardResponseOption(myLoggingResponseModifier),
3)

Perbandingan: REST vs gRPC-Gateway

FeatureREST-Onlygrpc-gateway
Strong typingLemahSangat Kuat (proto)
Auto SDK genBiasanya manualYa (dari proto)
Documentasi OpenAPISwaggerOtomatis dari proto
PerformanceStandarMendekati gRPC native
Migrasi ke gRPC nativeSusahSangat mudah

Catatan dan Best Practices

  1. Selalu mulai dari proto file: Fungsikan proto sebagai single source of truth bagi API.
  2. Gunakan anotasi google.api.http secara konsisten agar endpoint REST selalu tersedia.
  3. Pisahkan handler gateway dan backend logic—jaga agar handler REST simpel, logic berat dihandler gRPC.
  4. Versikan proto dan endpoint jika ada perubahan schema besar.
  5. Monitoring tracing antar layer penting untuk debugging production.

Kesimpulan

Dengan grpc-gateway, team backend bisa menulis API yang modern, efficient, dan future proof, sembari tetap menyajikan API RESTful yang umum untuk frontend, mobile, integrator maupun legacy client lain. Studi kasus dashboard admin ini menampilkan kekuatan pola: definisikan sekali, gunakan di mana saja. Proyek berikutnya, segera pertimbangkan untuk memulai dari gRPC + grpc-gateway.


Sumber ingin coba?
gRPC-Gateway Documentation
Contoh kode di github.com/your-repo/admin-dashboard-grpc-gateway

Terimakasih telah membaca!
Tinggalkan komentar jika ingin studi kasus lebih dalam lagi.

Artikel Terkait

💬 Komentar