Notieren Sie sich zur Erinnerung das Verfahren zum Implementieren des gRPC-Clients in Ruby.
grpc
gem, um gRPC in Ruby zu verwendengem 'grpc', '~> X.XX.X'
grpc_tools
, um .proto in eine rb-Datei zu kompilieren$ gem install grpc-tools
$ grpc_tools_ruby_protoc -I ./proto \--ruby_out=lib --grpc_out=lib ./proto/hoge_proto/*.proto
--ruby_out
an
――Es ist überall in Ordnung, aber es scheint, dass es viele / lib gibtNachdem die Vorbereitungen abgeschlossen sind, werden wir sie von hier aus tatsächlich umsetzen. Erstellen Sie zunächst die Stub-Instanz, die für den gRPC-Aufruf erforderlich ist. In Bezug auf die Erstellung von Stub-Instanzen sehe ich häufig die Methode zum Erstellen einer Datei unter / initializer und zum Erstellen einer neuen Datei dort, aber ich wollte mich nicht mit globalen Variablen befassen, also habe ich diesmal die Modellklasse ausgeschnitten und das Singleton-Muster angewendet. Implementiert in. Um ehrlich zu sein, suche ich hier immer noch nach den besten Praktiken.
model/grpc/hoge_service_client.rb
require 'proto/hoge_services_pb'
require 'singleton'
#Es ist besser, dies aus der Einstellungsdatei für jede Umgebung zu machen
END_POINT = "localhost:50051"
class Grpc::HogeServiceClient
include Singleton
attr_reader :stub
def initialize
@stub = HogeProto::HogeService::Stub.new(END_POINT, :this_channel_is_insecure)
end
end
--Für den oben erwähnten Teil der Stub-Instanzerstellung wird der in hoge_services_pb.rb beschriebene Stub als neue Instanz erstellt.
Versuchen Sie, rpc mit dem oben erstellten Stub aufzurufen
grpc/hoge.rb
class Grpc::Hoge
def get_name(params)
#Erstellen Sie eine Modellinstanz mit einer Stub-Instanz
client = Grpc::HogeServiceClient.instance
#Erstellen Sie Anforderungsdaten, die für den RPC-Aufruf erforderlich sind
req = get_name_request(params)
#Erstellen Sie bei Bedarf Metadaten
meta = Hash.new
meta["x-app-id"] = "hogeghoge"
meta["x-app-password"] = "fugafuga"
begin
#Hier rpc anrufen
client.stub.get_name(req, {metadata: meta})
res = "success"
rescue GRPC::BadStatus => ex
res = "error"
rescue ex
res = "unexpected error"
end
res
end
private
def get_name_request(params)
HogeProto::GetNameRequest.new(
id: params[:id]
)
end
--rpc wird im Teil von client.stub.get_name
aufgerufen
--Wenn das Ergebnis dieses Aufrufs ein Fehler ist (Status.Codes ist nicht OK), tritt eine Ausnahme auf. Fügen Sie sie daher in begin ein und retten Sie sie, wenn es sich um einen Fehler handelt.
meta
werden die Metadaten zum Zeitpunkt des gRPC-Aufrufs festgelegt.Wie bereits erwähnt, tritt eine Ausnahme der Klasse "GRPC :: BadStatus" auf, wenn ein RPC-Aufruf eine Fehlerstatusantwort zurückgibt. Daher ist es notwendig, immer mit der Rettung zu beginnen. Wenn die Serverseite mit gepackten error_details zurückkehrt, muss sie implementiert werden, um sie abzurufen. Referenz: https://www.rubydoc.info/gems/grpc/GRPC/BadStatus
Recommended Posts