gRPC基础问题与解决办法

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

例如:

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还在摸索中,接下来遇到问题还会更新。




你可能感兴趣的:(Golang)