单个端口上的gRPC和HTTP 1调用,在goLang

时间:2017-09-06 09:24:17

标签: go web grpc

我是 web开发的新手,我最近开始在 golang 中开展项目工作,我必须在我的服务器上使用gRPC进行推送通知才能连接到一个Android设备。 我创建了一个简单的多路复用器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连接,但我不想进入保护我的网络和Android端代码的实现,因为这需要我更改我的Android端的所有代码和网络,我想避免。

所以我正在寻找一种方法将此grpcServer连接到我当前的serverStruct,而不使用任何TLS配置。

更多关于myResearcH: 我还搜索了一个名为repo cmux serverStruct的{​​{1}},它将执行相同的工作,但我不明白我将如何将其与当前{{1}一起使用因为我有一个运行在其上的功能齐全的Web应用程序,我只需要使用我当前的代码添加gRPC

1 个答案:

答案 0 :(得分:0)

gRPC Service可以通过使用go例程实现TLS来实现。

创建一个功能,为您的gRPC服务

func RunGRPC()  {
    grpcServer := grpc.NewServer()
    pb.RegisterGlassInfoServer(grpcServer,&GlassApkBean{})
    pb.RegisterDeviceInfoServer(grpcServer, &DeviceInfoBean{}) // for multiple services
    lis, err := net.Listen("tcp", ":50051")
    if err !=nil{
        log.Fatalf("Error: %v\n" , err.Error())
    }
    grpcServer.Serve(lis)
}

使用此功能,以回复客户请求

func main(){
    .
    . // Your Code
    .
    go RunGRPC() // code to run grpc server in go routine. 
    serverWeb := http.Server{
        Addr:   "localhost:8080",
        Handler: mux,
}

serverWeb.ListenAndServe()
}