1. 程式人生 > 其它 >golang gRPC服務

golang gRPC服務

下載grpc通用編譯器

安裝go專用的protoc的生成器

  • 安裝命令:go get -v github.com/golang/protobuf/protoc-gen-go
  • 安裝後會在GOPATH目錄下生成可執行檔案,protobuf的編譯器外掛protoc-gen-go,等下執行protoc命令會自動呼叫這個外掛

編寫protobuf檔案

// 語法為proto3
syntax = "proto3";
// 指定包名為pb
package pb;
// 表示在當前目錄下生成.go檔案,並且包名為pb
option go_package = "./;pb";

// 定義客戶端傳到服務端的請求體格式
message Request{
  string Name = 1;
  int32 Age = 2;

}
// 定義服務端響應到客戶端的響應體格式
message Response{
  string remarks = 3;
}


// 定義一個Hello的服務
service Hello{
  // 定義Say方法
  rpc Say(Request) returns(Response);
}
  • 編譯命令 :protoc --go_out=plugins=grpc:./ *.proto
  • RegisterHelloServer用於註冊服務的函式
  • GrpcHello 實現這個介面用於返回結果給客戶端

服務端

package main

import (
	"context"
	"day01/server/pb"
	"fmt"
	"google.golang.org/grpc"
	"net"
)

// 實現Hello介面用於返回結果給客戶端
type GrpcHello struct {
}

// 介面具體的方法
func (this *GrpcHello) Say(cx context.Context, req *pb.Request) (*pb.Response, error) {
	/*
		cx context.Context 上下文管理
	    req *pb.Request 這個就是我們之前在protobuff中寫的Request,也就是客戶端傳上來的請求內容都在這裡面
	*/

	// 例項化Response物件,也就是我們在protobuff中寫的Response,將返回的內容封裝之後返回給客戶端
	res := pb.Response{
		Remarks: fmt.Sprintf("姓名:%s 年齡:%d", req.Name, req.Age),
	}
	return &res, nil
}

func main() {
	//建立一個grpc物件
	grpcServer := grpc.NewServer()
	// 註冊服務
	pb.RegisterHelloServer(grpcServer, &GrpcHello{})
	// 監聽
	listen, err := net.Listen("tcp", "127.0.0.1:8888")
	defer listen.Close()
	if err != nil {
		fmt.Println("建立監聽失敗...", err)
		return
	}
	fmt.Println("啟動監聽...")
	grpcServer.Serve(listen)
}

客戶端

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"day01/client/pb"
)


func main() {
	// 連線服務端,並且新增grpc.WithInsecure(),不然沒有證書會報錯
	conn, err := grpc.Dial("127.0.0.1:8888", grpc.WithInsecure())
	if err != nil {
		fmt.Println("連線服務端出錯...")
		return
	}
	defer conn.Close()
	// 建立grpc服務客戶端
	serverClient := pb.NewHelloClient(conn)
	// 呼叫Say服務
	response, err := serverClient.Say(context.Background(), &pb.Request{Age: 18, Name: "老王"})
	if err != nil {
		fmt.Println("傳送訊息失敗...", err)
		return
	}
	fmt.Println(response)
}