由一个问题引起的思考:WEB开发中,使用JSON-RPC好,还是RESTful API好?
起因:
研究zabbix的API设计风格。查看zabbix官网API文档,可以看到使用的是json-rpc:2.0
随后搜索到知乎上的一个问题讨论:https://www.zhihu.com/question/28570307 即标题中的问题。
仔细研究,问题不断发散再发散,整理一下,以下内容是看了很多篇相关知识后的个人理解:
1、RPC是什么?
参考:https://www.zhihu.com/question/25536695/answer/221638079
RPC是指远程过程调用。服务器A要调用服务器B上的某个方法,由于内存空间不同,无法直接调用,需要通过网络来表达调用的语义和传达调用的数据。需解决以下问题:
通信问题:在服务器A与B之间建立起TCP连接(有答案说UDP也可以);TCP、UDP是属于传输层的协议
参数的序列化和反序列化:参数通过网络传输,需把服务器A内存里的内容序列化后进行传输。
方法映射:参数中包含着要调用的方法,服务器B必须建立起参数与所要调用方法的映射关系
服务器B执行完方法后返回,同样经历上述过程。
2、json-RPC是什么
json-rpc 2.0规范:http://wiki.geekdream.com/Specification/json-rpc_2.0.html
JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 本规范主要定义了一些数据结构及其相关的处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。
简单来说,就是定义了各个RPC各参数规范。如method表示方法,param表示参数。服务器B拿到这个东西就是知道了服务器A要调用什么方法,参数是什么。
它是运行在socket、http、websocket等协议之上的。注意http、websocket已经是属于应用层了。
3、什么是websocket?它和socket有什么区别?
介绍websocket: https://blog.csdn.net/wwd0501/article/details/54582912
websocket首先是一个应用层协议,这点与http相同。
与http不同的是,它可以建立服务器A与服务器B之间的一个长连接(类似于TCP中的长连接),之后可以发送多个请求。而http每一个请求都是独立的。据介绍,websocket建立长连接时,使用http,之后的请求与返回,则不需要http协议了。
socket是传输层与应用层之间的一个抽象层,为应用层屏蔽了传输层复杂的协议。
4、什么是RESTful?
restful是一种API设计风格。这里可以发现,其实restful和json-rpc其实是没有可比性的。其对比的应该是RPC.
restful必须依赖于http,因为它需要http请求的类型(post、get、put、delete)来标榜对该资源进行如何的处理。
restful设计难点:需要将所有的接口抽象成某种资源
如想delete多个id怎么办?全部写在url中吗(delete没有body)?不,你应该把删除多个ID抽象成某个任务(即抽象成另一种资源),然后对这个资源使用post。比如用户的登录和登出,不适合对用户这个资源进行操作,应该抽象成对session这个资源进行操作。
想使用restful必须要有这样的抽象能力。。
知乎对restful一个总结(个人觉得挺到位的):
看Url就知道要什么(资源)
看http method就知道干什么
看http status code就知道结果如何
一定要有以资源为主体的思维。之前也有人说过restful是名词,rpc是动词,大概想表述的也是这个意思。
5、知乎中有人说json-rpc性能比restful好?
其实是json-rpc能运行在类似于websocket上,是websocket的性能比http好。这种说法有点问题。
像zabbix,json-rpc底层承载还是使用http,反而需要序列化和反序列化的时间,性能好?不见得吧。
6、说回zabbix,其API设计风格到底是咋样的?
首先,开放的API都是使用http的post方法调用的,post的参数遵循json-rpc2.0的规范。如果把所有的API接口看成一种资源,那它的这个API可以说是遵循了restful风格。
其次,最新奇的一点来了,其API的URL只有一个!!只有一个!!格式如下:
POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc
{"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}
去看了api_jsonrpc.php,这个php脚本要解决的就是,首先拿到http的body数据,接下来用json-rpc2.0规范去解析,拿到method到底是什么,接下来去调用相应的方法。这个脚本做的就是RPC中提到的要解决方法映射问题。
有意思的是,method全都是以这样的形式A.B,给人一种感觉,A是类,B是A中某个方法。zabbix中所有的方法都用php脚本实现了,对应的每一个A都是独立的一个php文件,B是A中的某个方法,且名称是一一对应的,即无需维护参数中的名称与调用方法的映射关系。
假设不使用zabbix的Php脚本来实现类似的功能,使用类的getMethod的方式,通过反射来调用个人觉得也是可行,当然方法名称自然也是要一一对应的。
暂时不能理解,为什么zabbix要这样设计(仅用一个URL,在json-rpc的method字段去标注具体的方法)?或者这样设计的好处在哪里?知乎上有人这样说:
我见过最高明的restful设计,是只使用一个url,然后,用post请求,传method动词参数。可谓一个restful在手,打遍天下无敌手。
这难不成说的就是zabbix????
最后,引用知乎上的一段话:
所谓代码风格、接口形式、各种林林总总的格式规定,其实都是为了在团队内部形成共识、防止个人习惯差异引起的混乱。JSON-RPC当然也是有规范的,但相比REST实在宽松太多了。
如果一个开发团队规定必须在url里写action,所有请求都是POST,可以吗?当然也没问题,只是不要拿出去标榜自己写的是RESTful API就行。
规范最终还是为了开发者和软件产品服务的,如果它能带来便利、减少混乱,就值得用;反之,如果带来的麻烦比解决的还多,那就犯不上纯粹跟风追流行了。(作者:Vincross 链接:https://www.zhihu.com/question/28570307/answer/163638731)
---------------------
作者:x6696
来源:CSDN
原文:https://blog.csdn.net/x6696/article/details/81839893
版权声明:本文为博主原创文章,转载请附上博文链接!
由一个问题引起的思考:WEB开发中,使用JSON-RPC好,还是RESTful API好?的更多相关文章
- MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得。
MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得. 之前的项目比较简单,多是用JSP .Servlet + JDBC 直接搞定,在项目中尝试用 Strut ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- Java Web开发中路径问题小结
Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...
- Web开发中的18个关键性错误
前几年,我有机会能参与一些有趣的项目,并且独立完成开发.升级.重构以及新功能的开发等工作. 本文总结了一些PHP程序员在Web开发中经常 忽略的关键错误,尤其是在处理中大型的项目上问题更为突出.典型的 ...
- Java Web 开发中路径相关问题小结
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...
- Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)
看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...
- Web 开发中很实用的10个效果【附源码下载】
在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...
- WEB开发中的字符集和编码
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Web 开发中很实用的10个效果
在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...
- 今日推荐:10款在 Web 开发中很有用的占位图片服务
设计网站时,将要使用的图像在一开始通常还不存在,这个时候布局是最重要的.然而,图像的尺寸通常是预先设置,实用一些占位图像可以帮助我们更好地预览和分析布局. 如今,有免费的占位图片自动生成工具可以使用, ...
随机推荐
- SpringMVC数组参数
前端 var moduleids = moduleArr.join(','); //一定要切换成,分割的字符串传到后台 后台 @RequestParam List<String> modu ...
- vue单页面应用中动态修改title
https://www.jianshu.com/p/b980725b62e8 https://www.npmjs.com/package/vue-wechat-title 详细信息查看:vue-wea ...
- PHP生成json
索引数组 <?php //json_encode(数组/对象) $color = array('red','blue','green'); echo json_encode($color); / ...
- qt 操作串口
第三方类下载 https://sourceforge.net/projects/qextserialport/files/ 目录介绍 搭建工程 拷贝qextserialbase.cpp.qextser ...
- JavaWeb 使用Session实现一次性验证码
表单 <form action="loginServlet" method="post"> 请输入验证码:<input type=" ...
- JVM Code Cache空间不足,导致服务性能变慢
本文阅读时间大约5分钟. 有业务反馈,线上一个应用运行了一段时间之后,在高峰期之后,突然发现处理能力下降,接口的响应时间变长,但是看Cat上的GC数据,一切都很正常. 通过跳板机上机器查看日志,发现一 ...
- oracle linux 7 yum报错解决:COULD NOT RESOLVE HOST: YUM.ORACLE.COM
虚拟机中yum报错 [root@localhost ~]# yum -y install oracle-rdbms-server-11gR2-preinstall Loaded plugins: la ...
- SpringCloud学习第三章-springcloud 父项目创建
父项目 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- Springboot入门及常用注解
1.微服务:一个项目 可以由多个 小型服务构成(微服务)2.spring boot可以快速开发 微服务模块 a.简化j2ee开发 b.整个spring技术栈的整合(整合springmvc spring ...
- 将积累多年的java学习资料,pdf文档给大家分享一下,比如《大话设计模式》《算法》《Linux私房菜》等等
话不多说,资料目录如下,需要的拿走,下载的同时别忘了点下推荐. 需要的点下面链接,到小编网盘进行下载: 2-大话设计模式.pdf 链接:https://pan.baidu.com/s/1b05puNO ...