gRPC應用實戰:(二)gRPC環境搭建以及簡單demo

CodeFish-xiao發表於2021-08-22

2.1 gRPC環境安裝

2.1.1 golang環境安裝

接下來的所有的教程以及程式碼都是golang程式碼進行演示,所以我們需要安裝golang環境:

下載地址:golang 官網

安裝完在你的命令列工具輸入

go version

就可以看到對應的下載版本

hSBTAg.png

然後就可以了。

2.1.2 protoc 安裝

在 gRPC 開發中,我們常常需要與 Protobuf 進行打交道,而在編寫了.proto 檔案後,我們會需要到一個編譯器,就是protoc。這個工具呢可以在GitHub上直接下載

github.com/protocolbuffers/protobu...

大家可以在這個網站自行下載安裝(因為之前這裡安裝完了,也不想重灌了,可能記得不太清了,你們直接試一試就好了,等下次重灌再豐富這裡)

一般操作是把protoc編譯檔案所在的目錄配到環境變數裡就好了

安裝完後:

執行

protoc –version

就可以看見版本資訊了

hSy129.png

2.1.2 安裝相關依賴包

安裝 golang 的proto工具包

go get -u github.com/golang/protobuf/proto

安裝 goalng 的proto編譯支援

go get -u github.com/golang/protobuf/protoc-gen-go

安裝 gRPC 包

go get -u google.golang.org/grpc

這樣子就基本上結束對於環境的安裝了

2.2 gRPC簡單demo

2.2.1 protocol buffer 語法

在gRPC中主要以protocol buffer來定義api以及服務,所以我們需要先了解一下protocol buffer的語法。protocol buffer主要使用中有兩個版本:proto2和proto3,這裡呢,推薦大家使用proto3進行日常開發。

首先:一切的學習都要學會看文件:這裡是谷歌對於protocol buffer proto3版本的的文件Language Guide (proto3)

當然你要是覺得英文看不過去的話,這裡還有鳥窩大大轉發的千念飛羽大大翻譯的Protobuf3語言指南可以讓大家學習。

接下來是一個最最最簡單protocol buffer demo,可搭配註釋食用:


//指定proto3語法

syntax = "proto3";

//包名

package helloworld;

//一個為Hello的服務(可定義多個服務,每個服務可定義多個方法)

service Hello {

//一個SayHello的方法

rpc SayHello (HelloRequest) returns (HelloResp) {}

}

// 定義傳送請求資訊

message HelloRequest {

// 定義傳送的引數

// 引數型別 引數名 標識號(不可重複)

string name = 1;

}

// 定義響應資訊

message HelloResp {

string message = 1;

}

2.2.2 編譯proto檔案

在編譯檔案前,我們先搭建一個最簡單的專案目錄,用來具體演示相關操作:

hSRQXj.png

client:gRPC客戶端程式碼

pb:存放公共pb檔案以及編譯檔案

server:gRPC服務端程式碼

接下來可以編譯編寫好的程式碼

通過下面的命令就可以直接生成對應語言的程式碼,具體程式碼可見:這裡


protoc --go_out=plugins=grpc:. *.proto

2.2.3 編寫服務端程式碼

接下來便可以編寫服務端程式碼(結合註釋食用即可)


import (

"context"

pb "github.com/CodeFish-xiao/blogs/gRPCAction/code/grpc-2/pb"

"google.golang.org/grpc"

"log"

"net"

)

// HelloService 定義我們的服務

type  HelloService  struct {

}

// SayHello 實現SayHello方法

func (s *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResp, error) {

log.Println(req.Name)

return &pb.HelloResp{Message: "hello ,I'm codefish "},nil

}

const (

// Address 監聽地址

Address string = ":8000"

// Network 網路通訊協議

Network string = "tcp"

)

func  main() {

// 監聽本地埠

listener, err := net.Listen(Network, Address)

if err != nil {

log.Panic("net.Listen err: %v", err)

}

log.Println(Address + " net.Listing...")

// 新建gRPC伺服器例項

grpcServer := grpc.NewServer()

// 在gRPC伺服器註冊我們的服務

pb.RegisterHelloServer(grpcServer,&HelloService{})

//用伺服器 Serve() 方法以及我們的埠資訊區實現阻塞等待,直到程式被殺死或者 Stop() 被呼叫

err = grpcServer.Serve(listener)

if err != nil {

log.Panic("grpcServer.Serve err: %v", err)

}

}

執行客戶端可見:

hSIfv8.png

這就是執行成功了

2.2.4 編寫客戶端程式碼

接下來編寫客戶端程式碼:結合註釋食用:


import (

"context"

pb "github.com/CodeFish-xiao/blogs/gRPCAction/code/grpc-2/pb"

"google.golang.org/grpc"

"log"

)

const (

// ServerAddress 連線地址

ServerAddress string = ":8000"

)

func  main() {

// 連線伺服器

conn, err := grpc.Dial(ServerAddress, grpc.WithInsecure())

if err != nil {

log.Fatalf("net.Connect err: %v", err)

}

defer conn.Close()

// 建立gRPC連線

grpcClient := pb.NewHelloClient(conn)

// 建立傳送結構體

req := pb.HelloRequest{

Name: "grpc",

}

// 呼叫我們的服務(SayHello方法)

// 同時傳入了一個 context.Context ,在有需要時可以讓我們改變RPC的行為,比如超時/取消一個正在執行的RPC

res, err := grpcClient.SayHello(context.Background(), &req)

if err != nil {

log.Fatalf("Call SayHello err: %v", err)

}

// 列印返回值

log.Println(res)

}

執行後可見:

hSo3xf.png

並且在server的控制檯可以看到列印的引數:

hSo0Gq.png

總結

這樣子便可以搭建一個簡單的gRPC服務了,可以讓客戶端和服務端進行簡單的業務互動了,當然這才剛剛開始。。。

本章程式碼可見codefish的github

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章