[GO] Was tun, wenn ein Fehler "unbekannter Dienst" vom gRPC-Server zurückgegeben wird?

Kürzlich beliebte gRPC. Daten können durch Protokollpuffer, eine Schemasprache, serialisiert werden. Angenommen, die Kommunikation kann schneller durchgeführt werden als die bisher gängige JSON-Kommunikation Die Anzahl der Fälle in der Entwicklung von Mikrodiensten nimmt zu.

Während dieser Zeit trat ein Fehler als Titel auf, als versucht wurde, zwischen dem mit gRPC erstellten Client und Server zu kommunizieren. Ich hatte große Probleme, daher werde ich die Ursache und Lösung als Memorandum belassen.

Quellcode

Klicken Sie hier für die Quelle. https://github.com/yzmw1213/PostService

Was ich versucht habe zu tun

Implementieren Sie die folgenden zwei Dienste auf dem in go geschriebenen gRPC-Server. --Posting-Service --Tag Management Service für Posts (als Stammdaten behandelt)

Anschließend sendet der durch Typoskript implementierte Code auf der Clientseite eine Anforderung an den oben genannten Dienst und verarbeitet sie.

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)
  //Senden Sie eine Anfrage an die createTag-Methode von TagService
  client.createTag(request, {}, (err, res) => {
    if (err != null) {
      console.log(err)
    }
    console.log(res)
  })
}

Wie oben beschrieben, trat der folgende Fehler auf, als der Client den Tag-Service zum Erstellen eines Tags anforderte.

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

Lösung

Schauen Sie sich das offizielle [git] an (https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto "git") und fragen Sie sich, welcher Code: 12 ist ... sah.

Dann

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

Zusamenfassend, Der Inhalt bedeutete "der Dienst wurde nicht implementiert".

Überprüfen Sie daher, ob der aufrufende Dienst auf dem gRPC-Server registriert ist.

Verwenden Sie grpcurl, um den Betrieb des grpc-Servers zu überprüfen.

Es gab viele Details in diesem Artikel. https://qiita.com/yukina-ge/items/a84693f01f3f0edba482

Wenn Sie beispielsweise einen gRPC-Server auf Port 50051 erstellen, können Sie ihn wie folgt aufrufen.

#Liste der im Hafen registrierten Dienste
$ grpcurl -plaintext localhost:50051 list
grpc.reflection.v1alpha.ServerReflection
post_grpc.PostService

Server Reflection und Post Service scheinen registriert zu sein. Na dann dachte ich, TagService wäre ... und als ich den Code auf der Serverseite las, bemerkte ich einen offensichtlichen Fehler.

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
}

//NewPostGrpcServer gRPC-Server wird gestartet
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()
     //Registrieren Sie PostService beim Server
	post_grpc.RegisterPostServiceServer(s, server)

     //TagService fehlt!!!


	// 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
}

Obwohl PostService in post_grpc.RegisterPostServiceServer registriert ist TagService muss ebenfalls beim gRPC-Server registriert sein.

Ich habe den folgenden Code hinzugefügt und ihn gelöst.

server.go


     //Registrieren Sie PostService beim Server
	post_grpc.RegisterPostServiceServer(s, server)
	//Fügen Sie Folgendes hinzu
	//Tag-Service-Registrierung
	post_grpc.RegisterTagServiceServer(s, server)

Zurückblicken

Dieses Mal habe ich viel Zeit damit verbracht, die Ursache zu identifizieren. Ich habe einen Gesandten-Proxy zwischen Client und Server platziert und war vom Proxy abgelenkt. .. Es war ein ziemlich rudimentärer Fehler für mich, auch wenn ich mir darüber Sorgen machte. grpcurl, verwenden wir es von Anfang an.

Ergänzung

Beim Aufbau eines gRPC-Servers, der den Microservice-Betrieb übernimmt, Ich habe den Eindruck, dass viele Artikel über 1 Service / 1 Server geschrieben wurden, aber das ist nicht immer so Es ist nicht erforderlich, den Server für alle Dienste, wie oben implementiert, in kleine Teile zu unterteilen Ich denke, dass es kein Problem im Betrieb geben wird, wenn jeder Registerdienst verwendet wird.

Relevante Dienste (wie Benutzerregistrierungs- und Authentifizierungsdienste) Ich denke, es ist möglich, auf diese Weise auf demselben Server zu arbeiten.

Ich habe vor, in Zukunft einen Authentifizierungsdienst zu schreiben, also werde ich es versuchen.

Referenzartikel

Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen

Recommended Posts

