Почему grpc-go может запускать grpc-сервер и http-сервер с одним и тем же адресом и портом, но grpc-node не может

Я прочитал этот ответ: https://stackoverflow.com/a/56943771/6463558, в нем говорится, что нет способ запустить сервер gRPC и HTTP-сервер с одним и тем же адресом и портом с использованием пакета grpc-node.

Но я могу создать сервер gRPC и HTTP-сервер с одним и тем же адресом и портом (например, оба используют localhost:3000), используя пакет grpc-go. Вот пример: https://github.com/mrdulin/grpc-go-cnode/blob/master/cmd/server/main.go#L79.

Итак, почему grpc-node и grpc-go ведут себя непоследовательно. Имеет ли это смысл?

В результате я ожидаю, что независимо от того, какой язык реализован в grpc, поведение должно быть согласованным. Таким образом, сервер grpc должен иметь возможность использовать один и тот же порт с сервером, созданным стандартной библиотекой Node https://nodejs.org/api/http.html в том же системном процессе.


person slideshowp2    schedule 31.08.2020    source источник


Ответы (2)


Все дело в реализации. У каждого языка есть своя реализация для gRPC. Есть много отличий от каждой языковой реализации, некоторые из-за языковых возможностей, но также из-за сопровождающих. Каждый проект - это отдельный проект.

В этом случае мы не можем сказать, что серверы gRPC и HTTP используют один и тот же адрес. Работает только HTTP-сервер. Однако реализация Golang для сервера gRPC имеет возможность обслуживать gRPC через HTTP.

Вызов

server.ServeHTTP()

вместо того

server.Serve()

Это возможно, потому что под капотом сервер gRPC построен на основе HTTP2.

Этот фрагмент из ссылки, которой вы поделились, разъясняет то, что я сказал

if request.ProtoMajor != 2 {
            mux.ServeHTTP(writer, request)
            return
}

if strings.Contains(request.Header.Get("Content-Type"), "application/grpc") {
                grpcServer.ServeHTTP(writer, request)
                return
}

Если вы хотите сделать то же самое в Node, вам нужно проверить реализацию grpc-node, есть ли такая возможность

person Alexsandro Souza    schedule 01.09.2020

В вашем примере используется http.NewServeMux(), который предоставляется стандартной библиотекой Go. Стандартная библиотека Node не предоставляет эквивалентной функции, поэтому вы не можете использовать порт таким образом.

person murgatroid99    schedule 31.08.2020