Maison > développement back-end > Golang > Comment l'API dans grpc est-elle implémentée ?

Comment l'API dans grpc est-elle implémentée ?

王林
Libérer: 2024-02-15 16:40:09
avant
635 Les gens l'ont consulté

Comment lAPI dans grpc est-elle implémentée ?

Avec l'aide de l'éditeur PHP Yuzai, explorons comment l'API dans grpc est implémentée. gRPC est un framework d'appel de procédure à distance (RPC) open source hautes performances qui utilise les tampons de protocole de Google comme langage de description d'interface et prend en charge plusieurs langages de programmation. Le mécanisme de base de gRPC est basé sur le protocole HTTP/2, qui implémente la communication entre le client et le serveur en sérialisant et désérialisant les messages. Dans cet article, nous examinerons de plus près le fonctionnement de gRPC, la manière dont les messages sont transmis et comment l'utiliser pour créer de puissantes applications distribuées. commençons!

Contenu de la question

J'ai utilisé le document officiel https://grpc.io/docs/linguals/go/basics/, mais après la mise en œuvre, un problème est survenu. Lorsque je crée le serveur TCP, je dois spécifier l'hôte et le port (dans mon cas mcrsrv-book:7561). Mais que se passe-t-il si je souhaite implémenter une autre API pour grpc ? Dois-je démarrer un autre serveur sur un nouveau port (par exemple mcrsrv-book:7562) ? Comment le routage et les API sont-ils implémentés dans grpc ?

Mon code serveur est :

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)
}
Copier après la connexion

Je pense qu'il devrait y avoir d'autres options que l'ouverture de ports séparés pour chaque service grpc.

Comment l'API dans grpc est-elle implémentée ?

Solution de contournement

Si vous souhaitez utiliser la même adresse pour différents services, réenregistrez simplement les autres services avant de démarrer le serveur grpc.

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

#register other server here with the same 'grpcServer'

grpcServer.Serve(lis)
Copier après la connexion

Ce fil de discussion stackoverflow pourrait vous aider comme exemple de ce que vous souhaitez réaliser. La question fournit un exemple de code qui, je pense, correspond à vos besoins.

Accédez à plusieurs services grpc via la même connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal