首頁  >  文章  >  後端開發  >  grpc中的api是如何實現的?

grpc中的api是如何實現的?

王林
王林轉載
2024-02-15 16:40:09617瀏覽

grpc中的api是如何實現的?

在php小編魚仔的幫助下,我們來探究grpc中的api是如何實現的。 gRPC是一個高效能、開源的遠端過程呼叫(RPC)框架,它使用了Google的Protocol Buffers作為介面描述語言,並支援多種程式語言。 gRPC的核心機制是基於HTTP/2協議,透過序列化和反序列化訊息來實現客戶端和伺服器之間的通訊。在本文中,我們將深入了解gRPC的工作原理、訊息傳遞方式以及如何使用它來建立強大的分散式應用程式。讓我們開始吧!

問題內容

我使用了官方文件https://grpc.io/docs/languages/go/basics/,但實現後,出現了問題。 當我建立 tcp 伺服器時,我必須指定主機和連接埠(在我的例子中為 mcrsrv-book:7561)。 但是如果我想為 grpc 實作另一個 api 該怎麼辦?我是否需要在新連接埠上啟動另一台伺服器(例如 mcrsrv-book:7562)? grpc中的路由和api是如何實現的?

我的伺服器程式碼是:

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

我認為除了為每個 grpc 服務打開單獨的連接埠之外,還應該有其他選擇。

grpc中的api是如何實現的?

解決方法

如果您想將相同位址用於不同的服務,只需在啟動 grpc 伺服器之前重新註冊其他服務即可。

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

#register other server here with the same 'grpcServer'

grpcServer.Serve(lis)

這個 stackoverflow 執行緒可能會幫助您作為您想要實現的目標的範例。該問題提供了一個範例程式碼,我認為該程式碼與您的要求相符。

透過相同連線存取多個 grpc 服務

以上是grpc中的api是如何實現的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除