浅谈Go与习题(三十八)

153 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

今天来学习下Go常见的习题问题(三十八),也是面试中可能会遇到的,让我们来一起学习吧~

谈谈 http 与 rpc

为啥有了http协议还需要rpc协议呢?为了解答这个问题,我们先从tcp聊起

当客户端向服务端发送数据,需要用Socket进行连接,那么涉及到传输层的协议一般选择tcp或者udp,基于字节流传输数据,如果只通过tcp进行数据的传输,会发生粘包的问题,我们发送的数据都是01二进制数,没有明确的边界那么接受方就不知道如何对数据进行整理,如何解决这个问题,就需要引出http、rpc协议,这些协议会指定不同的规则,来让接收方可以分辨出数据边界,对每个数据进行包装操作,加入消息头--规定发送数据的长度,消息头里面还可以放其他消息,例如数据是否被压缩HPack算法,发送和接收双方都认可的一套规则

因为tcp是传输层协议,所以http、rpc都是基于tcp衍生出来的不同消息格式的应用层协议,HTTP 协议(Hyper Text Transfer Protocol),又叫做超文本传输协议,多用于网页访问,而RPCRemote Procedure Call),又叫做远程过程调用,它不是一个具体协议,而是一种调用方式,具体的协议是grpc,thrift等

因为rpc的出现时间比http早,都是为了解决粘包问题,但是为什么普遍用的比较多的是http,因为http主要用于B/S架构,而rpc用于C/S架构都是一个公司的产品之间调用,但是现在需要支持多端使用,手机,网页等,那么使用http就可以只用一套协议,所以http用的会更广泛点

紧接着来聊下rpc和http的区别

  • 服务发现:http中如果知道域名,可以通过DNS进行解析获取IP地址,默认端口80,如果是rpc的话,需要有专门的服务注册地方来保存服务名称和IP地址,例如:Consul、Etcd等
  • 底层连接形式:http1.1协议会建立tcp连接之后保持连接(keep-alive),rpc会建立一个连接池
  • 传输内容:http1.1主要以字符串形式传输,rpc则以01字符串,需要将结构体进行序列化传输,使用protobuf可以将数据量减小

总结

今天浅谈了Go的习题(三十八),参考资料图解网络,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!