Golang RPC http.Serve vs rpc.ServeConn (соединение HTTP с сырым соединением)
Сеть/библиотека RPC Go документация позволяет подвергать объект через сеть, либо через сырые сетевые соединения или через HTTP.
Пример HTTP
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
log.Fatal("listen error:", e)
}
go http.Serve(l, nil)
Сетевое подключение Raw TCP
arith := new(Arith)
rpc.Register(arith)
l, e := net.Listen("tcp", ":1234")
if e != nil {
log.Fatal("listen error:", e)
}
go func() {
for {
conn, err := l.Accept()
go rpc.ServeConn(conn)
}
}
Чтобы вызвать первый тип сервера, можно использовать rpc.DialHTTP("tcp", "127.0.0.1:1234"), а для второго типа rpc.Dial("tcp", "127.0.0.1:1234") будет используемый.
Мой вопрос в том, как эти два действительно разные? Какие плюсы и минусы существуют для запуска HTTP-сервера и сервера "raw network connection"? Можно ли каким-либо образом выполнить RPC через curl или браузер каким-либо образом с HTTP? Является ли версия HTTP полезной для вызова RPC с несколькими языками?
Ответы
Ответ 1
У этого вопроса есть ответ с хорошим описанием различий между HTTP и raw TCP вообще (не напрямую относительно Go).
TCP Vs. Http Benchmark
В основном это говорит о том, что, поскольку HTTP - это слой поверх TCP для стандартизации, это то, что вы, вероятно, должны использовать, если планируете, чтобы ваш код имел веб-страницу, пытаясь делать запросы и обрабатывать ответ, но если все, о чем вы заботитесь, это скорость, отключите HTTP и перейдите с необработанным TCP.