如何使用功能停止 golang gRPC 服务器?

查看 grpc-go 中的 helloworld 示例,如何添加一个StopGrpcServer()函数来停止 gRPC 服务器?


我正在尝试制作一个 gRPC 服务器的共享 C 库文件,该文件可用于通过 ffi 调用函数来启动和停止 gRPC 服务器。


在我的测试中,我能够启动 gRPC 服务器,StartGrpcServer()但我对如何实现StopGrpcServer().


package main


import C


import (

    "context"

    "log"

    "net"


    "google.golang.org/grpc"

    pb "google.golang.org/grpc/examples/helloworld/helloworld"

)


const (

    port = ":50051"

)


// server is used to implement helloworld.GreeterServer.

type server struct {

    pb.UnimplementedGreeterServer

}


// SayHello implements helloworld.GreeterServer

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {

    log.Printf("Received: %v", in.GetName())

    return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil

}


//export StopGrpcServer

func (s *server) StopGrpcServer() {

    s.Stop()

}


//export StartGrpcServer

func StartGrpcServer() {

    lis, err := net.Listen("tcp", port)

    if err != nil {

        log.Fatalf("failed to listen: %v", err)

    }

    s := grpc.NewServer()

    pb.RegisterGreeterServer(s, &server{})

    if err := s.Serve(lis); err != nil {

        log.Fatalf("failed to serve: %v", err)

    }

}


func main() {}

非常感谢一些帮助。


肥皂起泡泡
浏览 231回答 1
1回答

慕桂英546537

我可以通过*grpc.Server在外部全局声明变量StartGrpcServer(),然后在内部使用它来解决问题StopGrpcServer()。这是工作代码:package mainimport Cimport (    "context"    "log"    "net"    "google.golang.org/grpc"    pb "google.golang.org/grpc/examples/helloworld/helloworld")var srv *grpc.Serverconst (    port = ":50051")// server is used to implement helloworld.GreeterServer.type server struct {    pb.UnimplementedGreeterServer}// SayHello implements helloworld.GreeterServerfunc (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {    log.Printf("Received: %v", in.GetName())    return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil}//export StopGrpcServerfunc StopGrpcServer() {    srv.Stop()}//export StartGrpcServerfunc StartGrpcServer() {    lis, err := net.Listen("tcp", port)    if err != nil {        log.Fatalf("failed to listen: %v", err)    }    srv = grpc.NewServer()    pb.RegisterGreeterServer(srv, &server{})    if err := srv.Serve(lis); err != nil {        log.Fatalf("failed to serve: %v", err)    }}func main() {}// Compile with command:// go build -o greeter.so -buildmode=c-shared server.go
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go