在 golang GRPC 服务器中处理 REST 请求
Handle REST requests in golang GRPC server
用golang编写的GRPC服务器是否也可以处理REST请求?
我发现 grpc-gateway 可以将现有的原型模式转换为休息端点,但我认为它不适合我的需要。
我已经编写了一个 GRPC 服务器,但我还需要处理来自外部服务(如 Github 或 Stripe)的 webhook 请求。我正在考虑编写第二个基于 REST 的服务器来接受这些 webhook(并且可能 translate/forward 它们到 GRPC 服务器)但这似乎是一种代码味道。
理想情况下,我希望我的 GRPC 服务器也能够,例如,在像 /webhook
或 /event
这样的端点处处理 REST 请求,但我不确定这是否是可能,如果是如何配置它。
看起来我在付出足够大的努力自己解决问题之前就提出了我的问题。下面是与 GRPC 请求一起提供 REST 请求的示例
func main() {
lis, err := net.Listen("tcp", ":6789")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// here we register and HTTP server listening on port 6789
// note that we do this in with gofunc so that the rest of this main function can execute - this probably isn't ideal
http.HandleFunc("/event", Handle)
go http.Serve(lis, nil)
// now we set up GRPC
grpcServer := grpc.NewServer()
// this is a GRPC service defined in a proto file and then generated with protoc
pipelineServer := Server{}
pipeline.RegisterPipelinesServer(grpcServer, pipelineServer)
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %s", err)
}
}
func Handle(response http.ResponseWriter, request *http.Request) {
log.Infof("handling")
}
根据以上内容,将 POST
发送到 localhost:6789/event
将导致发出 handling
日志行。
用golang编写的GRPC服务器是否也可以处理REST请求?
我发现 grpc-gateway 可以将现有的原型模式转换为休息端点,但我认为它不适合我的需要。
我已经编写了一个 GRPC 服务器,但我还需要处理来自外部服务(如 Github 或 Stripe)的 webhook 请求。我正在考虑编写第二个基于 REST 的服务器来接受这些 webhook(并且可能 translate/forward 它们到 GRPC 服务器)但这似乎是一种代码味道。
理想情况下,我希望我的 GRPC 服务器也能够,例如,在像 /webhook
或 /event
这样的端点处处理 REST 请求,但我不确定这是否是可能,如果是如何配置它。
看起来我在付出足够大的努力自己解决问题之前就提出了我的问题。下面是与 GRPC 请求一起提供 REST 请求的示例
func main() {
lis, err := net.Listen("tcp", ":6789")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// here we register and HTTP server listening on port 6789
// note that we do this in with gofunc so that the rest of this main function can execute - this probably isn't ideal
http.HandleFunc("/event", Handle)
go http.Serve(lis, nil)
// now we set up GRPC
grpcServer := grpc.NewServer()
// this is a GRPC service defined in a proto file and then generated with protoc
pipelineServer := Server{}
pipeline.RegisterPipelinesServer(grpcServer, pipelineServer)
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %s", err)
}
}
func Handle(response http.ResponseWriter, request *http.Request) {
log.Infof("handling")
}
根据以上内容,将 POST
发送到 localhost:6789/event
将导致发出 handling
日志行。