【发布时间】:2017-09-06 09:24:16
【问题描述】:
我是 web 开发 的新手,我最近开始在 golang 工作一个项目,我必须在我的服务器上使用 gRPC 推送通知才能连接到安卓设备。
我创建了一个简单的多路复用器mux := http.NewServeMux(),它可以与我的服务器代码一起正常工作:
serverWeb := http.Server{
Addr: constants.ServerIPWeb,
//Handler: grpcHandlerFunc(grpcServer, mux),
Handler: mux,
}
serverWeb.ListenAndServe()
从 gRPC.io 的示例中,我还创建了一个简单的 gRPC 客户端/服务器作为连接到我的 android 设备的独立项目,没有任何 TLS 配置并且它工作正常。
type server struct{}
func (s *server) DeviceData(ctx context.Context,req *pb.GetDeviceRequest) (*pb.SetDeviceResponse, error){
util.P("Device is: ",req) // simple fmt.PrintF(a ... interface)
return &pb.SetDeviceResponse{Message:"Success"}, nil
}
func main(){
lis, err := net.Listen("tcp", ":8080")
if err!=nil{
log.Fatalf("Failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterDeviceInfoServer(s,&server{})
reflection.Register(s)
if err := s.Serve(lis); err != nil{
log.Fatalf("Falied to server: %v", err)
}
}
问题是我无法将当前的 gRPC 服务器连接到上面的 serverStruct。我尝试添加Handler: grpcHandlerFunc(grpcServer, mux),它将我的服务器连接到以下代码,如此处所述( gRPC with open API )
func grpcHandlerFunc(grpcServer *grpc.Server, otherHandler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// TODO(tamird): point to merged gRPC code rather than a PR.
// This is a partial recreation of gRPC's internal checks https://github.com/grpc/grpc-go/pull/514/files#diff-95e9a25b738459a2d3030e1e6fa2a718R61
util.P("ResponseFunction: GRPC: ",r.URL) // simple fmt.PrintF(a ... interface)
if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") {
grpcServer.ServeHTTP(w, r)
} else {
otherHandler.ServeHTTP(w, r)
}
})
}
上面的代码将运行我的服务,从我的mux 运行,即连接到 http,但它不会从 gRPC 运行服务,即连接到我的 Android 设备。
我认为它需要TLS 连接,但我不想参与保护我的 Web 和 Android 端代码的实施,因为这需要我更改我的 Android 端和 Web 上的所有代码,我想避免。
所以我正在寻找一种方法来将此grpcServer 连接到我当前的serverStruct 而不使用任何TLS 配置。
更多关于我的研究:
我还搜索了一个名为cmux (Connection Mux) 的repo,它可以完成相同的工作,但我不明白如何将它与我当前的serverStruct 一起使用,因为我有一个功能齐全的web 应用程序在此运行,我只需要在我当前的代码中添加 gRPC。
【问题讨论】: