Notez la procédure d'implémentation du client gRPC dans Ruby à titre de rappel.
--Installez la gemme grpc
pour utiliser gRPC dans Ruby
gem 'grpc', '~> X.XX.X'
grpc_tools
pour compiler .proto dans un fichier rb$ 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
--grpc_out
spécifie la destination de sortie du fichier de classe qui sera le stub après la compilation, et le deuxième argument spécifie le répertoire contenant le fichier .proto à compiler.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
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.
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