Was tun, wenn ein Fehler "unbekannter Dienst" vom gRPC-Server zurückgegeben wird?
Was tun, wenn beim Laden von mnist eine Fehlermeldung angezeigt wird?
Was tun, wenn bei der Installation von Python mit pyenv eine Fehlermeldung angezeigt wird?
Was tun, wenn Overalls "Abdeckung unbekannt" werden?
Was tun, wenn bei der Installation von Python 2 mit pyenv ein OpenSSL-Fehler auftritt?
Was tun, wenn beim Konvertieren von PySparkDataFrame in PandasDataFrame ein Speicherfehler auftritt?
Was tun, wenn beim Importieren von matplotlib in Python (Mac) eine Fehlermeldung angezeigt wird?
Was tun, wenn beim Importieren von matplotlib mit Jupyter ein Importfehler auftritt?
Was tun, wenn beim Ausführen von "certbot erneuern" in der CakePHP-Umgebung eine Fehlermeldung angezeigt wird?
Was tun, wenn beim Versuch, pip mit pyenv zu verwenden, ein undefinierter Fehler angezeigt wird?
Was tun, wenn die Fehlermeldung angezeigt wird, dass der c-Compiler in configure keine ausführbaren Dateien erstellen kann?
Was tun, wenn auf pipenv der Fehler "Keine Versionen gefunden" angezeigt wird?
Was tun, wenn ein Fehler wie "Qstring" angezeigt wird? Wurde bereits mit mne python auf Version 1 gesetzt
Was tun, wenn Sie sich über "Wertefehler: unbekannt lokal: UTF-8" in python manage.py syncdb ärgern?
Was tun, wenn beim Versuch, eine Nachricht in task.loop () unmittelbar nach dem Start zu senden, eine Fehlermeldung angezeigt wird?
Was tun, wenn in pycurl (einer von ihnen) "(35, 'SSL-Verbindungsfehler')" angezeigt wird?
Einfache Lösung, wenn Sie Ihr EC2-Schlüsselpaar verlieren
Was tun, wenn bei Verwendung von ts-node-dev unter Linux der Fehler "ERR_FEATURE_UNAVAILABLE_ON_PLATFORM" angezeigt wird?
Was tun, wenn Sie Python auf IntelliJ ausführen und mit einem Fehler beenden?
Was tun, wenn unter Linux die Fehlermeldung "Namensauflösung vorübergehend fehlgeschlagen" ausgegeben wird?
Was tun, wenn Swagger-Codegen mit Python und Importfehler ausgeführt wird? Es wird kein Modul mit dem Namen angezeigt
Was tun, wenn bei yum ein Metalink für Repository-Fehler nicht abgerufen werden kann?
Was tun, wenn ein undefinierter Fehler angezeigt wird: Das Objekt 'Module_six_moves_urllib_parse' hat unter MacOS kein Attribut 'urlencode'
Was tun, wenn in Python minus Null angezeigt wird?
Was tun, wenn bei der Pip-Installation ein Unicode-Dekodierungsfehler auftritt?
Was tun, wenn Sie mit Maven kein Projekt erstellen können?
Was tun, wenn beim Aktivieren von public_network oder private_network unter Vagrant + Arch Linux beim Vagrant + Arch Linux → Install netctl eine Fehlermeldung angezeigt wird?
Was tun, wenn beim Versuch, model.save mit Keras zu modellieren, der Fehler "get_config" überschrieben werden muss?
Was tun, wenn Sie mit Python keine E-Mail an Yahoo senden konnten?
Was tun, wenn Sie sich mit FileNotFoundError in der Dateireferenz verlieren?
Was tun, wenn Sie sich über TensorFlow v2 ohne Attribut 'app' ärgern?
Was tun, wenn Sie während der Anaconda-Installation unter Linux nicht weiterkommen?
Was tun, wenn bei der Installation von pyenv kein Fehler auftritt?
Was tun, wenn beim Importieren von numpy mit VScode ein Fehler auftritt?
Was tun, wenn TypeError in min und max von numpy auftritt?
Was tun, wenn Sie URL 443 mit pip nicht abrufen konnten?
EC2 / Amazon Linux2: Was ist zu tun, wenn bei der Pip-Installation der Fehler "gcc 'kann nicht ausgeführt werden: Keine solche Datei oder kein solches Verzeichnis" auftritt
Was tun, wenn die Pipenv-Shell nicht mehr möglich ist?
[Django] Was tun, wenn beim Registrieren von Daten von der Verwaltungssite in die Datenbank ein Integritätsfehler auftritt?
Was tun, wenn beim Versuch, auf den Git-Hub zuzugreifen, der Fehler "Berechtigung verweigert" (öffentlicher Schlüssel) angezeigt wird?
Was tun, wenn der Fehler angezeigt wird? Das Ziel-WSGI-Skript '/ var / www / xxx / xxx.wsgi' kann nicht als Python-Modul geladen werden
Problemumgehung, wenn beim Versuch, PySide mit pip zu installieren, eine Fehlermeldung angezeigt wird
Swapon fehlgeschlagen: Was tun, wenn Sie sich über eine Operation ärgern, die nicht zulässig ist?
Lösung, wenn Django keine Bilder aus einem statischen Ordner laden kann
Was tun, wenn "Python nicht konfiguriert" angezeigt wird? Verwenden von PyDev in Eclipse
Was tun, wenn unter Ubuntu 20.04 ein SSL-Verbindungsfehler (ssl.SSLError: [SSL: DH_KEY_TOO_SMALL]) auftritt?
Was tun, wenn Sie mysqlclient nicht per Pip installieren können?
Kein Modul mit dem Namen Was tun, wenn Sie "libs.resources" erhalten?
ModuleNotFoundError: Kein Modul Was tun, wenn Sie'tensorflow.contrib 'erhalten?
Was tun, wenn in Hydrogen "Kein Kernel für Sprachpython gefunden" angezeigt wird?
Was tun, wenn der Druckbefehl selbst einen Fehler in Mayas Python verursacht?
Was tun, wenn bei Do and Return in einem Golang-Test ein Fehler mit zu vielen Eingabeargumenten auftritt?
Was tun, wenn bei der Installation von openCV 3 der Fehler "Fehler: opencv3: Unterstützt nicht das Erstellen von Python 2- und 3-Wrappern" angezeigt wird
Was tun, wenn Sie von Windows-Zeichencodes abhängig sind?
Was tun, wenn Sie keine Dateien mit Indizes sortieren können?
Was tun, wenn in tf.train.start_queue_runners () ein 0xC0000005-Fehler auftritt?
Was tun, wenn beim Importieren von _ssl ein Fehler auftritt?
Was tun, wenn Sie sich nicht als root anmelden können?