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.
sudo apt install -y protobuf-compiler
protoc --version # Pastikan versi compiler 3+
brew install protobuf
protoc --version # Pastikan versi compiler 3+
go get google.golang.org/grpc
go install google.golang.org/protobuf/cmd/protoc-gen-go
protoc --version
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
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:
Anda sekarang memiliki struktur aplikasi Anda tetapi masih memerlukan logika bisnis.
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.
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())
}
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!