当前位置: 首页 > news >正文

为什么需要RPC,而不是简单的HTTP接口

转载自:http://www.oschina.net/question/271044_2155059?sort=default&p=1#answers

目前有很多Java的RPC框架,有基于Json的,有基于XML,也有基于二进制对象的。

论复杂度,RPC框架肯定是高于简单的HTTP接口的。但毋庸置疑,HTTP接口由于受限于HTTP协议,需要带HTTP请求头,导致传输起来效率或者说安全性不如RPC。

现在问题是,遇到怎样的瓶颈了才需要或者说更适合用RPC(比如像阿里这么大的请求并发量,简单的HTTP肯定达不到预期),但问题是大家所在的公司,要有像阿里这么大的量是比较少的,甚至说1/1000的量可能都没有,那我们还需要使用RPC吗?

技术应该不是为了使用新技术而去使用,而应该是旧技术存在某些瓶颈,存在难以支撑或者扩展性越老越差等问题暴露出来之后,用新技术来进行解决。

那RPC最大的优点,或者说它相比简单的HTTP接口,它的优势、更适合它的业务场景是怎样呢?简单的HTTP又哪里不足,哪些场景明显不太适合呢?

---

RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现.所以楼主可以换一个问法,为何RPC还有除HTTP 之外的实现法,有何必要.毕竟除了HTTP实现外,私有协议不具备通用性.那么我想唯一的答案就在于HTTP不能满足其业务场景的地方,所以这个就要具体 案例具体分析了.

------

http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议 进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统 一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑

---

rpc是一种概念,http也是rpc实现的一种方式。论复杂度,dubbo/hessian用起来是超级简单的。最近用dubbo和hessian比较多,http的几乎都被废弃了。

至于为什么用,其实很简单,业务场景不一样。我最早的单位所有的代码都在一个工程里,一次要发布几百m的代码。这种架构是非常有利于小程序的。但是我们为什么要应用rpc层呢,一个功能,一套代码下来不就解决了么?我觉得有几个好处:

1 灵活部署 2 解耦 至于为什么,当你用到的时候,你会体会。

系统做大了,肯定是需要做微服务的。 现在我们做电商就是这样,单独有一个订单系统,支付系统,商品系统,用户系统。都是分开部署,单独上线的。 但我们交互是用HTTP接口来交互的,我想转用RPC,但问题是我现在还没发现为什么需要用RPC,我还没能理解它的作用和意义

用http交互其实就已经属于rpc了

---------

RPC:远程过程调用。RPC的核心并不在于使用什么协议。RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于http协议,只是传输协议而已。简单的实现可以参考spring remoting,复杂的实现可以参考dubbo。

--------

RPC是一个软件结构概念,是构建分布式应用的理论基础。就好比为啥你家可以用到发电厂发出来的电?是因为电是可以传输的。至于用铜线还是用铁丝还是其他 种类的导线,也就是用http还是用其他协议的问题了。这个要看什么场景,对性能要求怎么样。比如在java中的最基本的就是RMI技术,它是java原 生的应用层分布式技术。我们可以肯定的是在传输性能方面,RMI的性能是优于HTTP的。那为啥很少用到这个技术?那是因为用这个有很多局限性,首先它要 保证传输的两端都要要用java实现,且两边需要有相同的对象类型和代理接口,不需要容器,但是加大了编程的难度,在应用内部的各个子系统之间还是会看到 他的身影,比如EJB就是基于rmi技术的。这就与目前的bs架构的软件大相径庭。用http必须要服务端位于http容器里面,这样减少了网络传输方面 的开发,只需要关注业务开发即可。所以在架构一个软件的时候,不能一定根据需求选定技术。

 

相关文章:

  • 和开源硬件相关的几个词,免费、山寨、创客教育,以及未来 | COSCon'18
  • 2018云计算行业现状及2020年云计算发展趋势
  • 当我们谈论Promise时,我们说些什么
  • 谷歌推迟公布Google+漏洞遭参议员不满
  • 今日头条完成超25亿美元融资 软银GA与KKR参与
  • iOS开发中实用的lldb命令
  • 网络时间戳
  • 昨天1024程序员节,我故意写了个死循环~
  • Git常用命令记录
  • Algs4-2.1.32运行时间曲线图
  • BZOJ 3812 : 主旋律
  • 《JavaScript实用效果整理》系列分享专栏
  • 浅谈web中前端模板引擎的使用
  • pytorch实战(2)-----回归例子
  • 柔宇科技发售可折叠柔性屏手机 平板与手机从此二合一
  • const let
  • ES2017异步函数现已正式可用
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • magento2项目上线注意事项
  • MQ框架的比较
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PV统计优化设计
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring-boot List转Page
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 代理模式
  • 关于使用markdown的方法(引自CSDN教程)
  • 简单实现一个textarea自适应高度
  • 前端_面试
  • 前嗅ForeSpider采集配置界面介绍
  • 设计模式走一遍---观察者模式
  • 深入浅出webpack学习(1)--核心概念
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​iOS实时查看App运行日志
  • ​力扣解法汇总946-验证栈序列
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (2022 CVPR) Unbiased Teacher v2
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (四)Linux Shell编程——输入输出重定向
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)Linux+Windows下安装ffmpeg
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)VC++中ondraw在什么时候调用的
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .apk文件,IIS不支持下载解决
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net refrector
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 按比例显示图片的缩略图
  • .NET关于 跳过SSL中遇到的问题