[RAILS] Implementieren Sie den gRPC-Client in Ruby

Notieren Sie sich zur Erinnerung das Verfahren zum Implementieren des gRPC-Clients in Ruby.

Setzen Sie zuerst den Edelstein ein

gem 'grpc', '~> X.XX.X'

Abrufen und Kompilieren von .proto-Dateien

$ gem install grpc-tools
$ grpc_tools_ruby_protoc -I ./proto \--ruby_out=lib --grpc_out=lib ./proto/hoge_proto/*.proto

Implementierung des Client-Stubs

Nachdem 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.

Rufen Sie tatsächlich den gRPC-Server an

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.

Informationen zur Fehlerbehandlung

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

Implementieren Sie den gRPC-Client in Ruby
Multiplikation innerhalb eines Ruby-Arrays
3 Implementieren Sie einen einfachen Interpreter in Java
Versuchen Sie, Yuma in Ruby zu implementieren
Implementieren Sie ein Kontaktformular in Rails
Ich habe ein Kalenderproblem mit Ruby versucht
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Implementieren Sie den Algorithmus in Ruby: Tag 1 - Europäische gegenseitige Teilung -
Implementieren Sie so etwas wie einen Stack in Java
Tipps zur Behandlung von gRPC-Fehlern in Ruby
Schwer in Rubin! ??
Escape-Verarbeitung beim Erstellen einer URL in Ruby
Implementieren Sie den Algorithmus in Ruby: Tag 3-Dichotomie-
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
So implementieren Sie eine ähnliche Funktion in Rails
Implementieren Sie den Algorithmus in Ruby: Tag 4 - Lineare Suche
(Ruby on Rails6) Erstellen von Daten in einer Tabelle
So implementieren Sie Paginierung in GraphQL (für Ruby)
Implementieren Sie den Algorithmus in Ruby: Tag 2 - Blasensortierung -
So implementieren Sie eine nette Funktion in Ajax mit Rails
Implementieren Sie eine mehrspaltige IN-Klausel (Spalte: Bedingung = n: n) in DOMA.
Berechnen Sie die Differenz zwischen Zahlen in einem Ruby-Array
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Was mich als Anfänger beim Schreiben von Ruby beeindruckt hat
So starten Sie einen anderen Befehl in einem Ruby-Programm
Ich habe im Frühjahr einen Restful-Server und -Client erstellt.
Implementieren Sie Singleton mit Enum schnell in Java
Ausgabedreieck in Ruby
Implementieren Sie CustomView im Code
[Vollständige Programmierung] §5 Erstellen Sie eine Überprüfungsverwaltungs-App in Ruby
Arten von Variablen in Ruby
Schneller Popcount in Ruby
Markdown in Rails implementiert
Aktualisieren Sie Ihre Java-Kenntnisse, indem Sie einen gRPC-Server in Java schreiben (2).
Schwierigkeiten beim Erstellen einer Ruby on Rails-Umgebung (Windows 10) (SQLite3)
So ändern Sie eine Zeichenfolge in einem Array in eine Zahl in Ruby
Aktualisieren Sie Ihre Java-Kenntnisse, indem Sie einen gRPC-Server in Java schreiben (1)
Ich habe mit Gem in Ruby nach einem Webframework gesucht
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe einen RESAS-API-Client in Java erstellt
Wenden Sie CSS auf eine bestimmte Ansicht in Ruby on Rails an
Ich habe einen C-Parser (wie) mit PEG in Ruby geschrieben
Implementieren Sie die Anwendungsfunktion in Rails
ABC177 - E in Ruby lösen
Überprüfen Sie JWT-Token in Ruby
Was ist ein Ruby-Modul?
GraphQL Client beginnend mit Ruby