【问题标题】:gRPC and HTTP 1 call on single port, with out using TLS in goLanggRPC 和 HTTP 1 在单个端口上调用,在 goLang 中不使用 TLS
【发布时间】: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

【问题讨论】:

    标签: go web grpc


    【解决方案1】:

    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()
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2019-07-20
      • 2021-10-05
      • 2017-11-29
      • 2021-04-06
      • 2016-06-09
      相关资源
      最近更新 更多