将 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); }
包名最好指定,一般来说,可以防止名称冲突。
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); }
包名最好指定,一般来说,可以防止名称冲突。