iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0

在上一章我們介紹了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

要建置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了。

GRPC Client

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檔,
之後雙方就照著開發,等於某種規則書。


上一篇
Day21-Grpc
下一篇
Day23-http打其他服務
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言