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 服务相对简单。
总结来说,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 高?的更多相关文章
- RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。
RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础.本文介绍 RPC 客户机和服务器之间基本的事件流 ...
- MQ & RPC 消息队列与RPC的区别与使用场景
MQ: 区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...
- Java RMI与RPC的区别
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html 一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...
- Dubbo与Hadoop RPC的区别
本文来自网易云社区 RPC(Remote Procedure Call,远程过程调用)是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编 ...
- rmi与rpc的区别
这里简单说一下RMI和RPC的区别. 什么是RMI RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚 ...
- C# -- 高性能RPC框架:Socean.RPC
简介 Socean.RPC是一个.Net下的高性能RPC框架,框架以高性能.高稳定性为目标,底层基于socket,无第三方库引用,代码简洁,总代码量大约在2000行,框架性能较高,在普通PC上测试,长 ...
- 应答流式RPC 请求流式RPC 向流式RPC 流式RPC的三种具体形式
https://mp.weixin.qq.com/s/pWwSfXl71GQZ3KPmAHE_dA 用Python进行gRPC接口测试(二) 大帆船 搜狗测试 2020-02-07 上期回顾:用P ...
- 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc
不久前发布了一篇博文".NET轻量级RPC框架:Rabbit.Rpc",当初只实现了非常简单的功能,也罗列了之后的计划,经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性 ...
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjec ...
随机推荐
- 学习C#编程经典书籍
1.<C# 语言程序设计>(第4版):由微软公司的C#语言团队编写,是学习C#语言的必备经典著作. 2.<C#高级编程>(第9版):由Andrew Troelsen编写,涵盖了 ...
- uniapp小程序页面实现元素与胶囊进行居中对齐
无论是否为uni,关键在于获取胶囊中点的位置,如果是原生小程序根据小程序文档获取,其余逻辑处理是一致的 代码语法都只是技术选择,重点是逻辑处理,对于技术的运用,代码技术好比是积木,好的程序就是好的组合 ...
- 力扣190(java)-颠倒二进制位(简单)
题目: 颠倒给定的 32 位无符号整数的二进制位. 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型.在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论 ...
- 阿里本地生活全域日志平台 Xlog 的思考与实践
简介: 作者:王宇(御田).当你踏进了编程的领域,代码和日志将是你最重要的伙伴".基于日志的问题排查是研发效能领域的重要部分,阿里集团本地生活在支撑多生态公司.多技术栈的背景下,逐渐沉淀了一 ...
- 云小蜜 Dubbo3.0 实践:从微服务迁移上云到流量治理
简介:阿里云-达摩院-云小蜜对话机器人产品基于深度机器学习技术.自然语言理解技术和对话管理技术,为企业提供多引擎.多渠道.多模态的对话机器人服务.17 年云小蜜对话机器人在公共云开始公测,同期在混合 ...
- Dapr 在阿里云原生的实践
简介: Faas 场景下,比较吸引用户的是成本和研发效率,成本主要通过按需分配和极致的弹性效率来达成.而应用开发者期望通过 FaaS 提供多语言的编程环境,提升研发效率,包括启动时间.发布时间.开发的 ...
- [FAQ] gormV2 Too many connections
gormV2 中不再有v1的 db.Close() 方法. 取而代之的 close 方式是如下: sqlDB, err := DB.DB() sqlDB.Close() https://github. ...
- XAML 给资源起个好名字 用 StaticResource 起一个别名
本文来和大家聊一下关于 XAML 资源的定义的事情,和开发技术关系不大,更多的是开发的思路 在稍微大一点的项目里,肯定 XAML 资源是少不了的.对于 XAML 资源,行业里讨论多(非小白讨论)的是关 ...
- 2019-11-29-dotnet-remoting-使用事件
title author date CreateTime categories dotnet remoting 使用事件 lindexi 2019-11-29 10:20:1 +0800 2018-2 ...
- vue使用vant的van-tabs+tag在选项卡展示该内容有几条的提示
1.直接写用v-if判断下标展示,会滚动.pass! 2.定位,各种定位,相对各种父元素各种定位,还是会滚,因为tab内容一定滚动,pass 3.手写选项卡+v-if判断,这肯定可行,但本着能用ui组 ...