Que faire lorsqu'une erreur "service inconnu" est renvoyée par le serveur gRPC

GRPC récemment populaire. Les données peuvent être sérialisées par Protocol Buffers, qui est un langage de schéma. En supposant que la communication peut être effectuée plus rapidement que la communication json, qui était courante jusqu'à présent Le nombre de cas adoptés dans le développement de micro-services est en augmentation.

Pendant ce temps, un bogue comme le titre s'est produit lors de la tentative de communication entre le client et le serveur construit avec gRPC. J'ai eu beaucoup de problèmes, alors je vais laisser la cause et la solution dans un mémorandum.

Code source

Cliquez ici pour la source. https://github.com/yzmw1213/PostService

Ce que j'ai essayé de faire

Implémentez les deux services suivants sur le serveur gRPC écrits en go. --Service d'affichage

Ensuite, le code côté client implémenté par dactylographié envoie une requête au service ci-dessus et la traite.

client.ts


import { Tag, CreateTagRequest } from "~/grpc/tag_pb"
import { TagServiceClient } from "~/grpc/TagServiceClientPb"

post() {
  const client = new TagServiceClient(
    "http://localhost:8080", {}, {}
  )
  
  const request = new CreateTagRequest()
  var tag = new Tag()
  tag.setTagId(postTag.tagID)
  tag.setTagName(postTag.tagName)
  tag.setStatus(postTag.status)
  request.setTag(tag)
  //Envoyer une requête à la méthode createTag de TagService
  client.createTag(request, {}, (err, res) => {
    if (err != null) {
      console.log(err)
    }
    console.log(res)
  })
}

Lorsque le client a demandé au service de balises de créer une balise comme décrit ci-dessus, l'erreur suivante s'est produite.

{ code: 12, message: "unknown service post_grpc.TagService" }

Solution

Regardez le [git] officiel (https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto "git") en vous demandant ce qu'est le code: 12 ... vu.

ensuite

// HTTP Mapping: 501 Not Implemented UNIMPLEMENTED = 12;

en bref, Le contenu signifiait «le service n'a pas été mis en œuvre».

Par conséquent, vérifiez si le service appelant est enregistré sur le serveur gRPC.

Utilisez grpcurl pour vérifier le fonctionnement du serveur grpc.

Il y avait de nombreux détails dans cet article. https://qiita.com/yukina-ge/items/a84693f01f3f0edba482

Par exemple, si vous créez un serveur gRPC sur le port 50051, vous pouvez le frapper comme suit.

#Liste des services enregistrés dans le port
$ grpcurl -plaintext localhost:50051 list
grpc.reflection.v1alpha.ServerReflection
post_grpc.PostService

Server Reflection et Post Service semblent être enregistrés. Eh bien, je pensais que TagService l'était ... et quand j'ai lu le code côté serveur, j'ai remarqué une erreur évidente.

server.go


package grpc

import (
	"fmt"
	"log"
	"net"
	"os"
	"os/signal"

	"github.com/yzmw1213/PostService/grpc/post_grpc"
	"github.com/yzmw1213/PostService/usecase/interactor"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)

type server struct {
	PostUsecase interactor.PostInteractor
	TagUsecase  interactor.TagInteractor
}

//Démarrage du serveur gRPC NewPostGrpcServer
func NewPostGrpcServer() {
	lis, err := net.Listen("tcp", "0.0.0.0:50051")
	if err != nil {
		log.Fatalf("Failed to listen: %v", err)
	}

	server := &server{}

	s := makeServer()
     //Enregistrer PostService auprès du serveur
	post_grpc.RegisterPostServiceServer(s, server)

     //TagService est manquant!!!


	// Register reflection service on gRPC server.
	reflection.Register(s)
	log.Println("main grpc server has started")

	go func() {
		if err := s.Serve(lis); err != nil {
			log.Fatalf("failed to serve: %v", err)
		}
	}()

	ch := make(chan os.Signal, 1)
	signal.Notify(ch, os.Interrupt)

	// Block until a sgnal is received
	<-ch
	fmt.Println("Stopping the server")
	s.Stop()
	fmt.Println("Closing the client")
	lis.Close()
	fmt.Println("End of Program")
}

