2.1 gRPC環境安裝
2.1.1 golang環境安裝
接下來的所有的教程以及程式碼都是golang程式碼進行演示,所以我們需要安裝golang環境:
下載地址:golang 官網
安裝完在你的命令列工具輸入
go version
就可以看到對應的下載版本
然後就可以了。
2.1.2 protoc 安裝
在 gRPC 開發中,我們常常需要與 Protobuf 進行打交道,而在編寫了.proto 檔案後,我們會需要到一個編譯器,就是protoc。這個工具呢可以在GitHub上直接下載
github.com/protocolbuffers/protobu...
大家可以在這個網站自行下載安裝(因為之前這裡安裝完了,也不想重灌了,可能記得不太清了,你們直接試一試就好了,等下次重灌再豐富這裡)
一般操作是把protoc編譯檔案所在的目錄配到環境變數裡就好了
安裝完後:
執行
protoc –version
就可以看見版本資訊了
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檔案
在編譯檔案前,我們先搭建一個最簡單的專案目錄,用來具體演示相關操作:
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)
}
}
執行客戶端可見:
這就是執行成功了
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)
}
執行後可見:
並且在server的控制檯可以看到列印的引數:
總結
這樣子便可以搭建一個簡單的gRPC服務了,可以讓客戶端和服務端進行簡單的業務互動了,當然這才剛剛開始。。。
本章程式碼可見codefish的github
本作品採用《CC 協議》,轉載必須註明作者和本文連結