在上一章我們介紹了GRPC,而要在go內使用GRPC,就一定要知道GRPC的client跟server怎麼用。
在說明如何建立GRPC SERVER之前,這邊先說明這次的目錄結構:
test
├── client
├── webserver
│   ├── webserver.pb.go
│   └── webserver.proto
└── server
下面是webserver.proto的大致內容:
syntax = "proto3";
package webserver;
option go_package = "./;webserver";
service WebServerService {
    //取得使用者資料
    rpc GetUserData(GetUserDataRequest) returns (GetUserDataReply){}
    //新增使用者資料
    rpc AddUserData(AddUserDataRequest) returns (SingleUserDataReply){}
    //更新使用者資料
    rpc UpdateUserData(UpdateUserDataRequest) returns (SingleUserDataReply){}
    //刪除使用者資料
    rpc DeleteUserData(DeleteUserDataRequest) returns (DeleteUserDataReply){}
   
}
這邊定義了四個函數以及其參數,webserver.pb.go就是依照這些設定建立出來的pb.go檔。
要建置GRPC Server 首先在server目錄內建立一個main.go,import跟package設定如下
package main
import (
	"context"
	"log"
	"net"
	"test/webserver"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)
而程式內容則先寫成下面這樣:
func main() {
	// 監聽指定port,這樣服務才能在該port執行。
	lis, err := net.Listen("tcp", ":8787")
	if err != nil {
		log.Println("無法監聽該port:%v", err)
	}
	// 建立新 gRPC 伺服器並註冊webServer服務。
	s := grpc.NewServer()
	webserver.RegisterWebServerServiceServer(s, &server{})
	// 在 gRPC 伺服器上註冊反射服務。
	reflection.Register(s)
	// 開始在指定port中服務。
	if err := s.Serve(lis); err != nil {
		log.Println("無法提供服務:%v", err)
	}
}
type server struct{}
這時編譯的話他會顯示你缺少AddUserData方法,因為pb.go內定義好了interface,
當初定義在裡面的方法都要出現,可以多不能少,所以必須補上下面的函數
func (s *server) GetUserData(ctx context.Context, in *webserver.GetUserDataRequest) (*webserver.GetUserDataReply, error) {
	return &webserver.GetUserDataReply{}, nil
}
func (s *server) AddUserData(ctx context.Context, in *webserver.AddUserDataRequest) (*webserver.SingleUserDataReply, error) {
	return &webserver.SingleUserDataReply{}, nil
}
func (s *server) UpdateUserData(ctx context.Context, in *webserver.UpdateUserDataRequest) (*webserver.SingleUserDataReply, error) {
	return &webserver.SingleUserDataReply{}, nil
}
func (s *server) DeleteUserData(ctx context.Context, in *webserver.DeleteUserDataRequest) (*webserver.DeleteUserDataReply, error) {
	return &webserver.DeleteUserDataReply{}, nil
}
這樣就可以編譯成功,並架設GRPC SERVER了。
Client的架設比較簡單
    conn, err := grpc.Dial("localhost:8787", grpc.WithInsecure())
	if err != nil {
		log.Println("連線失敗:", err)
	}
	defer conn.Close()
	c := webserver.NewWebServerServiceClient(conn)
	getUserPara := &webserver.GetUserDataRequest{}
	r, err := c.GetUserData(context.Background(), getUserPara)
	if err != nil {
		log.Println(err)
	}
	log.Println("response:", r)
像這樣就可以呼叫server內的方法,回傳的response也是當初定義的資料,因此可以先寫好.proto檔,
之後雙方就照著開發,等於某種規則書。