func makeServer() *grpc.Server {
	s := grpc.NewServer(
		grpc.UnaryInterceptor(grpc.UnaryServerInterceptor(transmitStatusInterceptor)),
	)

	return s
}

Bien que PostService soit enregistré dans post_grpc.RegisterPostServiceServer TagService doit également être enregistré auprès du serveur gRPC.

J'ai ajouté le code suivant et l'ai résolu.

server.go


     //Enregistrer PostService auprès du serveur
	post_grpc.RegisterPostServiceServer(s, server)
	//Ajoutez ce qui suit
	//Enregistrement du service d'étiquette
	post_grpc.RegisterTagServiceServer(s, server)

Regarder en arrière

Cette fois, j'ai passé beaucoup de temps à identifier la cause. J'ai mis un proxy d'envoi entre le client et le serveur, et j'ai été distrait par le proxy. .. C'était une erreur assez rudimentaire pour moi, même si cela m'inquiétait. grpcurl, utilisons-le depuis le début.

Supplément

Lors de la création d'un serveur gRPC qui suppose un fonctionnement de microservice, J'ai l'impression qu'il existe de nombreux articles écrits sur le principe 1 service / 1 serveur, mais ce n'est pas toujours Il n'est pas nécessaire de diviser le serveur en petites parties pour tous les services, comme implémenté ci-dessus Je pense qu'il n'y aura aucun problème de fonctionnement si chaque service de registre est utilisé.

Services pertinents (tels que l'enregistrement des utilisateurs et les services d'authentification) Je pense qu'il est possible d'opérer sur le même serveur de cette manière.

Je prévois d'écrire un service d'authentification à l'avenir, je vais donc l'essayer.

Article de référence

J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl

Recommended Posts

