将 gRPC python 服务器与 ruby 客户端一起使用时出现问题

Troubles in using gRPC python server with ruby client

gRPC 在这样的配置中似乎不起作用。最小的不工作示例:

Protobuf 规范:

// a.proto
syntax = "proto3";
message M { string s = 1; }
service A {  rpc Serve(M) returns (M); }

生成存根

#!/bin/sh
#codegen.sh
protoc -I . --ruby_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_ruby_plugin` a.proto
protoc -I . --python_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_python_plugin` a.proto

服务器(以 helloworld 为例)

  #!/usr/bin/python
  #python_server.py
  import a_pb2 
  import time
  from grpc.beta import implementations
  class AServer(a_pb2.BetaAServicer):
    def Serve(self, request, context):
      return a_pb2.M(s = request.s)
  server = a_pb2.beta_create_A_server(AServer())
  server.add_insecure_port("localhost:666123")
  server.start()

Python 客户端(工作正常)

  #!/usr/bin/python
  #python_client.py
  from grpc.beta import implementations
  import a_pb2 
  channel = implementations.insecure_channel('localhost', 666123)
  stub = a_pb2.beta_create_A_stub(channel)
  req = a_pb2.M(s = "test".encode('utf-8'))
  response = stub.Serve(req, 10)
  print "got " + response.s

Ruby 客户端(似乎忽略服务器)

#!/usr/bin/env ruby
#ruby_client.rb
$LOAD_PATH.unshift '.'
require 'grpc'
require 'a_services'
stub = A::Stub.new('localhost:666123', :this_channel_is_insecure)
req = M.new(s: "test")
response = stub.serve(req)
puts("got #{response}")

Python 客户端按预期输出 "got test"。 Ruby 客户异常死亡

in `check_status': 12:Method "Serve" of service ".A" not implemented! (GRPC::BadStatus)

版本:gem list 输出 google-protobuf (3.0.0.alpha.3)grpc (0.12.0) pip list 输出 protobuf (3.0.0a3)grpcio (0.12.0b0)

错误消息中的服务“.A”很可能意味着这是在您的 .proto 中使用空包名称时出现的错误。我申请了an issue

虽然解决方法很简单;只需在原型文件中指定 'package':

// a.proto
syntax = "proto3";
package your.package.name;
message M { string s = 1; }
service A {  rpc Serve(M) returns (M); }

包名最好指定,一般来说,可以防止名称冲突。