Table of Contents

03 – Membuat GRPC mengunakan Golang

Apa itu GRPC

Salah satu cara yang paling umum kita gunakan untuk melakukan pertukaran data adalah dengan menggunakan mekanisme REST API yang menggunakan protokol HTTP 1 dan JSON.

Pada tahun 2015, Google memperkenalkan sesuatu yang disebut gRPC, yang pada dasarnya adalah sebuah framework RPC (Remote Procedure Calls) yang merupakan sebuah mekanisme yang memungkinkan kita untuk mengakses sebuah prosedur yang berada di service lain.

Pada gRPC protokol yang digunakan adalah HTTP 2 dan protobuf dalam melakukan serialize data. GRPC juga di claim lebih cepat daripada REST API.

https://speedscale.com/blog/using-grpc-with-golang/

Kebutuhan
  1. Pemahaman dasar tentang Golang & gRPC
  2. Akun Github
  3. Go 1.2x
  4. Protoc terinstall, jika belum download di sini atau …
Linux Ubuntu
				
					sudo apt install -y protobuf-compiler
protoc --version # Pastikan versi compiler 3+
				
			
MacOS
				
					brew install protobuf
protoc --version  # Pastikan versi compiler 3+
				
			
Install Dependency
  1. Download package grpc pada golang.
  2. Install proto compiler untuk golang
    Dan pastikan dapat menjalankan perintah protoc –version
				
					go get google.golang.org/grpc
go install google.golang.org/protobuf/cmd/protoc-gen-go
protoc --version
				
			
Buat Project Server

Buat folder baru bernama grpc-go, lalu inisialisasi Go Module di dalamnya.

				
					mkdir grpc-go
cd grpc-go
go mod init github.com/mudybang/grpc-go
go mod tidy
mkdir client helloworld server
				
			
Membuat File Protobuf

Protobuf (Protocol Buffer) adalah mekanisme untuk menserialize struktur data. Protobuf ini juga sebagai kontrak antara server dan client dalam mendefinisikan tipe data untuk parameter dan return value dari procedure yang dibuat. Kita akan membuat folder bernama helloworld dan file dengan nama helloworld.proto.

edit file helloworld/helloworld.proto

				
					syntax = "proto3";

option go_package = "github.com/pascalallen/grpc-go/helloworld";

package helloworld;

service HelloWorldService {
  rpc SayHello(HelloWorldRequest) returns (HelloWorldResponse) {}
}

message HelloWorldRequest {}

message HelloWorldResponse {
  string message = 1;
}
				
			

Dari Direktori helloworld, jalankan perintah berikut :

				
					protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld.proto
go mod tidy
				
			

Perintah ini menghasilkan dua file baru:

  1. helloworld.pb.go, yang berisi kode untuk menangani serialisasi/deserialisasi data untuk buffer protokol
  2. helloworld_grpc.pb.go untuk menangani protokol komunikasi gRPC. File-file ini mewakili beberapa ratus baris kode yang tidak perlu Anda tulis.

Anda sekarang memiliki struktur aplikasi Anda tetapi masih memerlukan logika bisnis.

Implementasi Server

Sekarang kita telah menginstal kompiler buffer protokol, plugin buffer protokol untuk Go, dan menginisialisasi proyek kita, kita siap untuk membuat aplikasi server Go dan aplikasi klien Go. Mari kita mulai dengan server dengan melakukan coding ke direktori server dan membuat file bernama main.go dengan kode berikut :

				
					package main

import (
	"context"
	"log"
	"net"

	pb "github.com/mudybang/grpc-go/helloworld"
	"google.golang.org/grpc"
)

type server struct {
	pb.UnimplementedHelloWorldServiceServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloWorldRequest) (*pb.HelloWorldResponse, error) {
	return &pb.HelloWorldResponse{Message: "Hello, World! "}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen on port 50051: %v", err)
	}

	s := grpc.NewServer()
	pb.RegisterHelloWorldServiceServer(s, &server{})
	log.Printf("gRPC server listening at %v", lis.Addr())
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

				
			

Kode ini mengimplementasikan antarmuka layanan yang dihasilkan dari definisi layanan kita di helloworld.proto dan menyediakan server gRPC serta mendengarkan permintaan pada port 50051 dari klien. Namun belum cukup karena kita masih perlu mengimplementasikan aplikasi klien Go kita. Jadi mari kita lanjutkan.

Implementasi Client

Mirip dengan apa yang kita lakukan pada langkah di atas, mari buat aplikasi client Go pada direktori client dengan membuat file bernama main.go dengan kode sbb :

				
					package main

import (
	"context"
	"log"
	"time"

	pb "github.com/mudybang/grpc-go/helloworld"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func main() {
	conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("failed to connect to gRPC server at localhost:50051: %v", err)
	}
	defer conn.Close()
	c := pb.NewHelloWorldServiceClient(conn)

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

	r, err := c.SayHello(ctx, &pb.HelloWorldRequest{})
	if err != nil {
		log.Fatalf("error calling function SayHello: %v", err)
	}

	log.Printf("Response from gRPC server's SayHello function: %s", r.GetMessage())
}

				
			

Jalankan

Sekarang kita telah membuat server Go dan client Go, mari kita lihat cara kerjanya dengan terlebih dahulu menjalankan server Go. Dari root proyek, jalankan perintah berikut untuk memulai server gRPC:

				
					go run server/main.go
#2024/02/26 08:15:52 gRPC server listening at [::]:50051
				
			

Dan terakhir buka terminal baru terpisah, jalankan perintah berikut untuk menjalankan permintaan client gRPC:

				
					go run client/main.go
#2024/02/26 08:16:27 Response from gRPC server's SayHello function: Hello, World!