[RAILS] Implémenter le client gRPC dans Ruby

Notez la procédure d'implémentation du client gRPC dans Ruby à titre de rappel.

Tout d'abord, insérez la gemme

--Installez la gemme grpc pour utiliser gRPC dans Ruby

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

Obtenir et compiler des fichiers .proto

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

--Spécifiez le répertoire dans lequel rechercher les fichiers .proto avec l'option -I --Spécifiez le répertoire de destination de sortie après la compilation avec l'option --ruby_out ――C'est bien n'importe où, mais il semble qu'il y en ait beaucoup / lib

Implémentation du stub client

Maintenant que les préparatifs sont terminés, nous allons le mettre en œuvre à partir d'ici. Tout d'abord, créez l'instance stub requise pour effectuer l'appel gRPC. En ce qui concerne la création d'instances de stub, je vois souvent la méthode de création d'un fichier sous / initializer et d'en créer un nouveau, mais je ne voulais pas creuser dans les variables globales, donc cette fois j'ai coupé la classe de modèle et appliqué le modèle singleton. Mis en œuvre en. Pour être honnête, je suis toujours à la recherche des meilleures pratiques ici.

model/grpc/hoge_service_client.rb


require 'proto/hoge_services_pb'
require 'singleton'

#Il est préférable de le faire à partir du fichier de configuration de chaque environnement
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

Appelez en fait le serveur gRPC

Essayez d'appeler rpc en utilisant le stub créé ci-dessus

grpc/hoge.rb


class Grpc::Hoge
  def get_name(params)
    #Créer une instance de modèle qui a une instance de stub
    client = Grpc::HogeServiceClient.instance
    #Créer les données de demande requises pour l'appel RPC
    req = get_name_request(params)
    #Créez des métadonnées si nécessaire
    meta = Hash.new
    meta["x-app-id"] = "hogeghoge"
    meta["x-app-password"] = "fugafuga"

    begin
      #Ici appel RPC
      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 est appelé dans la partie de client.stub.get_name --Si le résultat de cet appel est une erreur (Status.Codes n'est pas OK), une exception se produira, donc mettez-la dans begin et rescue s'il s'agit d'une erreur. --Pour «meta», les métadonnées sont définies au moment de l'appel gRPC.

À propos de la gestion des erreurs

Comme je l'ai mentionné précédemment, lorsqu'un appel rpc renvoie une réponse d'état d'erreur, une exception de la classe GRPC :: BadStatus se produit. Par conséquent, il est nécessaire de toujours commencer ~ sauvetage. De plus, si le côté serveur retourne avec error_details compressé, il est nécessaire de l'implémenter pour le récupérer. Référence: https://www.rubydoc.info/gems/grpc/GRPC/BadStatus

Recommended Posts

Implémenter le client gRPC dans Ruby
Multiplication dans un tableau Ruby
3 Implémentez un interpréteur simple en Java
Essayez d'implémenter Yuma dans Ruby
Implémenter un formulaire de contact dans Rails
J'ai essayé un problème de calendrier avec Ruby
[Ruby] J'ai créé un simple client Ping
Implémenter l'algorithme dans Ruby: Jour 1 - Division mutuelle euclidienne-
Implémenter quelque chose comme une pile en Java
Conseils pour la gestion des erreurs de gRPC dans Ruby
Lourd en rubis! ??
Traitement d'échappement lors de la création d'une URL dans Ruby
Implémentez l'algorithme dans Ruby: Day 3-Dichotomy-
J'ai créé une bibliothèque d'extension Ruby en C
Comment implémenter une fonctionnalité similaire dans Rails
Implémentez l'algorithme dans Ruby: Day 4-Linear search-
(Ruby on Rails6) Création de données dans une table
Comment implémenter la pagination dans GraphQL (pour ruby)
Implémentez l'algorithme dans Ruby: Jour 2 -Bubble Sort-
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Implémentez une clause IN multi-colonnes (colonne: condition = n: n) dans DOMA.
Calculer la différence entre les nombres dans un tableau Ruby
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Ce qui m'a impressionné en tant que débutant dans l'écriture de Ruby
Comment lancer une autre commande dans un programme Ruby
J'ai créé un serveur et un client Restful au printemps.
Implémentez rapidement singleton avec enum en Java
Triangle de sortie en Ruby
Implémenter CustomView dans le code
[Programmation complète] §5 Créer une application de gestion des avis dans Ruby
Types de variables dans ruby
Popcount rapide en Ruby
Markdown implémenté dans Rails
Mettez à jour vos connaissances Java en écrivant un serveur gRPC en Java (2)
Difficultés à créer un environnement Ruby on Rails (Windows 10) (SQLite3)
Comment changer une chaîne dans un tableau en un nombre dans Ruby
Mettez à jour vos connaissances Java en écrivant un serveur gRPC en Java (1)
J'ai recherché un framework web avec Gem en Ruby
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Je veux créer un fichier Parquet même en Ruby
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
J'ai créé un client RESAS-API en Java
Appliquer le CSS à une vue spécifique dans Ruby on Rails
J'ai écrit un analyseur C (comme) en utilisant PEG dans Ruby
Implémenter la fonction d'application dans Rails
ABC177-Résoudre E avec Ruby
Valider les jetons JWT dans Ruby
Qu'est-ce qu'un module Ruby?
Client GraphQL commençant par Ruby