做一個處理用戶信息的微服務
客戶端通過用戶名,可以從服務端查詢用戶的基本信息
gRPC proto user.proto 定義客戶端請求、服務端響應的數據格式 user.pb.go 自動生成的,為數據交互提供的函數 server.go 微服務服務端 client.go 微服務客戶端
1. 編寫proto文件
// 版本號 syntax = "proto3"; // 指定生成 user.pb.go的包名 package proto; // 定義客戶端請求的數據格式 message UserRequest{ // 定義請求參數 string name = 1; } // 定義服務端相應的額數據格式 message UserResponse{ //定義響應參數 int32 id = 1; string name = 2; int32 age = 3; // 字段修飾符 // repeated表示可變數組,類似於切片類型 repeated string hobby = 4; } // 相當於接口 // service 定義開放調用的額服務 service UserInfoService{ //相當於接口內的方法 // 定義請求參數為UserRequest,響應參數為UserResponse rpc GetUserInfo(UserRequest) returns (UserResponse){} }
2. 生成.go文件
- pycharm 中打開命令行,輸入命令生成接口文件:
protoc -I . --go_out=plugins=grpc:. ./user.proto
3.編寫服務端
package main import ( "context" "fmt" pb "go-micro/my-micro/gRPC/proto" "google.golang.org/grpc" "net" ) // 定義服務端實現約定的接口 type UserInfoService struct { } var u = UserInfoService{} // 實現服務端需要首先的接口 func (s *UserInfoService) GetUserInfo(ctx context.Context, req *pb.UserRequest) (resp *pb.UserResponse, err error) { name := req.Name // 在數據庫查用戶信息 if name == "zhangsan" { resp = &pb.UserResponse{ Id: 1, Name: name, Age: 22, //切片字段 Hobby: []string{"Sing", "run", "basketball"}, } } err = nil return } func main() { // 1. 監聽 addr := "127.0.0.1:8080" lis, err := net.Listen("tcp", addr) if err != nil { fmt.Printf("監聽異常:%s\n", err) } fmt.Printf("開始監聽:%s\n", addr) // 2.實例化gRPC s := grpc.NewServer() // 3.在gRPC上注冊微服務 // 第二個參數類型需要接口類型的變量 pb.RegisterUserInfoServiceServer(s,&u) // 4.啟動gRPC服務 s.Serve(lis) }
4. 編寫客戶端
package main import ( "context" "fmt" pb "go-micro/my-micro/gRPC/proto" "google.golang.org/grpc" ) func main() { // 1. 創建與gRPC服務端的連接 conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure()) if err != nil { fmt.Printf("連接異常:%s\n", err) } defer conn.Close() // 2. 實例化gRPC客戶端 client := pb.NewUserInfoServiceClient(conn) // 3. 組裝參數 req := new(pb.UserRequest) req.Name = "zhangsan" // 4. 調用接口 resp, err := client.GetUserInfo(context.Background(), req) if err != nil { fmt.Printf("響應異常:%s\n", err) } fmt.Printf("響應結果: %v\n", resp) }