[RUBY] Einführung des gRPC-Clients in Schienen

Hintergrund

Die Implementierung des für PM zuständigen Produkts (Rails) im Unternehmen muss Informationen von anderen Diensten abrufen. Da dieser Dienst nicht OpenAPI war, sondern die API-Schnittstelle von gRPC definiert wurde, implementieren Sie den gRPC-Client Hat. Da ich mich in meinem vorherigen Job ein wenig mit gRPC in Schienen beschäftigt habe, dachte ich, dass dies den Entwicklungsaufwand des Teams relativ erhöhen würde, wenn ich es tun würde, also entschied ich mich, es selbst zu tun. Die Ausgabe darüber.

Montagevorgang

1. Edelstein vorstellen

Gemfile



gem "google-protobuf" 
gem "grpc-tools"
gem "gruf"
docker-compose run --rm web bundle install
2. Registrieren Sie das Repository, in dem die Protodatei verwaltet wird, als Unterverzeichnis der Anwendung mit dem Submodul und rufen Sie die Protodatei aus dem ursprünglichen Repository ab.
$ git submodule add [web URL or ssh key] proto
$ git submodule init
$ cd proto
$ git submodule update
3. Kompilieren Sie die Protodatei in eine Ruby-Datei
docker-compose run --rm web grpc_tools_ruby_protoc -I [Proto-Verzeichnis, das kompiliert werden soll] --ruby_out=[Verzeichnis, in dem Dateien nach dem Kompilieren gespeichert werden] --grpc_out=[Verzeichnis, in dem Dateien nach dem Kompilieren gespeichert werden] [Proto-Verzeichnis, das kompiliert werden soll内の対象ファイル]
4. Lesen Sie die Einstellungen für die kompilierte Ruby-Datei (* _pb.rb).

Nach dem Kompilieren greifen der Dateiname und der Klassenname nicht ineinander und folgen nicht den Rails-Laderegeln und werden nicht automatisch geladen. Sie müssen sie daher angeben.

config/initializers/gruf.rb


require "gruf"

Gruf.configure do
  Dir.glob(Rails.root.join("[Verzeichnis, in dem Dateien nach dem Kompilieren gespeichert werden]/*_pb.rb")).each do |file|
    require file
  end
end

In der kompilierten Datei wird sie automatisch wie unten gezeigt angegeben und muss zu "auto_load_path" hinzugefügt werden. Aus z. B. gruf-demo require 'Products_pb'

config/application.rb


  class Application < Rails::Application
    config.paths.add [Ruby-Dateiverzeichnis nach der Kompilierung], eager_load: true
  end
5. Implementierung des Teils, in dem der Client den Server aufruft

Zu diesem Zeitpunkt sind alle kompilierten Ruby-Dateien für die Client-Implementierung verfügbar.

Ich war besorgt darüber, ob ich ein Modul verwenden sollte, aber in der vorhandenen Implementierung war die clientbezogene Verarbeitung in die Service-Schicht integriert, sodass ich mich entschied, diesmal auch diesem zu folgen.

app/services/grpc_client_service.rb



class GrpcClientService
  def initialize
    @metadata = {
      login: ENV["GRPC_CLIENT"],
      password: ENV["GRPC_PASSWORD"]
    }
  end

  def run(service_klass, method, request)
    client = Gruf::Client.new(
      service: service_klass,
      options: {
        hostname: ENV["GRPC_HOST"],
        channel_credentials: :this_channel_is_insecure
      }
    )

    client.call(method, request.to_h, @metadata)
  end
end

Eindrücke von der Einführung

Ich habe Gruf in meinem vorherigen Job verwendet, also dachte ich, ich könnte es mir leisten, aber ich dachte, es wäre ganz anders, als es nur zu benutzen. Ich bedauere, dass ich den Code um die Einstellungen hätte lesen sollen.

Auch dieses Mal wurde der gRPC-Server in go geschrieben, und als der Anruf vom Client nicht gut lief, fiel es mir schwer, den Code zu lesen, und ich gab schließlich auf, also wollte ich auch go lernen.

Außerdem blieb ich ein wenig stecken, weil ich falsch verstanden habe, dass ich zum Zeitpunkt der Client-Initialisierung "Metadaten" ("Gruf :: Client.new") eingegeben habe (eigentlich habe ich sie in das Argument beim Aufruf eingefügt), also habe ich sie in das Bibliotheks-Wiki geschrieben Immerhin wurde mir wieder klar, dass es eine rudimentäre Sache ist, den Code fest zu lesen.

Recommended Posts

Einführung des gRPC-Clients in Schienen
Rails6 jQuery eingeführt
Einführung von Vue.js in eine vorhandene Rails-App
Verwendung von credentials.yml.enc aus Rails 5.2
Einführung von Vuetify in vorhandene Rails-Apps
Wie schreibe ich Rails
Einführung in Bootstrap in Rails 5
Bootstrap in Rails einführen !!
Einführung von Vue.js in Rails
[Rails] Verwendung von Enum
Wie man Schienenrouten liest
Verwendung von Rails Join
[Schienen] Spalte zum Entwickeln hinzufügen
Einführung von Dozer to Play Framework
So beenden Sie den Rails-Server
Wie schreibe ich Rails Seed
[Schienen] So deaktivieren Sie Turbolinks
[Rails] So verwenden Sie authenticate_user!
[Rails] So implementieren Sie Scraping
[Schienen] Wie man Samen macht
Wie schreibe ich Rails Routing
[Rails] So installieren Sie simple_calendar
[Rails] So installieren Sie reCAPTCHA
[Schienen] Verwendung von Scope
[Rails] Wie man Edelstein "devise" benutzt
[Schienen] Verwendung von Geräten (Hinweis)
[Rails] Zwei Möglichkeiten, form_with zu schreiben
[Rails] Verwendung von Flash-Nachrichten
[Rails] Anzeigen von Datenbankinformationen
Vorbereiten der Erstellung einer Rails-Anwendung
[Rails] Lernen Sie Ausbeute, um content_for zu verstehen
Stoppen Sie das erneute Senden vom Client zum Server
Einführung des vollständigen Kalenders in die Rails-Anwendung
[Schienen] So verhindern Sie den Bildschirmübergang
[Rails] Verschiedene Möglichkeiten zum Löschen von Daten
Verwendung von Ruby on Rails
[Schienen] Einfache Möglichkeit, Spalten zu überprüfen
So stellen Sie Bootstrap auf Rails bereit
Bis zur Einführung von Schriftarten in Rails
[Rails] So beschleunigen Sie das Docker-Compose
[Schienen] So fügen Sie neue Seiten hinzu
Implementieren Sie den gRPC-Client in Ruby
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
[Rails] So installieren Sie Font Awesome
[Rails] Verwendung von Active Storage
[Schienen] Fügen Sie starke Parameter hinzu, um sie zu entwickeln
So installieren Sie jQuery in Rails 6
[Rails] So implementieren Sie die Sternebewertung
Stellen Sie mit dem iPhone eine Verbindung zum Rails-Server her