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.