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生成二進制的可執行檔案來操作
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511016.html
標籤:其他
