2

そのような構成では 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)

4

1 に答える 1

3

エラー メッセージのサービス「.A」は、.proto で空のパッケージ名を使用した場合のバグを意味する可能性が最も高いです。私はそれについて問題を提起しました。

ただし、回避策は簡単です。proto ファイルで「package」を指定するだけです。

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

一般に、名前の衝突を防ぐために、パッケージ名を指定することをお勧めします。

于 2016-01-31T17:25:06.777 に答える