golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?
在Go语言中,net/http 和 net/rpc 是两个不同的包,它们分别用于实现不同的网络通信模式:
net/http:
net/http 包主要用于构建Web服务和客户端,它实现了HTTP协议,这是互联网上最广泛使用的应用层协议之一,主要用于传输超文本(HTML)和其他资源。
HTTP 协议是基于请求-响应模型的,客户端发起HTTP请求,服务器响应HTTP响应。请求包括方法(如GET、POST等)、URL、头部和可选的正文,响应包括状态码、头部和正文。
使用 net/http,你可以轻松地创建处理HTTP路由、中间件、静态文件服务等功能的Web服务器。
对于客户端,http.Get 等函数可以方便地发起HTTP请求。
net/rpc:
net/rpc 包是用来实现远程过程调用(RPC)的,它允许一个程序调用另一个在网络上不同地址空间的程序提供的方法,就像调用本地函数一样。
RPC基于的是自定义的协议,通常更轻量级,不涉及HTTP的完整头部信息。Go的 net/rpc 默认使用了 encoding/gob 进行数据编码,这是一种针对Go语言设计的高效编码格式。
在 net/rpc 中,你需要定义一个结构体并标记为可导出,然后注册到 RPC 服务器,客户端就可以 通过网络 调用这些结构体的方法。
net/rpc 提供了简单的客户端和服务器API,如 rpc.Dial 和 rpc.Register,使得编写 RPC 服务相对简单。
https://github.com/farwish/go-lab/blob/master/src/net/rpc/tcp_server.go
https://github.com/farwish/go-lab/blob/master/src/net/rpc/tcp_client.go
总结来说,net/http 更关注于HTTP协议的Web服务,适合构建 Web应用和 API,而 net/rpc 则更专注于提供内部或者对Go友好的远程调用机制,它的接口设计更接近于本地函数调用。
如果你需要对外提供 RESTful API,net/http 是更好的选择;如果你需要在Go程序之间或者在跨语言边界内高效地进行远程调用,net/rpc 可能更合适。
那么 rpc 效率比 http 高吗 ?
RPC(Remote Procedure Call)通常被认为比HTTP更高效,尤其是在处理大量内部服务间通信或需要低延迟的情况下。
以下是一些原因:
1. 协议开销:
RPC通常使用自定义的、轻量级的协议,这使得请求和响应的报文体积更小,减少了网络传输的数据量。
相比之下,HTTP协议的报文头通常较大,包含了更多的元信息,这对于简单的 RPC 调用来说可能是不必要的开销。
2. 二进制编码:
许多 RPC 框架使用二进制编码(如protobuf, Thrift, 或者Go的 gob),这种编码方式通常比HTTP中的文本编码(如JSON)更紧凑,因此传输更快。
3. 连接复用:
RPC系统往往支持长连接,这意味着一旦建立了连接,就可以重复使用,减少了每次调用时的握手和关闭连接的开销。
而HTTP 1.x 默认是短连接,每个请求都需要完整的三次握手和四次挥手过程。HTTP/2 引入了连接复用,但这需要额外的协议支持。
4. 请求格式:
RPC通常直接映射到服务的方法调用,这避免了HTTP中需要解析URL路径和查询参数的开销。
然而,这并不意味着RPC总是比HTTP快。
HTTP在某些方面也有其优势,比如更好的跨语言支持、易于调试、缓存机制、以及与现有Web基础设施的兼容性。
在处理复杂的HTTP请求,如文件上传、流媒体等时,HTTP可能更合适。
在实际应用中,选择 RPC 还是 HTTP 取决于具体的需求,如性能要求、兼容性、可维护性等因素。
在现代微服务架构中,两者都有广泛的应用。