[RUBY] Présentation du client gRPC aux rails

Contexte

La mise en œuvre du produit (Rails) qui est en charge du PM dans l'entreprise doit obtenir des informations d'autres services, et comme ce service n'était pas OpenAPI mais que l'interface API a été définie par gRPC, implémentez le client gRPC Fait. Comme je touchais un peu au gRPC dans les rails dans mon travail précédent, je pensais que cela augmenterait relativement l'effort de développement de l'équipe si je le faisais, alors j'ai décidé de le faire moi-même. La sortie à ce sujet.

Procédure de montage

1. Présentation de gemme

Gemfile



gem "google-protobuf" 
gem "grpc-tools"
gem "gruf"
docker-compose run --rm web bundle install
2. Enregistrez le référentiel dans lequel le fichier proto est géré en tant que sous-répertoire de l'application avec le sous-module, et récupérez le fichier proto dans le référentiel d'origine.
$ git submodule add [web URL or ssh key] proto
$ git submodule init
$ cd proto
$ git submodule update
3. Compilez le fichier proto dans un fichier ruby
docker-compose run --rm web grpc_tools_ruby_protoc -I [Répertoire Proto à compiler] --ruby_out=[Répertoire dans lequel les fichiers sont enregistrés après la compilation] --grpc_out=[Répertoire dans lequel les fichiers sont enregistrés après la compilation] [Répertoire Proto à compiler内の対象ファイル]
4. Lisez les paramètres du fichier ruby compilé (* _pb.rb)

Après la compilation, le nom du fichier et le nom de la classe ne se mesurent pas l'un à l'autre, il ne suit pas les règles de chargement de Rails et n'est pas automatiquement chargé, vous devez donc le spécifier.

config/initializers/gruf.rb


require "gruf"

Gruf.configure do
  Dir.glob(Rails.root.join("[Répertoire dans lequel les fichiers sont enregistrés après la compilation]/*_pb.rb")).each do |file|
    require file
  end
end

Dans le fichier compilé, il est automatiquement spécifié comme indiqué ci-dessous, et il est nécessaire de l'ajouter à ʻauto_load_path. Par exemple, [gruf-demo](https://github.com/bigcommerce/gruf-demo/blob/master/app/rpc/app/proto/Products_services_pb.rb) require 'Products_pb'`

config/application.rb


  class Application < Rails::Application
    config.paths.add [Répertoire de fichiers Ruby après compilation], eager_load: true
  end
5. Implémentation de la partie où le client appelle le serveur

À ce stade, tous les fichiers ruby compilés sont désormais disponibles pour l'implémentation client.

J'étais inquiet de savoir s'il fallait utiliser un module, mais dans l'implémentation existante, le traitement lié au client était intégré dans la couche de service, j'ai donc décidé de le suivre cette fois également.

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

Impressions de son introduction

J'ai utilisé gruf dans mon travail précédent, alors je pensais que je pouvais me le permettre, mais je pensais que ce serait très différent de simplement l'utiliser. Je regrette d'avoir dû lire le code autour des paramètres.

De plus, cette fois, le serveur gRPC a été écrit en go, et lorsque l'appel du client ne s'est pas bien passé, j'ai eu du mal à lire le code et j'ai finalement abandonné, donc j'ai voulu étudier go aussi.

De plus, je suis resté un peu coincé parce que j'avais mal compris que j'avais mis metadata au moment de l'initialisation du client ( Gruf :: Client.new) (en fait je l'ai mis dans l'argument à l'appel), donc je l'ai écrit dans la bibliothèque Wiki Après tout, j'ai réalisé une fois de plus que c'était une chose rudimentaire que je devais lire le code fermement.

Recommended Posts

Présentation du client gRPC aux rails
Rails6 jQuery introduit
Présentation de Vue.js à une application Rails existante
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
Introduction de Vuetify aux applications Rails existantes
Comment écrire des rails
Présentation de Bootstrap à Rails 5
Présentation de Bootstrap aux rails !!
Présentation de Vue.js à Rails
[Rails] Comment utiliser enum
Comment lire les itinéraires des rails
Comment utiliser la jonction de rails
[Rails] Ajouter une colonne à concevoir
Introduction de Dozer to Play Framework
Comment terminer le serveur de rails
Comment écrire des graines de Rails
[Rails] Comment désactiver les turbolinks
[Rails] Comment utiliser authenticate_user!
[Rails] Comment mettre en œuvre le scraping
[Rails] Comment faire des graines
Comment écrire le routage Rails
[Rails] Comment installer simple_calendar
[Rails] Comment installer reCAPTCHA
[Rails] Comment utiliser Scope
[Rails] Comment utiliser la "devise" des gemmes
[Rails] Comment utiliser l'appareil (Remarque)
[Rails] Deux façons d'écrire form_with
[Rails] Comment utiliser les messages flash
[rails] Comment afficher les informations de base de données
Préparation à la création de l'application Rails
[Rails] Apprenez le rendement pour comprendre content_for
Arrêter de renvoyer du client au serveur
Présentation du calendrier complet à l'application Rails
[Rails] Comment empêcher la transition d'écran
[Rails] Différentes façons de supprimer des données
Comment utiliser Ruby on Rails
[Rails] Un moyen simple de vérifier les colonnes
Comment déployer Bootstrap sur Rails
Jusqu'à l'introduction des polices dans Rails
[Rails] Comment accélérer la composition de docker
[Rails] Comment ajouter de nouvelles pages
Implémenter le client gRPC dans Ruby
[Rails] Comment écrire la gestion des exceptions?
[Rails] Comment installer Font Awesome
[Rails] Comment utiliser Active Storage
[Rails] Ajoutez des paramètres forts pour concevoir
Comment installer jQuery dans Rails 6
[Rails] Comment mettre en œuvre le classement par étoiles
Connectez-vous au serveur Rails avec iPhone