Go 让http.handleFunc()在gRPC服务器上工作
所以我想在GOlang运行一个小的gRPC应用程序。gPRC命令工作正常,但是,我还希望能够从URL与数据库交互。在我添加gRPC服务器之前,它工作得很好,但是在gRPC服务器或“正常”服务器被阻塞并且无法启动之后。有没有办法既有gRPC接口,又能从URL进行调用 我的服务器代码: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
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请求提供一个端口