11 Membuat Server gRPC Pertama Anda
Membangun sistem komunikasi antar layanan yang efisien adalah esensial di era microservices. gRPC hadir sebagai salah satu solusi modern yang powerful dan scalable. Dengan protokol berbasis HTTP/2 dan serialization Protobuf, gRPC mendukung komunikasi yang cepat, ringan, dan kuat lintas bahasa pemrograman. Di artikel ini, saya akan membimbing Anda—dari engineer pemula hingga intermediate—untuk membuat server gRPC pertama Anda menggunakan Go.
Artikel ini dirancang praktis, step-by-step, disertai contoh kode kerja, simulasi request-response, dan diagram alur. Mari kita mulai!
Apa Itu gRPC?
gRPC adalah framework RPC (Remote Procedure Call) open source dari Google, berjalan di atas HTTP/2, memanfaatkan Protobuf untuk serialisasi data. Dengan keunggulan seperti streaming, authentication, load balancing, gRPC jadi pilihan utama modern Inter Process Communication (IPC).
Arsitektur High-Level gRPC
Agar semakin jelas, berikut adalah diagram alur bagaimana gRPC client dan server berinteraksi:
graph TD
A[Client] -- Request (Protobuf) --> B[gRPC Server]
B -- Response (Protobuf) --> A
- Client membuat permintaan ke server menggunakan “stub” (kode yang digenerate dari Protobuf).
- Server menerima permintaan, memproses, dan merespon kembali ke client.
- Semua data ditransmisikan dalam format Protobuf melalui protokol HTTP/2.
Prasyarat Lingkungan
Sebelum ngoding, pastikan Anda sudah menginstal:
- Go (versi >= 1.16)
- protoc (Protocol Buffer compiler) di PATH
- protoc-gen-go dan protoc-gen-go-grpc plugins
- Editor teks favorit (VSCode, GoLand, dll)
Instalasi dengan command berikut:
1go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
2go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest1. Mendefinisikan Servis gRPC dengan Protobuf
Ayo mulai dengan service yang sederhana. Kita akan membuat Greeter, punya satu method: SayHello.
Buat file bernama helloworld.proto:
1syntax = "proto3";
2
3package helloworld;
4
5service Greeter {
6 rpc SayHello (HelloRequest) returns (HelloReply) {}
7}
8
9message HelloRequest {
10 string name = 1;
11}
12
13message HelloReply {
14 string message = 1;
15}Penjelasan:
service Greetermendefinisikan layanan.rpc SayHelloadalah method remote yang menerimaHelloRequestdan mengembalikanHelloReply.
2. Generate Kode Go dari Protobuf
Jalankan perintah generate:
1protoc --go_out=. --go-grpc_out=. helloworld.protoIni akan menghasilkan dua file:
helloworld.pb.go(data message Go type)helloworld_grpc.pb.go(interface server dan client)
3. Implementasi Server gRPC
Buat file server.go, lalu tulis implementasi berikut:
1package main
2
3import (
4 "context"
5 "log"
6 "net"
7
8 "google.golang.org/grpc"
9 pb "path/to/helloworld" // import sesuai lokasi file pb.go
10)
11
12type server struct {
13 pb.UnimplementedGreeterServer
14}
15
16// Implementasi method `SayHello`
17func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
18 log.Printf("Received: %v", in.GetName())
19 return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
20}
21
22func main() {
23 lis, err := net.Listen("tcp", ":50051")
24 if err != nil {
25 log.Fatalf("failed to listen: %v", err)
26 }
27 grpcServer := grpc.NewServer()
28 pb.RegisterGreeterServer(grpcServer, &server{})
29 log.Printf("gRPC server started at :50051")
30 if err := grpcServer.Serve(lis); err != nil {
31 log.Fatalf("failed to serve: %v", err)
32 }
33}Poin Kunci:
- Fungsi utama membuka port TCP
:50051. pb.RegisterGreeterServermendaftarkan service.- Implementasi method
SayHellomenyapa nama dari request client.
Simulasi: Contoh Request/Response
| Langkah | Deskripsi | Data Payload |
|---|---|---|
| Request | Client memanggil SayHello | { "name": "Andi" } |
| Response | Server balikkan sapaan | { "message": "Hello Andi" } |
4. Membuat Client sederhana (Opsional)
Agar lebih nyata, kita buat client sederhana di Go:
1package main
2
3import (
4 "context"
5 "log"
6 "time"
7
8 "google.golang.org/grpc"
9 pb "path/to/helloworld"
10)
11
12func main() {
13 conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
14 if err != nil {
15 log.Fatalf("did not connect: %v", err)
16 }
17 defer conn.Close()
18 c := pb.NewGreeterClient(conn)
19
20 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
21 defer cancel()
22 r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "Andi"})
23 if err != nil {
24 log.Fatalf("could not greet: %v", err)
25 }
26 log.Printf("Greeting: %s", r.GetMessage())
27}Output di Client:
1Greeting: Hello AndiOutput di Server:
1gRPC server started at :50051
2Received: AndiDiagram Alur RPC
Bagaimana eksekusi berproses—mulai dari client call hingga server response:
sequenceDiagram
participant C as Client
participant S as gRPC Server
C->>S: SayHello(name="Andi")
S-->>S: Proses SayHello()
S-->>C: HelloReply(message="Hello Andi")
Beberapa Tips Best Practice
| Tips | Keterangan |
|---|---|
| Error Handling | Sediakan error detail pada response (gunakan status codes gRPC) |
| Logging | Log setiap call untuk kemudahan debugging dan audit |
| Versioning | Definisikan field baru secara backward-compatible di Protobuf |
| Testing | Buat unit test & integration test dengan gRPC server mock |
| Security | Untuk production, gunakan TLS (tidak lagi grpc.WithInsecure()) |
Kesimpulan
Congrats! Anda telah berhasil membangun server gRPC Anda sendiri dari nol. Kita telah memulai dari mendefinisikan service di Protobuf, generate kode, implementasi server, hingga menyiapkan client untuk testing.
gRPC adalah tool yang powerful untuk membangun sistem yang scalable dan lintas platform. Langkah berikutnya, Anda bisa bereksperimen dengan streaming, authentication, dan load balancing.
Jika Anda ingin berkolaborasi atau berbagi pengalaman seputar gRPC di production, feel free drop komentar di bawah. Happy coding, engineer!
Referensi: