gRPC基础问题与解决办法

首先,gRPC在获取相应的包等第三方引用库的时候会遇到被墙的情况,这时候可以使用很多网上放出来的github的地址然后直接使用git获取到本地的goPath上。但是由于很多包的引用名不是在github下的,那么虽然从github获取了也必须放在src里,并且创建对应的文件夹。
【gRPC基础问题与解决办法】例如:

import ( "google.golang.org/grpc" "golang.org/x/net/context" pb "grpcstudy3/model" "fmt" "net" "log" )

这里面前两个包都是被墙了,引用的时候需要从github上获取,但是获取后还必须在本地创建对应的文件夹,即在src里面创建google.golang.org的文件夹,然后把github上获取的复制到该文件夹下。golang.org与此一样。 其次,在windows上使用protobuf时,需要使用protoc吧proto文件编译成go文件格式,但是在使用命令时经常会犯错,如果使用protoc --go_out=. user.proto 那么就会导致一些方法无法创建,例如注册的方法就无法创建。目前可以正常创建的命令是

protoc --go_out=plugins=grpc:. helloworld.proto


具体的命令使用方法可以自行百度protoc命令的使用。 第三,在proto文件中定义的service中所有的rpc方法都需要进行实现,如果不实现就无法使用。例如

type user struct{} func (ss *user) CreateUser(ctx context.Context,in *pb.User)(*pb.ResultResponse,error){ fmt.Println("get client name is ",in.Name) return &pb.ResultResponse{1222},nil } func (ss *user) DeleteUser(ctx context.Context,in *pb.User)(*pb.ResultResponse,error){ fmt.Println("get client name is ",in.Name) return &pb.ResultResponse{1222},nil } func (ss *user) GetUserInfo(ctx context.Context,in *pb.User)(*pb.User,error){ fmt.Println("get client name is ",in.Name) return &pb.User{Uid:"1099",Name:"nxin"},nil }

这里面user是结构体类型,他有三个方法,然而这三个方法都是在proto文件中定义好的,
service UserService{ rpc CreateUser(User) returns (ResultResponse){}; rpc GetUserInfo(User) returns (User){}; rpc DeleteUser(User) returns (ResultResponse){}; }

如果没有完全实现其方法就会出现以下问题。
func main(){ lis,err:=net.Listen("tcp",port) if err!=nil{ log.Fatal("failed to listen ",err) } s:=grpc.NewServer() pb.RegisterUserServiceServer(s,&user{}) s.Serve(lis) }

src\main\server.go:34:39: cannot use user literal (type *user) as type model.UserServiceServer in argument to model.RegisterUserServiceServer: *user does not implement model.UserServiceServer (missing GetUserInfo method)



目前grpc还在摸索中,接下来遇到问题还会更新。






    推荐阅读