在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 服務