首先,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还在摸索中,接下来遇到问题还会更新。
推荐阅读
- 【golang】leetcode中级-字母异位词分组&无重复字符的最长子串
- 彻底理解Golang Map
- kratos线上开源年会它来啦~
- 深入浅出 Golang 资源嵌入方案(go-bindata篇)
- 深入浅出 Golang 资源嵌入方案(前篇)
- golang 经典案例总结
- Go实战 | 基于有向无环图的并发执行流的实现
- Golang 数组和切片
- Go JSON编码与解码()
- golang map基础知识