iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0

前言

在上一篇,我們介紹了 gRPC 以及建例 proto 檔,今天要來介紹如何使用 gRPC 來建立一套 Server,以及在 Client 端如何去呼叫 Server 端。

gRPC Server

先帶來如何建立一個 Server 端,一樣先建立好 proto 檔,可以參考上一篇:

syntax = "proto3";
 
option go_package = ".;student";
 
package student;
 
service StudentServer { 
   rpc GetStudentData (GetStudentDataReq) returns (GetStudentDataRes) {}
}
 
message GetStudentDataReq { 
   int64  student_id = 1;
   string class = 2;
}
 
message GetStudentDataRes { 
   string student_name = 1;
   int64 student_heigh = 2;
   int64 student_weight = 3;
}

我們要起的服務,包括一隻 GetStudentData API,接著就要建立 main function,將服務起起來:

package main

import (
	"context"
	"fmt"
	"net"
	"os"
	"os/signal"
	"syscall"

	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"

	student "student/pb"
)

type studentServer struct {
}

func main() {
	var (
		err              error
		shutdownObserver = make(chan os.Signal, 1)
	)
	// 設定要監聽的 port
	lis, err := net.Listen("tcp", ":3010")
	if err != nil {
		panic(err)
	}

	// 使用 gRPC 的 NewServer meethod 來建立 gRPC Server
	grpcServer := grpc.NewServer()
	sv := &studentServer{}
	student.RegisterStudentServerServer(grpcServer, sv)
	// 在 gRPC 伺服器上註冊反射服務。
	reflection.Register(grpcServer)

	go func(gs *grpc.Server, c chan<- os.Signal) {
		err := gs.Serve(lis)

		if err != nil {
			shutdownObserver <- syscall.SIGINT
		}
	}(grpcServer, shutdownObserver)

	signal.Notify(shutdownObserver, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)

	//阻塞直到有信號傳入
	s := <-shutdownObserver
	fmt.Println(`Receive signal:`, s)

	// 優雅停止GRPC服務
	grpcServer.GracefulStop()
}

func (s *studentServer) GetStudentData(ctx context.Context, in *student.GetStudentDataReq) (r *student.GetStudentDataRes, err error) {
	r = &student.GetStudentDataRes{
		StudentName:   "JC",
		StudentHeigh:  178,
		StudentWeight: 70,
	}

	return r, err
}

如此一來,就可以起動這個 Server!

gRPC Client

在 Client 端,要呼叫服務端,作法很簡單,直接看程式碼:

package main

import (
	"context"
	"fmt"
	"log"

	"google.golang.org/grpc"

	"student/pb"
)

var client student.StudentServerClient

func main() {

	// 建立連線
	conn, err := grpc.Dial("localhost:3010", grpc.WithInsecure())
	if err != nil {
		fmt.Println("連線失敗:", err)
	}

	// 最後關閉練線
	defer conn.Close()

	// 用 proto 提供的 NewStudentServerClient,來建立 client
	client = student.NewStudentServerClient(conn)

	GetStudent(1, "A")
}

func GetStudent(studentId int64, class string) {
	res, err := client.GetStudentData(context.Background(),
		&student.GetStudentDataReq{
			StudentId: studentId,
			Class:     class,
		})
	if err != nil {
		log.Fatalf("GetStudentData error: %v", err)
	}
	fmt.Println(res) //執行結果
}

這樣將可以建立 Client 端連線了,使用 Server 端提供的服務

結語

今天帶來如何在 Go 語言中使用 gRPC,建出一套 Server 和 Client,使用起來不會太過複雜,如果你是想以 Go 語言來開發網站,那 gRPC 是你必須學的一大課題,點對點的即時通訊,使得他非常適合於微服務,會帶來非常高的效率。
感謝各位讀者今天的閱讀,希望對你有幫助!


上一篇
Day28-Go gRPC(上)
下一篇
Day30- Final Go
系列文
golang後端入門分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言