【问题标题】:How to stop golang gRPC server with a function?如何使用功能停止 golang gRPC 服务器?
【发布时间】: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 变量声明为全局变量来解决问题。在答案中发布我的代码。

标签: c go grpc-go


【解决方案1】:

感谢@Marc 的提示。我可以通过在StartGrpcServer() 之外全局声明*grpc.Server 变量,然后在StopGrpcServer() 中使用它来解决问题。

这是工作代码:

package main

import C

import (
    "context"
    "log"
    "net"

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

var srv *grpc.Server

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 StopGrpcServer() {
    srv.Stop()
}

//export StartGrpcServer
func 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

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2023-04-11
    • 2015-12-06
    • 1970-01-01
    • 2021-07-27
    • 2019-10-09
    • 2022-11-01
    • 2014-09-07
    相关资源
    最近更新 更多