tutorial

  1. gRPC Reflection untuk Tools seperti grpcurl

62. gRPC Reflection untuk Tools seperti grpcurl

gRPC telah menjadi salah satu standar de facto dalam pengembangan microservices modern. Dengan keunggulan seperti komunikasi cepat berbasis HTTP/2, kontrak yang kuat dengan Protobuf, hingga streaming dua arah, tidak heran gRPC diadopsi luas oleh perusahaan besar. Namun, meski gRPC menawarkan banyak kelebihan, ada tantangan unik yang kerap ditemui saat hendak melakukan debugging atau eksplorasi terhadap API gRPC. Salah satunya: bagaimana kita berinteraksi atau melakukan introspection pada API gRPC tanpa membutuhkan file .proto?

Di sinilah fitur gRPC Reflection hadir, membuka pintu tool-tool seperti grpcurl yang secara otomatis dapat menginspeksi servis gRPC yang berjalan tanpa perlu memiliki Protofile lokal. Artikel ini akan membahas tentang gRPC Reflection, bagaimana ia bekerja, serta contoh penerapannya dengan grpcurl. Saya juga akan menyisipkan diagram alur menggunakan mermaid dan tabel untuk membantu pemahaman Anda.


Apa Itu gRPC Reflection?

Secara sederhana, gRPC Reflection adalah sebuah server extension yang memungkinkan klien menanyakan metadata terkait service, message, dan method yang di-expose oleh server gRPC. Reflection ini sangat membantu saat kita ingin:

  • Mengeksplorasi API secara dinamis (misal, konsultasi method apa saja yang tersedia),
  • Membantu tooling seperti grpcurl, Postman, atau IDE tertentu,
  • Pengecekan integrasi sistem secara manual tanpa file proto.

gRPC Reflection bekerja dengan menambahkan service khusus pada server gRPC, yang secara otomatis membaca dan membagikan metadata service yang tersedia kepada klien (dengan cara yang aman, tentu saja).


Skenario Tanpa Reflection

Di dunia nyata, saat harus melakukan debugging pada suatu endpoint gRPC, pertama yang kita butuhkan tentu adalah file proto yang dipakai encoder/decoder serta peta endpoint. Namun, sering kali file tersebut:

  • Tidak tersedia langsung,
  • Berbeda versi dengan deployment,
  • Tersimpan di repo privat,
  • Atau bahkan lupa disinkronisasi.

Tanpa file proto yang pas, tool seperti grpcurl, Evans, bahkan plugin VSCode akan kesulitan berinteraksi dengan server.


Skenario Dengan Reflection

Dengan mengaktifkan Reflection, kita bisa menggunakan tool seperti grpcurl secara protoless—cukup tahu alamat endpoint-nya saja! Tools tersebut bisa melakukan discovery method, service, field, dan mengirim request tanpa perlu proto manual.


Cara Kerja gRPC Reflection (mermaid Diagram)

Mari kita visualisasikan alur request antara grpcurl, Reflection Service, dan Actual Service menggunakan diagram mermaid berikut:

sequenceDiagram
    participant User
    participant grpcurl
    participant ReflectionService
    participant ActualService

    User->>grpcurl: Mengetik perintah grpcurl (tanpa proto)
    grpcurl->>ReflectionService: Query metadata & list service
    ReflectionService-->>grpcurl: Return daftar service & protos
    grpcurl->>ActualService: Eksekusi RPC call berbasis hasil protocol reflection
    ActualService-->>grpcurl: Response RPC
    grpcurl-->>User: Tampilkan response

Contoh: Mengaktifkan Reflection di gRPC Go

Mari kita bahas bagaimana mengaktifkan gRPC Reflection dengan Go. Misal kita punya service sederhana seperti berikut:

// helloworld.proto
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

Kita akan menambahkan reflection dalam inisialisasi server:

package main

import (
    "net"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    pb "example.com/helloworld" // package hasil generate proto
)

func main() {
    lis, _ := net.Listen("tcp", ":50051")
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    // Aktifkan Reflection di bawah sini
    reflection.Register(s)

    s.Serve(lis)
}

Cukup satu baris: reflection.Register(s).


Eksplorasi Service dengan grpcurl

Tanpa adanya file proto, kita tetap dapat menjelajah API via grpcurl:

# List semua service yang tersedia
grpcurl -plaintext localhost:50051 list

# List semua metode pada 'Greeter'
grpcurl -plaintext localhost:50051 list Greeter

# Lihat deskripsi method SayHello
grpcurl -plaintext localhost:50051 describe Greeter.SayHello

# Memanggil RPC
echo '{"name":"World"}' | grpcurl -plaintext -d @ localhost:50051 Greeter/SayHello

Output Contoh:

Greeter
grpc.reflection.v1alpha.ServerReflection
Greeter.SayHello
rpc SayHello (HelloRequest) returns (HelloReply);
{
  "message": "Hello, World"
}

Perhatikan: Opsi -plaintext digunakan jika server tidak menggunakan TLS.


Tabel: Perbandingan Dengan & Tanpa Reflection

FiturTanpa ReflectionDengan Reflection
List service/methodPerlu file protoBisa langsung
Describe field/parameterTidak bisaBisa
Testing/dummy callPerlu proto schemaTidak perlu proto manual
Static code generationPerlu protoPerlu proto
Keamanan extraLebih privatPerlu kontrol akses

Potensi Risiko Security

Karena Reflection mengekspose metadata API Anda, aktifkan Fitur ini hanya:

  • di environment development atau staging, JANGAN di production kecuali benar-benar perlu,
  • Terapkan ACL di level Firewall/Authentication,
  • Gunakan middleware/kontrol akses untuk membatasi siapa yang boleh melakukan reflection.

Advanced: Reflection di gRPC dengan TLS

Jika server Anda menggunakan TLS, grpcurl harus diberi tahu credential CA, client certificate, dsb. Contoh:

grpcurl -cacert ca.pem -cert client.pem -key client-key.pem mydomain:443 list

Extension & Ecosystem

Selain grpcurl, ada tool lain seperti Evans (CLI REPL untuk gRPC), Postman (versi beta fitur gRPC), hingga REST Gateway generator yang semakin powerful dengan Reflection.


Simulasi: Introspeksi Service Baru

Bayangkan teman Anda deploy microservice baru, namun Anda tidak mendapat proto-nya. Gunakan:

grpcurl -plaintext 10.0.0.1:9000 list

Output misal:

UserService
grpc.reflection.v1alpha.ServerReflection

Lanjut:

grpcurl -plaintext 10.0.0.1:9000 describe UserService.GetProfile

grpcurl akan menginformasikan fields, types, dan message structure milik endpoint itu, sehingga Anda dapat crafting request meski tanpa source proto asli.


Kesimpulan

gRPC Reflection adalah tools yang powerful untuk meningkatkan eksplorasi, debugging, dan pengujian service berbasis gRPC. Aktivasinya sangat mudah (cukup satu baris di kode Anda), dan segera membuka jalan interaksi dinamis lewat tooling seperti grpcurl. Meski sangat praktis, gunakan dengan bijak, utamakan keamanan dengan membatasi akses di environment yang sensitif.

Di era observability dan shifting-left debugging, fitur seperti gRPC Reflection tak hanya memudahkan kerja developer, tapi juga mempercepat proses pengembangan dan integrasi antar tim.

Selamat bereksperimen dengan grpcurl — the Swiss army knife for gRPC debugging! 🚀


Referensi:


comments powered by Disqus