Go语言 grpc中的API是如何实现的?

am46iovg  于 2023-02-06  发布在  Go
关注(0)|答案(1)|浏览(147)

我使用的是官方文档https://grpc.io/docs/languages/go/basics/,但是实现之后,问题出现了。当我创建一个TCP服务器时,我必须指定主机和端口(在我的例子中是mcrsrv-book:7561)。但是如果我想为GRPC实现另一个API呢?我需要在一个新端口上启动另一个服务器吗(例如mcrsrv-book:7562)?路由和API在grpc中是如何实现的?
我的服务器代码是:

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是如何实现的?

blmhpbnm

blmhpbnm1#

如果您想为不同的服务使用相同的地址,您可以在启动grpc服务器之前重新注册其他服务。

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

#register other server here with the same 'grpcServer'

grpcServer.Serve(lis)

这个stackoverflow线程可以作为一个例子来帮助你实现你想要的目标。这个问题提供了一个示例代码,我相信它与你所问的一致。
Access multiple gRPC services over the same connection

相关问题