tutorial

12 Membuat Client gRPC Pertama Anda

Dalam ekosistem pengembangan perangkat lunak modern, komunikasi antarlayanan (inter-service communication) adalah tulang punggung pada arsitektur microservices. Salah satu protokol RPC (Remote Procedure Call) paling populer dan efisien yang dikembangkan Google adalah gRPC. Protokol ini telah menjadi standar de facto untuk komunikasi layanan-layanan backend di banyak organisasi. Namun, memahami dan mengimplementasikan klien gRPC pertama Anda dapat menjadi tantangan tersendiri jika tidak dibimbing secara sistematis.

Pada artikel ini, saya akan memandu Anda melalui proses membangun client gRPC pertama: mulai dari menghasilkan kode stub, membangun kode aplikasi klien, sampai melakukan komunikasi nyata dengan server. Saya juga akan menyertakan contoh kode, simulasi, tabel perbandingan, dan diagram alir end-to-end.

Apa Itu gRPC?

Sebelum kita masuk ke tahap praktis, mari ulas sekilas apa itu gRPC dan mengapa ia sangat diminati.

gRPC adalah framework RPC modern yang menggunakan Protobuf (Protocol Buffers) sebagai format serialisasi datanya. Keunggulannya meliputi:

  • Performa tinggi (HTTP/2)
  • Definisi API yang jelas via .proto file
  • Dukungan lintas platform & bahasa pemrograman
  • Dokumentasi & ekosistem tooling yang matang

Persiapan Awal

Sebelum membangun client, pastikan Anda sudah merampungkan hal berikut:

  • Sudah punya server gRPC berjalan (atau file .proto-nya)
  • Terinstal protoc — compiler Protobuf
  • Sudah ada plugin gRPC untuk bahasa pemrograman pilihan (di artikel ini: Go, salah satu yang populer dan mudah diikuti)

Struktur direktori dasar proyek akan seperti ini:

grpc-demo/
├── proto/
│   └── hello.proto
├── server/
│   └── main.go
└── client/
    └── main.go

Mendefinisikan API dengan .proto

Katakanlah API sederhana: client meminta server mengembalikan salam sapa. Buat file proto/hello.proto berikut:

syntax = "proto3";

package hello;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Menghasilkan Kode Stub

Jalankan perintah berikut dari root project untuk menghasilkan kode gRPC untuk Go:

protoc --go_out=. --go-grpc_out=. proto/hello.proto

Ini akan menghasilkan file Go pada folder proto/. Di situ terkandung interface client dan server.


Langkah-Langkah Membangun Client gRPC

1. Konsep Alur Komunikasi

Bagaimana client gRPC bekerja? Mari lihat diagram berikut:

sequenceDiagram
    participant Client
    participant Stub
    participant Server
    Client->>Stub: Memanggil stub local (SayHello)
    Stub->>Server: Membuat dan mengirim request (HelloRequest)
    Server->>Stub: Mengembalikan response (HelloReply)
    Stub->>Client: Mengembalikan nilai (HelloReply)

Stub client bertindak sebagai “proxy lokal”, sehingga memanggil fungsi remote semudah memanggil metode lokal.


2. Menulis Kode Client

Buka client/main.go dan tuliskan kode berikut:

package main

import (
    "context"
    "log"
    "os"
    "time"

    "google.golang.org/grpc"
    pb "grpc-demo/proto"     // Import hasil generate .proto
)

const (
    address     = "localhost:50051"
    defaultName = "dunia"
)

func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("gagal koneksi: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("gagal greeting: %v", err)
    }
    log.Printf("Salam: %s", r.GetMessage())
}

Penjelasan tahapan:

  • Membuat koneksi: grpc.Dial
  • Membuat objek client: NewGreeterClient
  • Set timeout & context
  • Panggil RPC: SayHello
  • Terima response dari server

3. Simulasi Interaksi Client-Server

Mari simulasikan jalur kode yang terlibat:

LangkahObjekFungsiInfo/Data
1. Koneksigrpc.ConnDial(address)Membuka channel HTTP/2 ke Srv
2. StubGreeterClientNewGreeterClient()Instansiasi client playground
3. RequestClientSayHello(ctx, req)Kirim HelloRequest{Name}
4. ResponseServerSayHello()Return HelloReply{Message}
5. OutputClientMenerima responsePrint message/handle error


Tantangan Umum Saat Membuat Client gRPC

1. Kesalahan Protobuf Path

Pastikan path import sudah tepat. Untuk Go, biasanya gunakan

pb "grpc-demo/proto"

2. TLS vs Insecure

Pada tahap development, Anda bisa gunakan grpc.WithInsecure(), namun untuk production WAJIB gunakan TLS demi keamanan.

3. Timeout & Context

Context memungkinkan Anda mengatur timeout dan cancel aktifitas RPC jika response terlalu lama.


Contoh Output

Jika server Anda berjalan dan Anda mengeksekusi:

go run client/main.go Dunia

Maka output-nya akan menjadi seperti:

2024/07/01 Salam: Halo Dunia

Membandingkan gRPC Client dengan REST Client

Berikut tabel ringkas keunggulan client gRPC dibandingkan REST:

FiturgRPCREST
Format DataProtobuf (biner, compact)JSON (plain)
PerformansiTinggi (HTTP/2)Cenderung lebih rendah
Type SafetyYaTidak (JSON)
StreamingYa (bi-directional)Terbatas
Auto CodegenKuat (protoc)Manual
PengamananTLS/Mutual TLSBisa


Tips Debugging Client

  • Gunakan grpclog.SetLoggerV2 untuk debugging verbose
  • Cek port & service registry jika terjadi connection refused
  • Protobuf yang berbeda antara client/server akan menyebabkan error Unimplemented

Menyalakan Server (Untuk Uji Coba)

Pastikan ada server berjalan pada localhost:50051. Berikut contoh service sederhana:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "grpc-demo/proto"
)

type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Halo " + in.GetName()}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    grpcServer := grpc.NewServer()
    pb.RegisterGreeterServer(grpcServer, &server{})
    log.Println("Server berjalan di :50051...")
    grpcServer.Serve(lis)
}

Kesimpulan

Membuat client gRPC pertama adalah milestone penting untuk engineer modern, terutama yang berkutat dengan microservice. Dengan protocol yang efisien, type safety bawaan, serta tooling otomasi code generation, membangun client gRPC hampir semudah menggunakan HTTP client biasa—tetapi dengan performa, keamanan, dan kemudahan skala jauh di atas rata-rata. Setelah memahami role .proto, stub, dan urutan eksekusi RPC, Anda siap mengeksplorasi advanced feature: seperti streaming, error handling, dan interceptors di gRPC.

Selamat mencoba membangun client gRPC pertama — dan selamat datang di dunia distributed systems profesional!

comments powered by Disqus

Topik Terhangat

programming
170
tips-and-trick
43
tutorial
36
jaringan
28
hardware
11
linux
4
kubernetes
1