一个虐你千百遍的问题:“RPC好,还是RESTful好?”
看到知乎上有这样一个问题
WEB开发中,使用JSON-RPC好,还是RESTful API好?
还有其他优秀的推荐方案吗?
-----------------------------------------------------------------
先科普一下
REST 和 RESTful 什么区别?
REST,即Representational State Transfer的缩写。翻译过来是表现层状态转换。
如果一个架构符合REST原则,就称它为RESTful架构。
啥叫json-rpc?
接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等;通信比较流行的是http、soap、websockect,RPC通常基于TCP实现,常用框架例如netty。
RESTful通常采用http+JSON实现。
JSON-RPC是指通信协议采用二进制方式,而不是http,序列化采用JSON的形式。
被赞的最多的一个回答
翁伟 262 人赞同
JSON-RPC比RESTful API好很多。
======
我厌恶restful API如同我厌恶OOP;但与其说我厌恶restful,倒不如说我厌恶鼓吹restful API的一些伪·程序员。
很多鼓吹restful API的程序员,实际上并不理解restful的设计理念,纯粹是在人言亦言,随便看了几篇网文在说restful,自己便也更着鼓吹。
做为一个合格的技术人员,最基础的要求是要对自己所使用的技术有了解,明白各种技术的适用场景,然后因地制宜。
restful首先是要求必须把所有的应用定义成为“resource”,然后只能针对资源做有限的四种操作。
这是对API一个非常糟糕的抽象,有太多现实中需要的API,无法顺当的融入到restful所定义的规范中。
比方说,user login / resetpassword等等。
restful的信徒,他们会说可以根据这个那个规范,把login / password等也纳入为某种资源,然后进行增删改查。这在我看来,纯粹是在解决一些原本不存在,根本不需要解决的问题,纯浪费。
所有的接口,服务器端原本就存在有相应的函数,它们本来就有自身的命名空间,接受的参数、返回值、异常等等。
采用轻便的方式暴露出来即可。
无需把一堆函数重新归纳到“资源”,再削减脑袋把所有的操作都映射为“增删改查”。
对应到web上,rpc的成熟方案非常多,有古老的soap,也有轻量的json rpc。
JSON rpc基本上仅是要求所有的请求必须有msg id,有函数名,然后可定义参数,并且区分返回值与异常;也可定义『命名空间』来对函数模块做划分。
这与大多数语言的模块、函数定义相符,使用起来是非常便利的。
很多json rpc是供web前端ajax调用,若前端调用抽象得当,调用远程API,实际上与调用本地函数无甚区别。
实际上,json rpc也未必需要跟http绑定,即便是在web上,它也可以走web socket,这样子,前端可以使用同一web socket管道批量发送请求,而服务器端乱序返回结果时,前端也可以根据msg id做准确的回调。
websocket,批量调用,乱序返回,这些都可以显著提高API的输出吞吐,这些是在json rpc的设计考量内。
调用更方便,性能也更好,两全其美是完全可能的。
想当然的为了“快”,为了“简单”就必须牺牲别的,这是严重的思维误区。
有些方案,纯粹就是糟糕的方案。
restful API仅适用与业务非常简单的场景,比方说,就是为了提供少量数据表单的增删改查。而这种场景实在是太过简单,实际中几乎找不到。
----------------------------------------------------------
我的观点
实际上,这个问题本质上是RESTful和RPC之争。这两种风格都是随着架构发展而来。分别适用不同的场景。
http vs 高性能二进制协议
http相对更规范,更标准,更通用,无论哪种语言都支持http协议。如果你是对外开放API,例如开放平台,外部的编程语言多种多样,你无法拒绝对每种语言的支持,相应的,如果采用http,无疑在你实现SDK之前,支持了所有语言,所以,现在开源中间件,基本最先支持的几个协议都包含RESTful。
RPC协议性能要高的多,例如Protobuf、Thrift、Kyro等,(如果算上序列化)吞吐量大概能达到http的二倍。响应时间也更为出色。千万不要小看这点性能损耗,公认的,微服务做的比较好的,例如,netflix、阿里,曾经都传出过为了提升性能而合并服务。如果是交付型的项目,性能更为重要,因为你卖给客户往往靠的就是性能上微弱的优势。
RESTful的规范到底是不是鸡肋?
我认为,微服务的盛行,开放平台的盛行,的确让RESTful过于“流行”了。你可以看看,无论是Google、Amazon、netflix(据说很可能转向grpc),还是阿里,实际上内部都是采用性能更高的RPC方式。而对外开放的才是RESTful。
如果你的应用非常简单,无论用哪种都无所谓了,基本都能满足要求。
关于无状态、幂等
这个跟你是否采用RESTful无关,主要还是看接口内部实现,所以,把这个作为RESTful优点的可以闭嘴了。
安全性
显然,基于Http更安全一些,默认80端口,防火墙友好。
RESTful也分为严格的和自由的
RESTful还有个好处是制定了一系列规范,但是大多数使用者都是自由风格的,根本不是严格按照RESTful规范实现。当然存在就是道理,这样做更高效,但是不够通用。
无疑,严格按照资源抽象,API看起来更清晰,更容易被大家理解。同时,开发人员的复杂度也更高。
最后建议
对外开放给全世界的API推荐采用RESTful,是否严格按照规范是一个要权衡的问题。要综合成本、稳定性、易用性、业务场景等等多种因素。
内部调用推荐采用RPC方式。当然不能一概而论,还要看具体的业务场景。
另外一个因素是人,关键是你有什么人,postgresql、mysql都有用的不错的,迁来迁去,关键是你的人对哪个更熟悉。
感兴趣的可以去知乎看原文:http://www.zhihu.com/question/28570307
一个虐你千百遍的问题:“RPC好,还是RESTful好?”相关推荐
- 那些曾虐我千百遍的计算机组成原理
那些曾虐我千百遍的计算机组成原理 本笔记知识点来源于b站狂神说:聊汇编先导课,有兴趣的小伙伴点这里:狂神聊汇编先导课 文章目录 那些曾虐我千百遍的计算机组成原理 进制的本质 有符号数和无符号数的区别 ...
- Maven 虐我千百遍,我待 Maven 如初恋 侵删
前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...
- 客户虐我千百遍,我待客户如初恋
误闯误撞,进入了IDC行业,从事了服务器租用及托管的销售工作.很多人问我,什么是IDC,什么是服务器?我知道我解释的过于专业那么会有更多的问题,毕竟自己也不是百科全书,只好简答回复"没有显示 ...
- 我待数据如初恋,数据虐我千百遍
我待数据如初恋,数据虐我千百遍 1.几个基础概念 1.1表达式 1.2语句 1.3程序 1.4函数 2.标识符 2.1关键字 2.2标识符的构成 3.基本数据类型 3.1整数和小数 3.2 布尔值和空 ...
- VMware虐我千百遍,我却待她如初恋
文章目录 一.相关环境 1.操作系统 2.VMware版本 二.我遇到过的bug 1.VMCI驱动程序无法自动安装,需要手动安装 2.Vmware提示以独占方式锁定此配置文件失败 3.VMware提示 ...
- 算法虐我千百遍,我待算法如初恋
转自:算法虐我千百遍,我待算法如初恋 算法虐我千百遍,我待算法如初恋. 学习方法 1) 把所有经典算法写一遍 2) 看算法源码 3) 加入算法学习社区,相互鼓励学习 4) 看经典书籍 基本数据 ...
- 【算法虐我千百遍,我待ACM如初恋】Hail Algorithm,Hallelujah ACM!!
(谨向余光中先生致敬) 鼠标轻划标题上的永恒常量 有人好奇的看着你,朋友 太过熟悉的窗口,人们不知 那无垠的循环中,你的叮咛 人心中总有魔兽红警反恐撸啊撸 却不知你富有魅力的救赎 三百分钟即创世 何止 ...
- Maven虐我千百遍,我待Maven如初恋
前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...
- 数学歌单:数学虐我千百遍,让我至今没初恋
提起数学,很多人爱之恨之,一言难尽.数学总被人贴上严肃和枯燥的标签,其实任何事物都不能将其绝对化,数学也是如此,数学也有其美的一方面,只是缺少了发现数学美的眼睛.数学和音乐当然也有交叉点,这些歌曲你都 ...
最新文章
- Halcon 彩色图片通道分割处理
- 布线须知:机柜在数据中心机房的三个新用途
- DL之Attention:Attention注意力机制的简介、应用领域之详细攻略
- 第七课 ActionScript 3语言进阶一
- 57岁博士,第三次出征太空...
- manjaro设置java_manjaro 深度学习编程环境搭建
- 如何简单访问HTTP的GET、POST、PUT、DELETE,MOCK数据
- Android游戏开发入门基础
- gis地图php,中国地图矢量gis数据
- Android逆向之路---让我们试试另一种方法看漫画-(1)
- 迅雷下载遇到“应版权方要求无法下载”,怎么办
- Java poi生成Excel加密文件
- OpenGL ES之离屏渲染的帧缓冲区对象FBO的说明和使用
- [Phonegap+Sencha Touch] 移动开发71 Sencha项目开发、调试方法建议
- 如何成为一个优秀的程序员?
- unity3D 使用rigidbody.AddForce(movement)
- 黑猴子的家:Scala 中置类型
- 环保用电监管云平台可行性研究及解决方案-安科瑞 周莉娜
- 教你查阅Java API 英文文档(JDK 11)
- 题目详情 - 7-13 最短工期 (pintia.cn)(拓扑序bfs)
热门文章
- C#中巧用Lambda进行数据的筛选查询等处理
- Linux-用户和组管理以及设置允许远程登录Root
- Ubuntu中重启ssh服务时提示:Job for ssh.service failed because the control process exited with error code. See
- Java中将CST格式的时间字符串进行格式化
- SpringBoot+AntV实现饼状图中的花瓣图
- DataTbles中设置所有列不进行排序使用ording等不管用的解决方案
- BootStrap中对input的type自带的验证种类
- SSM中使用Druid连接池
- vue-cli-plugin-element的使用
- 需求评审五个维度框架分析及其带来的启示-总起