RPC
[HTTP 和 RPC 的区别?](https://www.jianshu.com/p/fe5ccfc5d7bd)
[既然有 HTTP 请求,为什么还要用 RPC 调用? - 手不要乱摸的回答 - 知乎](https://www.zhihu.com/question/41609070/answer/191965937)
[既然有 HTTP 请求,为什么还要用 RPC 调用? - 易哥的回答 - 知乎](https://www.zhihu.com/question/41609070/answer/1030913797)
怎么理解rpc,既然有http请求了为啥还要用rpc? - 知乎
怎么理解rpc,既然有http请求了为啥还要用rpc? - Ikerli的回答 - 知乎 https://www.zhihu.com/question/524580708/answer/2584782720
Dubbo RPC_awesometime的博客-CSDN博客
http 2.0比1.0优化很多
基于HTTP的远程调用方案 | 基于RPC的远程调用方案 | |
接口规范 | restful | |
序列化反序列化 | 也支持 | xml json protobuf msgpack |
7层应用层通信协议(最根本区别) | http2.0 消息头 Header 和消息体 Body | http2.0 报文格式冗余信息多,有效信息少 (性能 1kqps) 还可自定义通信协议格式如tcp udp 较、减少无用信息 (性能 10-100kqps) |
传输层通道 | tcp socket连接 | tcp socket连接 |
框架代表 | dubbo gRPC thrift | |
是否跨语言 | 支持跨语言,更灵活通用 | rpc client 和 rpc server 必须使用同一语言,因为需要对调用过程在API层面进行封装 |
服务发现 | DNS 服务 去解析域名 | 一般会有专门的中间服务去保存服务名和 IP 信息,比如 Consul、Etcd、Nacos、ZooKeeper |
连接池机制 | 支持连接池复用的,也就是建立一定数量的连接不断开,并不会频繁的创建和销毁连接 | 支持连接池复用 tcp connect pool |
其他功能 | 无 | 封装了服务发现 负载均衡 熔断降级 异常处理 动态代理 |
代码层面 | 使用HTTP协议调用远程方法比较复杂,要封装各种参数名和参数值,url port http.Post(url, "application/x-www-form-urlencoded", payload) | RPC要求在调用方中放置被调用的方法的接口。调用方只要调用了这些接口,就相当于调用了被调用方的实际方法,十分易用,屏蔽掉了复杂的参数 url 封装,可以就像调用本地方法一样,方便地调用远程方法 public User getUserById(Long id) { return userConsumer.getUserById(id); // 这是远程调用,逻辑是用户小组的服务实现的。看不到http.Request(url)之类的代码 } |
适用场景 | 第三方平台提供http接口 | 公司内部微服务之间调用,不需要太考虑通用性,只要公司内部保持格式统一即可 |
常见的注册中心有很多种,比如zookepper、eureka、nacos、consul等。
注册中心的原理不是本文的重点,因此不做详细描述。
123