在上一章我們介紹了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檔,
之後雙方就照著開發,等於某種規則書。