tutorial

  1. Men-deploy gRPC Service di Docker


title: “78. Men-deploy gRPC Service di Docker” date: 2024-06-13 author: Software Engineer Senior

gRPC belakangan menjadi semakin populer sebagai salah satu teknologi RPC (Remote Procedure Call) yang cepat, efisien, dan sangat cocok digunakan pada arsitektur berbasis microservices. Namun, membangun gRPC Service saja tidak cukup tanpa tahu cara packaging dan deployment yang baik, terutama ke dalam lingkungan tercontainerisasi seperti Docker.

Di artikel ini saya akan membagikan pengalaman dan best-practice untuk men-deploy gRPC Service menggunakan Docker, dilengkapi dengan contoh kode, simulasi, tabel, dan diagram alur deployment via mermaid. Kita akan menggunakan bahasa Go sebagai contoh implementasi, karena sintaks yang jelas dan kecepatan build-nya, tapi konsepnya sangat bisa diterapkan pada stack manapun (Python, Java, Node.js, dsb).


1. Mengenal gRPC dan Docker secara Singkat

Apa itu gRPC?

gRPC adalah framework open-source yang dikembangkan Google, memungkinkan aplikasi berkomunikasi antar perangkat dengan definisi API (interaktif, berbasis Protobuf) yang efisien. Kelebihan gRPC antara lain:

  • Mendukung Multilanguage (Go, Java, C#, Python, dsb)
  • Fast onder-the-hood HTTP/2 (bukan HTTP/1.1)
  • Mendukung streaming bidirectional dan unary
  • Mendukung Autogenerate Stubs dari *.proto

Apa itu Docker?

Docker adalah tools containerization yang memudahkan kita untuk mengemas aplikasi beserta seluruh dependensi agar dapat berjalan konsisten di mana saja—di laptop, server, atau cloud tanpa khawatir dependency hell.


2. Struktur Proyek Minimal

Sebelum masuk ke deployment, berikut struktur minimal sebuah proyek gRPC berbasis Go yang akan kita gunakan:

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

Penjelasan singkat:

  • proto/hello.proto: File Protobuf untuk mendefinisikan service & message
  • server/main.go: Service implementation (Go)
  • client/main.go: Simulasi client gRPC (opsional)
  • Dockerfile: Setup image Docker
  • go.mod: Modul Golang dependency management

3. Menyiapkan Service gRPC Sederhana

Langkah 1: Definisikan Service di Protobuf

Buat file proto/hello.proto

syntax = "proto3";

package helloworld;

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Langkah 2: Generate Code Go

Instal protoc dan plugin Go:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

Generate kode:

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

Langkah 3: Implementasi Server

Buat file server/main.go:

package main

import (
  "context"
  "log"
  "net"

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

type server struct {
  pb.UnimplementedGreeterServer
}

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

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

  log.Println("gRPC server listening on :50051")
  if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
  }
}

4. Membuat Dockerfile Untuk gRPC Service

Agar aplikasi Go kita bisa berjalan di mana saja, kita kemas menggunakan Docker. Berikut contoh Dockerfile yang cukup optimal:

# Stage 1: Build binary
FROM golang:1.21-alpine AS builder
WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server ./server

# Stage 2: Final image
FROM scratch
WORKDIR /root/

COPY --from=builder /app/server .
COPY proto/ ./proto/
EXPOSE 50051
ENTRYPOINT ["./server"]

Catatan:

  • Kita menggunakan multi-stage build (builder dan scratch) agar image hasilnya kecil dan hanya berisi binary release.
  • Hanya port 50051 (default gRPC) yang diekspos.

5. Build & Simulasi Deploy Docker

Simulasi Build

Jalankan perintah berikut di root folder:

docker build -t grpc-docker-demo:latest .

Menjalankan Container

docker run -p 50051:50051 grpc-docker-demo:latest

Service sekarang sudah bisa diakses di localhost:50051 (untuk client gRPC).


6. Testing Lokal Dengan gRPC Client

Jika ingin menguji lewat client sederhana:

package main

import (
  "context"
  "log"
  "time"

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

func main() {
  conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
  if err != nil {
    log.Fatalf("did not connect: %v", err)
  }
  defer conn.Close()
  c := pb.NewGreeterClient(conn)

  ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  defer cancel()
  r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "Dunia"})
  if err != nil {
    log.Fatalf("could not greet: %v", err)
  }
  log.Printf("Server Response: %s", r.Message)
}

7. Deployment Flow Diagram

Berikut adalah diagram alur deployment gRPC Service di Docker:

flowchart TD
    A[dev: Implementasi gRPC Service]
    B[Build Docker Image]
    C[Test Lokal Docker Run]
    D[Push ke Docker Registry]
    E[Deploy ke Server/Cloud (k8s, ECS, dll)]
    A --> B
    B --> C
    C --> D
    D --> E

8. Tabel Perbandingan: Docker vs Native Run

AspekNative RunDockerized Run
DependencyManual installImaged, self-contained
PortabilityOS/machine dependentMulti-platform
IsolasiTidak adaFull (namespace, fs)
Deploy SpeedLebih cepat di satu hostRollout lebih mudah
ManagementSulit scaleOrchestration-friendly

9. Tips Profesional Deploy gRPC di Docker

Beberapa best-practices yang wajib diperhatikan:

  • Gunakan multi-stage build untuk mengurangi size image
  • Nonaktifkan CGO (CGO_ENABLED=0) supaya binary lebih portable
  • Pisahkan credentials/secrets dari image, gunakan ENV variable atau secret manager
  • Automate build/test dengan CI/CD (contoh: GitHub Actions, GitLab CI)
  • Monitoring & Health Check: gRPC tidak expose HTTP endpoint, gunakan sidecar/liveness probe custom

10. Kesimpulan

Men-deploy gRPC Service ke dalam Docker bukan hanya praktik modern, tetapi juga menjamin aplikasi kita siap untuk scale up ke production environment modern seperti Kubernetes atau cloud platform lain. Prosesnya cukup straightforward jika project terstruktur dengan baik, dependencies tertata, dan kita disiplin mengikuti best-practice.

Dengan langkah-langkah di atas, Anda sudah bisa mengemas, menjalankan, dan men-deploy gRPC Service secara konsisten di mana pun.

Selamat mencoba, dan semoga service Anda mulus tanpa drama dependency lagi!


Referensi:


Jika Anda ingin membahas topik seputar monitoring, observability, atau CI/CD untuk layanan gRPC di Docker, silakan request di kolom komentar!

comments powered by Disqus