起因:

研究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好?的更多相关文章

  1. MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得。

    MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得. 之前的项目比较简单,多是用JSP .Servlet + JDBC 直接搞定,在项目中尝试用 Strut ...

  2. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  3. Java Web开发中路径问题小结

     Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  4. Web开发中的18个关键性错误

    前几年,我有机会能参与一些有趣的项目,并且独立完成开发.升级.重构以及新功能的开发等工作. 本文总结了一些PHP程序员在Web开发中经常 忽略的关键错误,尤其是在处理中大型的项目上问题更为突出.典型的 ...

  5. Java Web 开发中路径相关问题小结

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...

  6. Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)

    看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...

  7. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  8. WEB开发中的字符集和编码

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  9. Web 开发中很实用的10个效果

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  10. 今日推荐:10款在 Web 开发中很有用的占位图片服务

    设计网站时,将要使用的图像在一开始通常还不存在,这个时候布局是最重要的.然而,图像的尺寸通常是预先设置,实用一些占位图像可以帮助我们更好地预览和分析布局. 如今,有免费的占位图片自动生成工具可以使用, ...

随机推荐

  1. css实现图片信息展示

    <style> .layui-fluid{padding: 15px;} .img-responsive{display: block;width: 100%;max-width: 100 ...

  2. QT绘制B样条曲线

    ²  贝塞尔曲线 贝塞尔曲线是通过一组多边折线的各顶点来定义.在各顶点中,曲线经过第一点和最后一点,其余各点则定义曲线的导数.阶次和形状.第一条和最后一条则表示曲线起点和终点的切线方向. ²  B样条 ...

  3. Android源码分析(十六)----adb shell 命令进行OTA升级

    一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...

  4. Java中的equals与==

    package demo; public class Test { public static void main(String[] args) { String str1 = new String( ...

  5. 给easyui datebox扩展一个清空按钮,无侵入

    /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; (function ($) { var buttons = $.ext ...

  6. spoon数据转换中文乱码(kettle)

    (1) 查看mysql数据库是否为utf8(status) (2) 设置spoon (3) 文本打开spoon.bat,找到set OPT=%OPT% %PENTAHO_DI_JAVA_OPTIONS ...

  7. 在系统下文件上传报错:The temporary upload location [/tmp/tomcat.xxx/work/Tomcat/localhost/ROOT] is not valid

    线上的系统中长时间不访问时不能上传文件了,出现如下错误: 2019-03-11 23:37:42.741 ERROR 66505 --- [nio-8081-exec-3] o.a.c.c.C.[.[ ...

  8. properties文件属性值通过xml文件为 java entity属性赋值

    一.通过xml配置文件进行赋值: 举个栗子,一目了然: 1.1 properties文件: 1.2 xml配置文件,将properties属性与java entity属性相关联:(这是一个新建的xml ...

  9. Spring Boot Admin 2.1.0

    原文:https://blog.csdn.net/forezp/article/details/86105850 Spring Boot Admin简介 Spring Boot Admin是一个开源社 ...

  10. 12-赵志勇机器学习-Label_Propagation

    (草稿) 过程: 1. 初始化所有节点的 labels 成唯一的值: 2. 对每个节点,将 label 更新为和其相连的所有节点中,标签最多的 节点的label: 2. 初始化情况下,假如所有相连的节 ...