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.
Klicken Sie hier für die Quelle. https://github.com/yzmw1213/PostService
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" }
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)
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.
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.
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen