ひとつのポートで gRPC と HTTP を同時に受けるには
ひとつのポートで gRPC と HTTP を同時に受けるには
次のように grpc っぽいリクエストを grpc.Server.ServeHTTP へ分岐させる http.Handler を書き、 TLS を有効にして Listen させれば良い。(参考)
func grpcHandlerFunc(grpcServer *grpc.Server, otherHandler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") {
grpcServer.ServeHTTP(w, r)
} else {
otherHandler.ServeHTTP(w, r)
}
})
}
Listenするコードは次のとおり。
func main() {
opts := []grpc.ServerOption{
grpc.Creds(credentials.NewClientTLSFromCert(cert.CertPool, "localhost"))}
g := grpc.NewServer(opts...)
pb.RegisterSKVSServer(g, &srv{data: map[string]string{}})
h := http.NewServeMux()
h.Handle("/", http.HandlerFunc(hello))
s := &http.Server{
Addr: ":8080",
Handler: grpcHandlerFunc(g, h),
TLSConfig: &tls.Config{
Certificates: []tls.Certificate{*cert.KeyPair},
NextProtos: []string{"h2"},
},
}
conn, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
log.Println("Listening...")
s.Serve(tls.NewListener(conn, s.TLSConfig))
}
- ここで pb は適当な proto から生成したパッケージである
注意点
Author And Source
この問題について(ひとつのポートで gRPC と HTTP を同時に受けるには), 我々は、より多くの情報をここで見つけました https://qiita.com/ktateish/items/ff5c045e3cebc59bf119著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .