什么是RPC
PRC全称是Remote Procedure Call,即远程过程调用。比如我发送了一个 rpc 请求:POST /getUser?user_id=123;相当于是我本地的电脑调用了远在服务器的 getUser(user_id) 方法,这就叫远程过程调用,这个远不一定是跨网络的调用,同一台电脑的2个进程之间调用也可以称为是RPC;
还有一点,RPC也是一种“API设计风格”,因为rpc只有GET 和 POST 请求,它不像restful风格那样有多种请求: DELETE、PUT、GET、POST;
RPC 和 Dubbo
rpc和dubbo比起来,rpc更像是一种编程细想或者是通信方式(RPC不是协议),而dubbo是rpc的一种实现方式,就像接口和实现类一样,rpc是接口,dubbo是实现类;我们常说Dubbo是阿里巴巴开源的RPC框架,就是这个道理。另外在说一下,dubbo是阿里巴巴在2011年开源,2018年2月后阿里巴巴将Dubbo开源项目捐给了 Apache基金会,从此以后,Dubbo正式进入Apache开源孵化器;Dubbo就不在属于阿里巴巴,而是属于社区的;
还有一点需要说明的是,dubbo即是框架也是协议;只不过dubbo协议只能在dubbo框架上使用,这个协议是阿里巴巴自己实现的一种应用层协议,传输层还是TCP。所以Dubbo协议与HTTP、FTP,SMTP这些应用层协议是并列的概念。除了默认的Dubbo协议,Dubbo框架还支持RMI、Hessian、HTTP等协议。
dubbo协议和http协议
首先,dubbo 和http协议都是基于tcp开发出来的,而dubbo是高性能和透明化的RPC远程服务调用方案,为什么叫高性能,就是因为它传输的信息更少,少就意味着更快,你提着一块10斤重的石头 和 提着一个一斤的石头跑,你说哪个快? 但是dubbo的协议是基于java的序列化开发而来的,虽然快,但是应用面比较窄,只能在dubbo框架上使用;但是http就不一样了,http的应用非常广泛,我用http协议可以和各种不同语言开发的服务器进行通讯,比如java调用python的服务肯定没问题, 但是dubbo就不行了,因为dubbo不支持python;虽然http也是基于tcp开发的,但是和dubbo比起来就显得重了很多;因为dubbo除了传输数据之外就没别的东西了,而http除了数据之外还有一堆的请求头(request)和响应头(response),这无疑会加重传输的负担;除此之外,如果是html的http请求,在发送请求和响应时会先将数据转成json在序列化,相比dubbo之下增加了一重转换,如下图
所以,相同的数据量进行传输时,dubbo 比 http 快了将近一倍,只是在当今的计算机环境下, 这多一点开销对公司来说不算什么,如果是需要特别快速的需求,像秒杀类的商品抢购,用dubbo是最合适的,其他场景用http 也够用了;
安全性
从安全性来说,dubbo肯定没有http安全,但是也不需要,因为dubbo从设计之初就是为了在内网使用,所以不需要考虑安全性;
dubbo 和 spring cloud
1、dubbo由于是二进制的传输,占用带宽会更少
2、springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大
3、dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决
4、springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级
5、dubbo的注册中心可以选择zk,redis等,springcloud的注册中心用eureka或者Consul
6、spring cloud 是基于spring 开发,spring本身具有非常完整的生态,与其他框架整合非常方便;易用性高;
7、dubbo没有全家桶,dubbo社区也不如spring cloud;
如果让我选,我一定用 spring cloud ,如果是你,你会怎么选呢?