Go 让http.handleFunc()在gRPC服务器上工作

Go 让http.handleFunc()在gRPC服务器上工作,go,Go,所以我想在GOlang运行一个小的gRPC应用程序。gPRC命令工作正常,但是,我还希望能够从URL与数据库交互。在我添加gRPC服务器之前,它工作得很好,但是在gRPC服务器或“正常”服务器被阻塞并且无法启动之后。有没有办法既有gRPC接口,又能从URL进行调用 我的服务器代码: func main(){ createItem("test", "test") http.HandleFunc("/get/", get) http.HandleFunc("/set/", s

所以我想在GOlang运行一个小的gRPC应用程序。gPRC命令工作正常,但是,我还希望能够从URL与数据库交互。在我添加gRPC服务器之前,它工作得很好,但是在gRPC服务器或“正常”服务器被阻塞并且无法启动之后。有没有办法既有gRPC接口,又能从URL进行调用

我的服务器代码:

func main(){
    createItem("test", "test")
    http.HandleFunc("/get/", get)
    http.HandleFunc("/set/", set)
    listener, err := net.Listen("tcp", ":4000")
    if err != nil{
        log.Fatal("Listener error: ", err)
    }
    s := grpc.NewServer()
    pb.RegisterGetSetServiceServer(s, &server{})
    reflection.Register(s)
    s.Serve(listener)


    log.Printf("serving rpc on port %d", 4000)
    err = http.Serve(listener, nil)
    if err != nil{
        log.Fatal("error serving: ", err)
    }

}

func (s *server) Get(ctx Context, req *pb.GetRequest) (*pb.Response, error) {
    var body string
    log.Printf("Recived: %v", req.GetTitle())
    for _, val := range database{
        if req.GetTitle() == val.Title{
            body = val.Body
            return &pb.Response{Body:body}, nil
        }
    }
    return &pb.Response{Body:"Nothing found"}, nil

}
func get(writer http.ResponseWriter, req *http.Request ){
    var value string


    v := req.FormValue("key")
    for _, val := range database{
        if val.Title == v {
              value = val.Body
        }
    }
    fmt.Fprintln(writer,  value)
}

正如Mark在评论中所说,您可以在Go HTTP服务器中为gRPC提供服务。
ServeHTTP
的文档中有一个解释:

但是,gRPC Go团队不推荐或不支持这种方法,因为它不允许gRPC的某些功能(例如Keepalives)工作。相反,我们建议您使用不同的端口,或者使用类似于
cmux
的端口,以便您可以在单独的HTTP服务器之外运行完整的gRPC服务器:

grpc服务器已为(..)提供服务,并为grpc和http2请求提供一个端口