1.需要保證電腦中安裝了protobuf安裝教程 2.如果出現報錯請看博客protobuf報錯問題解決 3.demo地址:demo 簡介: rpc微服務,grpc是一種開源的高性能RPC框架,能夠運行在任何環境中,最初由谷歌進行開發,它使用HTTP2作為傳輸協議。grpc讓客戶端可以像調用本地方法一 ...
1.需要保證電腦中安裝了protobuf安裝教程
2.如果出現報錯請看博客protobuf報錯問題解決
3.demo地址:demo
簡介:
rpc微服務,grpc是一種開源的高性能RPC框架,能夠運行在任何環境中,最初由谷歌進行開發,它使用HTTP2作為傳輸協議。grpc讓客戶端可以像調用本地方法一樣調用其他伺服器上的服務應用程式,可以更容易的創建分散式應用程式和服務。能讓我們更容易的編寫跨語言的分散式代碼。本示例使用protocol buffers(簡寫:protobuf),使用protobuf可以高效的序列化,簡單的IDL(介面描述語言)並且容易進行介面更新。
一、安裝gRPC
-
安裝grpc執行命令
go get google.golang.org/grpc@latest
-
安裝Protocol Buffers v3
安裝方法就是文章開頭1的protobuf鏈接
-
安裝插件
安裝go語言插件,這個插件會根據.proto文件生成一個尾碼為.pb.go的文件:
該文件文件中包含定義的類型及其序列化方法go install google.golang.org/protobuf/cmd/[email protected]
安裝grpc插件,這個插件會生成_grpc.pb.go尾碼的文件:
該文件中包含介面類型(或存根),提供給客戶端調用的服務方法;伺服器需要實現的介面類型go install google.golang.org/grpc/cmd/[email protected]
-
預設將插件安裝到
$GOPATH/bin
路徑下,具體配置在文章開頭第1條安裝方式博客中已經寫好
二、基本使用
-
按照博客寫完demo後的目錄結構:
user@C02FP58GML7H grpc-demo-master % tree . ├── LICENSE ├── README.en.md ├── README.md ├── client │ ├── grpc_client.go │ └── pb │ ├── product.pb.go │ └── product_grpc.pb.go ├── go.mod ├── go.sum ├── grpc_server.go ├── pb │ ├── product.pb.go │ └── product_grpc.pb.go ├── pbfile │ └── product.proto └── service └── product.go
-
創建proto文件
-
創建一個名為project-demo的go項目
-
在project-demo目錄下創建文件夾pbfile
-
在pbfile目錄下創建文/定義文件product.proto
-
文件內容如下:
// 聲明protobuf版本 syntax = "proto3"; // option go_package = "path;name"; path 表示生成的go文件的存放地址,會自動生成目錄 // name表示生成的go文件所屬的包名 option go_package = "../pb"; package pb; // 請求體 message ProductRequest { int32 prod_id = 1; } // 響應體 message ProductResponse { int32 prod_stock =1; } // 定義服務體 service ProductService { // 定義方法 rpc GetProductStock(ProductRequest) returns (ProductResponse) {} }
-
-
在控制台生成pb文件夾,文件夾中.pb.go和_grpc.pb.go文件
- 切換到pbfile目錄下:cd pbfile(demo鏈接在博客頭部,此事例按照demo上面顯示的進行講解)
- 需要執行命令:
protoc --go_out=./ --go_grpc=./ product.proto
- 項目下會自動生成pb文件夾和
product.pb.go
、product_grpc.pb.go
兩個文件 - 註:demo中的示例已經生成好,如有需要可刪除後自行操作,重新生成
-
創建服務端
-
在project-demo下創建service文件夾
-
在service下創建product.go文件,produc.go文件實現了product.protoc定義的介面
-
product.go文件代碼:
package service import ( "context" "projectbao/pb" ) var ProductService = &productService{} type productService struct { pb.UnimplementedProductServiceServer } func (p *productService) GetProductStock(context context.Context, request *pb.ProductRequest) (*pb.ProductResponse, error) { stock := p.GetStockById(request.ProdId) return &pb.ProductResponse{ProdStock: stock}, nil } func (p *productService) GetStockById(id int32) int32 { return id }
-
在project-demo下創建grpc_server.go文件,註冊/創建grpc服務
-
grpc_server.go文件代碼:
package main import ( "fmt" "log" "net" "projectbao/pb" "projectbao/service" "google.golang.org/grpc" ) func main() { rpcServer := grpc.NewServer() pb.RegisterProductServiceServer(rpcServer, service.ProductService) listion, err := net.Listen("tcp", ":8002") if err != nil { log.Fatal("啟動監聽出錯", err) } err = rpcServer.Serve(listion) if err != nil { log.Fatal("啟動伺服器出錯", err) } fmt.Println("啟動grpc服務端成功") }
-
-
創建客戶端
-
在project-demo下創建client文件夾
-
把pb文件夾複製到client目錄下一份
-
在client文件夾下創建客戶端grpc_client.go文件
-
client.go文件代碼:
package main import ( "context" "fmt" "log" "projectbao/pb" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) func main() { conn, err := grpc.Dial(":8002", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal("服務端出錯", err) } defer conn.Close() prodClient := pb.NewProductServiceClient(conn) request := &pb.ProductRequest{ ProdId: 100, } stockReponse, err := prodClient.GetProductStock(context.Background(), request) if err != nil { log.Fatal("查詢庫存出錯", err) } fmt.Println("查詢成功", stockReponse) }
-
-
運行
-
終端切換到項目目錄下執行:
go run grpc_server.go
啟動服務端 -
另啟終端並切換到項目下的client目錄下執行:
go run grpc_client.go
啟動客戶端,結果示例:user@C02FP58GML7H client % go run grpc_client.go 查詢成功 prod_stock:100
-
也可以通過go build生成二進位的可執行文件來操作
-