【发布时间】:2020-07-08 15:56:57
【问题描述】:
从 grpc-go 看 helloworld 示例,如何添加 StopGrpcServer() 函数来停止 gRPC 服务器?
我正在尝试制作一个 gRPC 服务器的共享 C 库文件,该文件可用于通过 ffi 调用函数来启动和停止 gRPC 服务器。
在我的测试中,我可以使用 StartGrpcServer() 启动 gRPC 服务器,但我对如何实现 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() {}
非常感谢您的帮助。
谢谢, 沙丁鱼
【问题讨论】:
-
你需要在
grpc.NewServer()创建的grpc.Server上调用Stop(),而不是你自定义的server结构。 -
感谢@Marc 的提示。我可以通过将
*grpc.Server变量声明为全局变量来解决问题。在答案中发布我的代码。