# grpc_demo **Repository Path**: xiaokang69/grpc_demo ## Basic Information - **Project Name**: grpc_demo - **Description**: 学习使用Gprc的小例子 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-13 - **Last Updated**: 2022-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # grpc_demo #### 介绍 这是一个grpc使用的小demo , 代码都在里面了, 看看就会了. 我是在window平台开发的 里面的坑点就是 `require_unimplemented_servers=false` 这个了,下面有介绍到. 文件目录 ``` F:. │ Gen_proto.bat │ go.mod │ go.sum │ ├─client │ client.go │ ├─pb │ user.pb.go │ user.proto │ user_grpc.pb.go │ └─server server.go ``` 定义proto文件 ```golang syntax="proto3"; package pb; option go_package = ".;pb"; message UserRequest{ string name = 1; } message UserResponse{ int32 id = 1; string name = 2; int32 age =3; repeated string hobby = 4; } message TaskRequest{ string name = 1; } service UserInfoService{ rpc GetUserInfo (UserRequest) returns (UserResponse){} rpc GetTaskInfo (TaskRequest) returns (UserResponse){} } ``` 执行生成proto的命令 ``` protoc --go_out=.\pb .\pb\user.proto protoc --go-grpc_out=require_unimplemented_servers=false:.\pb .\pb\user.proto ``` > 不加 require_unimplemented_servers=false 会多生成 mustEmbedUnimplementedUserInfoServiceServer ``` type UserInfoServiceServer interface { GetUserInfo(context.Context, *UserRequest) (*UserResponse, error) GetTaskInfo(context.Context, *TaskRequest) (*UserResponse, error) mustEmbedUnimplementedUserInfoServiceServer() } ``` Server端代码 ```golang package main import ( "context" "demo-grpc/pb" "fmt" "log" "net" "google.golang.org/grpc" ) type UserInfoService struct { } var u = UserInfoService{} func (s *UserInfoService) GetUserInfo(ctx context.Context, req *pb.UserRequest) (resp *pb.UserResponse, err error) { name := req.Name resp = &pb.UserResponse{ Name: fmt.Sprintf("UserReq %v ", name), } err = nil return } func (s *UserInfoService) GetTaskInfo(ctx context.Context, req *pb.TaskRequest) (resp *pb.UserResponse, err error) { name := req.Name resp = &pb.UserResponse{ Name: fmt.Sprintf("TaskReq %v ", name), } err = nil return } func main() { addr := "127.0.0.1:8080" lis, err := net.Listen("tcp", addr) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() // b = pb.ProtoServiceServer{} pb.RegisterUserInfoServiceServer(s, &u) s.Serve(lis) } ``` Client 端代码 ```golang package main import ( "context" "demo-grpc/pb" "fmt" "log" "google.golang.org/grpc" ) func main() { serverAddr := "127.0.0.1:8080" // var opts []grpc.DialOption conn, err := grpc.Dial(serverAddr, grpc.WithInsecure()) if err != nil { log.Fatalf("fail to dial: %v", err) } defer conn.Close() client := pb.NewUserInfoServiceClient(conn) req := new(pb.UserRequest) req.Name = "User_Info" resp, err := client.GetUserInfo(context.Background(), req) if err != nil { fmt.Printf("GetUserInfo err %v", err) } fmt.Printf("UserInfo %v \n", resp.Name) req2 := &pb.TaskRequest{ Name: "Task", } resp, err = client.GetTaskInfo(context.Background(), req2) if err != nil { fmt.Printf("GetTaskInfo err %v", err) } fmt.Printf("TaskInfo %v \n", resp.Name) } ```