我一直在尝试在Go中创建grpc客户端,并且遵循了官方grpc网站上显示的正确说明。当我启动用node.js编写的grpc服务器时,连接工作良好,但是在Go中编译协议缓冲区并使用正确的grpc客户端配置创建客户端接口后,我遇到了错误。
这是我在identity.pb.go
中拥有的东西。
type IdentityServiceClient interface {
CreateUser(ctx context.Context, in *GoogleIdToken, opts ...grpc.CallOption) (error, *UserInfo)
}
type simpleServerClient struct {
connection *grpc.ClientConn
}
func NewSimpleServerClient(connection *grpc.ClientConn) IdentityServiceClient {
return &simpleServerClient{connection}
}
func (simpleClient *simpleServerClient) CreateUser(ctx context.Context, in *GoogleIdToken, opts ...grpc.CallOption) (error, *UserInfo) {
out := new(UserInfo)
err := simpleClient.connection.Invoke(ctx, "/protobuf.IdentityService/CreateUser", in, out, opts...)
if err != nil {
return err, nil
}
return nil, out
}
这是identity.proto
syntax="proto3";
package protobuf;
service IdentityService {
rpc CreateUser (GoogleIdToken) returns (UserInfo) {}
}
message GoogleIdToken {
string token = 1;
}
message UserInfo {
string name = 1;
string email = 2;
message Profile {
string imageUrl = 1;
string lastUpdated = 2;
};
Profile profile = 3;
string token = 4;
}
这是我的main.go
import pb "github.com/Duncanian/iam-gateway/server/protobuf"
func grpcConnection() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("Failed to start gRPC connection: %v", err)
}
defer conn.Close()
client := pb.NewSimpleServerClient(conn)
err, _ = client.CreateUser(context.Background(), &pb.GoogleIdToken{Token: "tevgvybububvvg"})
if err != nil {
log.Fatalf("Failed to create user: %v", err)
}
log.Println("Created user!")
}
我希望传递正确的google auth令牌的输出能够为我获取正确的用户详细信息
name: user,
email: user.email@user.com,
profile: {
imageUrl: myimageUrl,
lastUpdated: mylastUpdatedTime,
},
token,
但是得到了
rpc error: code = Unimplemented desc = RPC method not implemented /protobuf.IdentityService/CreateUser
这是我的github仓库: Go grpc client& Node JS grpc server
答案 0 :(得分:1)
我遇到了同样的问题。
这是我的解决方案:
编译 .proto
后,我创建了 2 个文件:client.go
和 server.go
。
在 client.go
中,我实现了我的方法(就 protobuffers 而言是 rpc)并有一个 main
函数。
在 server.go
中,我定义了一个服务器结构 server
,其中包含一个字段:Unimplemented*ServiceName*Server
。之后我也实现了上面提到的方法,但那些有一个接收器类型:func (s *server) Foo(ctx context.Context, *other params*)
这对我有用,希望能帮到你!
答案 1 :(得分:0)
该错误表明/protobuf.IdentityService/CreateUser
方法未在服务器端注册。而且在您链接的服务器代码中没有看到任何服务注册代码。请看一下node.js指南here。
答案 2 :(得分:0)
使用grpc的GUI尝试将您的原型发送到两个服务器,并检查即将出现的错误/正确的端点。
在我的情况下,java proto内有一个软件包,该软件包已添加到端点。
有//package com.example.grpc;
代替
option java_package = "com.example.grpc";