3

我一直在尝试在 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!")
}

我希望传递正确的谷歌身份验证令牌的输出可以让我得到正确的用户详细信息

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 客户端Node JS grpc 服务器

4

3 回答 3

1

我有同样的问题。

这是我的解决方案:编译后.proto我创建了 2 个文件:client.goserver.go.

client.go我实现了我的方法(就 protobuffers 而言的 rpc)并有一个main函数。

server.go我定义了一个server带有一个字段的服务器结构:Unimplemented*ServiceName*Server. 之后我也实现了上面提到的方法,但是它们有一个接收器类型:func (s *server) Foo(ctx context.Context, *other params*)

这对我有用,希望它会帮助你!

于 2021-02-03T20:32:15.667 回答
1

该错误表明该/protobuf.IdentityService/CreateUser方法未在服务器端注册。而且我在您的链接服务器代码中没有看到任何服务注册代码。请在此处查看 node.js 指南。

于 2019-05-08T18:24:15.703 回答
0

使用 grpc 的 GUI 尝试将您的原型发送到您的两台服务器并检查即将出现的错误/正确的端点。

在我的例子中,java proto 里面有一个包,它被添加到端点。
package com.example.grpc; 而不是 option java_package = "com.example.grpc";

于 2019-12-20T11:28:20.227 回答