Heim  >  Artikel  >  Backend-Entwicklung  >  Wie wird die API in grpc implementiert?

Wie wird die API in grpc implementiert?

王林
王林nach vorne
2024-02-15 16:40:09617Durchsuche

Wie wird die API in grpc implementiert?

Mit Hilfe des PHP-Editors Yuzai erkunden wir, wie die API in grpc implementiert wird. gRPC ist ein leistungsstarkes Open-Source-RPC-Framework (Remote Procedure Call), das Googles Protocol Buffers als Schnittstellenbeschreibungssprache verwendet und mehrere Programmiersprachen unterstützt. Der Kernmechanismus von gRPC basiert auf dem HTTP/2-Protokoll, das die Kommunikation zwischen dem Client und dem Server durch Serialisierung und Deserialisierung von Nachrichten implementiert. In diesem Artikel werfen wir einen genaueren Blick darauf, wie gRPC funktioniert, wie Nachrichten weitergeleitet werden und wie man damit leistungsstarke verteilte Anwendungen erstellt. Lasst uns beginnen!

Frageninhalt

Ich habe das offizielle Dokument https://grpc.io/docs/linguals/go/basics/ verwendet, aber nach der Implementierung ist ein Problem aufgetreten. Wenn ich den TCP-Server erstelle, muss ich den Host und den Port angeben (in meinem Fall mcrsrv-book:7561). Aber was ist, wenn ich eine andere API für grpc implementieren möchte? Muss ich einen anderen Server auf einem neuen Port starten (z. B. mcrsrv-book:7562)? Wie werden Routing und APIs in grpc implementiert?

Mein Servercode lautet:

type routeGuideServer struct {
    pb.UnimplementedRouteGuideServer
    savedFeatures []*pb.Response // read-only after initialized
}

// GetFeature returns the feature at the given point.
func (s *routeGuideServer) GetFeature(ctx context.Context, request *pb.Request) (*pb.Response, error) {

    context := localContext.LocalContext{}
    book := bookRepository.FindOrFailBook(context, int(request.BookId))

    return &pb.Response{
        Name:        book.Name,
        BookId:      int32(book.BookId),
        AuthorId:    int32(book.AuthorId),
        Category:    book.Category,
        Description: "Описание",
    }, nil
}

func newServer() *routeGuideServer {
    s := &routeGuideServer{}
    return s
}

func SomeAction() {
    lis, err := net.Listen("tcp", fmt.Sprintf("mcrsrv-book:7561"))
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    var opts []grpc.ServerOption
    grpcServer := grpc.NewServer(opts...)
    pb.RegisterRouteGuideServer(grpcServer, newServer())
    grpcServer.Serve(lis)
}

Ich denke, es sollte andere Optionen geben als das Öffnen separater Ports für jeden GRPC-Dienst.

Wie wird die API in grpc implementiert?

Problemumgehung

Wenn Sie dieselbe Adresse für verschiedene Dienste verwenden möchten, registrieren Sie einfach die anderen Dienste erneut, bevor Sie den grpc-Server starten.

grpcServer := grpc.NewServer(opts...)
pb.RegisterRouteGuideServer(grpcServer, newServer())

#register other server here with the same 'grpcServer'

grpcServer.Serve(lis)

Dieser Stackoverflow-Thread könnte Ihnen als Beispiel dafür dienen, was Sie erreichen möchten. Die Frage enthält einen Beispielcode, der meiner Meinung nach Ihren Anforderungen entspricht.

Zugriff auf mehrere GRPC-Dienste über dieselbe Verbindung

Das obige ist der detaillierte Inhalt vonWie wird die API in grpc implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen