在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 服务相对简单。

总结来说,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 取决于具体的需求,如性能要求、兼容性、可维护性等因素。

在现代微服务架构中,两者都有广泛的应用。

Link:https://www.cnblogs.com/farwish/p/18231614

golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?的更多相关文章

  1. RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。

    RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础.本文介绍 RPC 客户机和服务器之间基本的事件流 ...

  2. MQ & RPC 消息队列与RPC的区别与使用场景

    MQ:  区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...

  3. Java RMI与RPC的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html  一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...

  4. Dubbo与Hadoop RPC的区别

    本文来自网易云社区 RPC(Remote Procedure Call,远程过程调用)是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编 ...

  5. rmi与rpc的区别

    这里简单说一下RMI和RPC的区别. 什么是RMI RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚 ...

  6. C# -- 高性能RPC框架:Socean.RPC

    简介 Socean.RPC是一个.Net下的高性能RPC框架,框架以高性能.高稳定性为目标,底层基于socket,无第三方库引用,代码简洁,总代码量大约在2000行,框架性能较高,在普通PC上测试,长 ...

  7. 应答流式RPC 请求流式RPC 向流式RPC 流式RPC的三种具体形式

    https://mp.weixin.qq.com/s/pWwSfXl71GQZ3KPmAHE_dA 用Python进行gRPC接口测试(二) 大帆船 搜狗测试 2020-02-07   上期回顾:用P ...

  8. 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc

    不久前发布了一篇博文".NET轻量级RPC框架:Rabbit.Rpc",当初只实现了非常简单的功能,也罗列了之后的计划,经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性 ...

  9. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  10. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjec ...

随机推荐

  1. NodeJS安装cnpm

    介绍: NPM(Node Package Manager):Node的包管理器. CNPM(Chinese CPM):中国的NPM(国内使用,网速较快). 配置步骤 用npm安装cnpm npm in ...

  2. 华为云CodeArts IDE For Python 快速使用指南

    本文分享自华为云社区<华为云CodeArts IDE For Python 快速使用指南>,作者:为云PaaS服务小智. CodeArts IDE 带有 Python 扩展,为 Pytho ...

  3. argparse命令行参数的使用

    import argparse def main(): #设置一些参数 parser = argparse.ArgumentParser() parser.add_argument('--device ...

  4. Flink集成Iceberg在同程艺龙的实践

    ------------恢复内容开始------------ null ------------恢复内容结束------------

  5. 致敬 hacker |盘点内存虚拟化探索之路

    ​简介: 内存虚拟化相比裸机,仍然存在较大差异,是当下值得关注的问题! ​ 云与虚拟化 云计算是通过 Internet 服务的方式提供动态可伸缩资源的计算模式,经过多年的发展已成为企业 IT 技术的重 ...

  6. [Trading] 如何应对股价下跌, 投资技巧

    如果你想利用股价下跌的机会,你可以做以下事情来潜在地赚取利润. 为什么股价下跌会吓到投资者 商品在低价时,我们都倾向于买入,对于股票,价格暴跌以投资的形式损失你的钱,令人产生卖出情绪. 然而在卖掉之前 ...

  7. RT-Thread线程同步与线程通信

    一.线程同步 线程同步的使用场景 例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递: ...

  8. 004—Orcad创建简单分裂元件

    004-Orcad创建简单分裂元件 以TPS545为例,先查看datasheet,管脚图,PCB封装.新建库,设置名称和part的数量,然后添加管脚,设定管脚属性.电源管脚要勾选Pin Visble. ...

  9. Spring学习一(依赖注入/Bean/注解等)

    1.Spring依赖注入的方式. 2.依赖注入的类型 3.Bean的作用域 4.自动注入 5.使用注解的方式 6.在spring配置文件中引入属性文件 1.Spring依赖注入的方式 平常的java开 ...

  10. Fiddler在抓取https数据包时如何解决Tunnel to 443的问题?

    学习视频: https://www.bilibili.com/video/BV1zg4y1i7k3?p=2 谷歌浏览器导入证书 1.导出证书到桌面 2.双击安装证书 3.浏览器-->设置--&g ...