Que faire lorsqu'une erreur "service inconnu" est renvoyée par le serveur gRPC
Que faire si vous obtenez une erreur lors du chargement de mnist
Que faire si vous obtenez une erreur lors de l'installation de python avec pyenv
Que faire si Combinaisons devient «couverture inconnue»
Que faire si vous obtenez une erreur OpenSSL lors de l'installation de Python 2 avec pyenv
Que faire si vous obtenez une erreur de mémoire lors de la conversion de PySparkDataFrame en PandasDataFrame
Que faire si vous obtenez une erreur lors de l'importation de matplotlib en Python (Mac)
Que faire si vous obtenez une erreur d'importation lors de l'importation de matplotlib avec Jupyter
Que faire si vous obtenez une erreur lors de l'exécution de "certbot renouveler" dans l'environnement CakePHP
Que faire si vous obtenez une erreur non définie lorsque vous essayez d'utiliser pip avec pyenv
Que faire si vous obtenez une erreur indiquant que le compilateur C ne peut pas créer d'exécutables dans configure
Que faire si vous obtenez une erreur "Aucune version trouvée" sur pipenv
Que faire si vous obtenez une erreur comme "Qstring" a déjà été défini sur la version 1 en utilisant mne python
Que faire lorsque vous vous fâchez avec "Value Error: unknown local: UTF-8" dans python manage.py syncdb
Que faire si vous obtenez une erreur en essayant d'envoyer un message dans tasks.loop () immédiatement après le démarrage
Que faire si vous obtenez "(35, 'Erreur de connexion SSL')" dans pycurl (l'un d'entre eux)
Remède facile lorsque vous perdez votre paire de clés EC2
Que faire si vous obtenez l'erreur ʻERR_FEATURE_UNAVAILABLE_ON_PLATFORM` lors de l'utilisation de ts-node-dev sous Linux
Que faire si vous exécutez python sur IntelliJ et quittez avec une erreur
Que faire lorsque vous obtenez une erreur indiquant «Échec temporaire de la résolution du nom» sous Linux
Que faire lorsque swagger-codegen est terminé avec python et Erreur d'importation: aucun module nommé n'apparaît
Que faire si vous obtenez une erreur Impossible de récupérer le lien métallique pour le référentiel avec yum
Que faire si vous obtenez une erreur non définie: l'objet 'Module_six_moves_urllib_parse' n'a pas d'attribut 'urlencode' sur MacOS
Que faire si vous obtenez moins zéro en Python
Que faire si vous obtenez une erreur de décodage Unicode avec l'installation de pip
Que faire si vous ne pouvez pas construire un projet avec Maven
Que faire si vous obtenez une erreur lors du vagabondage lorsque vous activez public_network ou private_network sur Vagrant + Arch Linux → Installer netctl
Que faire si vous obtenez une erreur de remplacement obligatoire `get_config` lorsque vous essayez de model.save avec Keras
Que faire si vous ne parvenez pas à envoyer un e-mail à Yahoo avec Python.
Que faire si vous vous perdez dans la référence de fichier avec FileNotFoundError
Que faire si vous vous fâchez avec TensorFlow v2 sans l'attribut "app"
Que faire si vous êtes bloqué pendant l'installation d'Anaconda sur Linux
Que faire si l'installation de pyenv ne se poursuit pas avec une erreur
Que faire si une erreur se produit lors de l'importation de numpy avec VScode
Que faire lorsque TypeError se produit au minimum et au maximum de numpy
Que faire si vous obtenez Impossible de récupérer l'URL 443 avec pip
EC2 / Amazon Linux2: Que faire si une erreur "Impossible d'exécuter'gcc ': aucun fichier ou répertoire de ce type" se produit avec l'installation de pip
Que faire lorsque le shell pipenv devient impossible
[Django] Que faire lorsqu'une erreur d'intégrité se produit lors de l'enregistrement des données du site de gestion dans la base de données
Que faire si vous obtenez une erreur d'autorisation refusée (clé publique) lorsque vous essayez de tirer sur le hub Git
Que faire si vous obtenez l'erreur Le script WSGI cible '/ var / www / xxx / xxx.wsgi' ne peut pas être chargé en tant que module python
Solution de contournement si vous obtenez une erreur lors de la tentative d'installation de PySide avec pip
swapon failed: Que faire si vous vous fâchez contre l'opération non autorisée
Solution lorsque Django ne peut pas charger d'images à partir d'un dossier statique
Que faire si vous obtenez «Python non configuré». Utilisation de PyDev dans Eclipse
Que faire si une erreur de connexion SSL (ssl.SSLError: [SSL: DH_KEY_TOO_SMALL]) se produit sur Ubuntu 20.04
Que faire si vous ne pouvez pas installer mysqlclient
Aucun module nommé Que faire si vous obtenez "libs.resources"
ModuleNotFoundError: No module Que faire si vous obtenez 'sensorflow.contrib'
Que faire quand "Aucun noyau pour le langage python trouvé" apparaît dans Hydrogen
Que faire si la commande d'impression elle-même provoque une erreur dans le python de Maya
Que faire si vous recevez une erreur d'appel avec trop d'arguments d'entrée à faire et retourner dans un test de golang
Que faire si vous obtenez l'erreur "Erreur: opencv3: Ne prend pas en charge la construction des wrappers Python 2 et 3" lors de l'installation d'openCV 3
Que faire si vous êtes accro aux codes de caractères Windows
Que faire si vous ne pouvez pas trier les fichiers avec des indices
Que faire si une erreur 0xC0000005 se produit dans tf.train.start_queue_runners ()
Que faire lorsqu'une erreur se produit avec import _ssl
Que faire si vous ne pouvez pas vous connecter en tant que root