我是 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
。
答案 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()
}