そのような構成では gRPC は機能しないようです。最小限の動作しない例:
プロトブフの仕様:
// 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)