`

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都有用的不错的,迁来迁去,关键是你的人对哪个更熟悉。

分享到:
评论

相关推荐

    Restful、SOAP、RPC、SOA、微服务之间.docx

    Restful、SOAP、RPC、SOA、微服务之间的知识点摘要 一、Restful * 定义:Restful 是一种架构设计风格,提供了设计原则和约束条件,而不是架构,而满足这些约束条件和原则的应用程序或设计就是 Restful 架构或服务...

    REST与RPC的区别.pdf

    ### REST与RPC的区别详解 #### 一、概述 在现代软件开发中,特别是分布式系统设计领域,REST(Representational State Transfer)与RPC(Remote Procedure Call)是两种非常重要的服务调用方式。这两种方法各有...

    SOAP webserivce 和 RESTful webservice 对比及区别

    在客户端支持上,无论是SOAP还是RESTful服务,现代的客户端技术如AJAX、Flex、JavaFX、AIR等都能提供支持,它们可以通过XMLHttpRequest或HTTPService等组件与服务进行通信。不过,直接调用Servlet通常是J2EE服务器端...

    JSONRPC

    1. **轻量级**:JSONRPC通常比RESTful更轻量,因为请求和响应结构简单,适合低延迟、高吞吐量的场景。 2. **方法调用**:JSONRPC使用函数调用语义,而RESTful基于HTTP方法(GET、POST等),前者更直观,后者更符合...

    JSON-RPC.rar+服务客户端通信+微服务架构应用

    JSON-RPC与RESTful服务对比 JSON-RPC客户端开发 JSON-RPC服务器端开发 JSON-RPC安全性考虑 JSON-RPC跨域资源共享CORS JSON-RPC与WebSocket结合使用 JSON-RPC在微服务架构中的角色 JSON-RPC高级特性:通知与订阅 JSON...

    RPC(远程过程调用)

    - RESTful API:虽然不是严格的RPC,但可以实现类似的功能,通过HTTP协议进行资源操作。 5. **RPC的优势与挑战**: - 优势:简化编程模型,隐藏网络通信细节,提高开发效率。 - 挑战:错误处理复杂,网络延迟,...

    RESTful WebServices中文版 完整清晰版

    本书包括以下内容: ·强调Web基础技术的力量 —— HTTP应用协议、URI命名标准与XML标记语言 ·介绍面向资源的架构(ROA),设计RESTful Web Services的常识规则集合 ·揭示RESTful的设计如何比远程过程调用(RPC)...

    理解RESTful架构、Hessian简介、机制、Webservice及cxf介绍

    CXF是一个流行的开源框架,支持SOAP和RESTful两种风格的服务,提供了完整的Web服务栈,包括服务发布、客户端调用、WSDL生成等功能,使得开发者可以轻松地构建和消费Web服务。 总结来说,RESTful架构提供了一种简洁...

    使用jsonrpc

    JSON-RPC(JavaScript Object ...理解和掌握JSON-RPC,无论是从协议层面还是实现层面,都能增强开发者在分布式系统和API设计中的能力。通过阅读源码和使用相关工具,可以更好地理解和应用JSON-RPC,提高开发效率。

    JsonRpc小实例

    7. JSON-RPC与RESTful API对比:虽然两者都是实现客户端和服务器间通信的方式,但JSON-RPC更侧重于方法调用,而RESTful API则基于资源操作,使用HTTP动词(GET、POST、PUT、DELETE等)来表示对资源的操作。...

    RESTful_Web_Services中文版

    - **优势**: 与传统的RPC(Remote Procedure Call)相比,ROA更加简单、灵活且易于扩展。 #### 五、REST式设计的优点 - **简单性**: REST遵循简单原则,避免复杂的协议和状态管理。 - **多功能性**: REST允许多种...

    java 使用json-rpc

    随着Web应用程序的发展,前后端分离的架构越来越普遍,JSON-RPC作为轻量级的远程调用协议,可以很好地解决前后端交互的问题,特别是在需要跨域调用时,JSON-RPC比传统的HTTP RESTful API更加便捷。 ### 应用前景和...

    RESTful架构风格概述

    ### RESTful架构风格概述 #### 1. RESTful架构风格 RESTful架构风格是由Roy T....随着云计算和移动计算的发展,许多企业和组织开始将...无论是对于开发者还是最终用户来说,RESTful API都提供了一种直观易用的交互方式。

    RESTful_Web_Services中文版.pdf

    《RESTful Web Services中文版》一书深入探讨了REST架构风格在现代Web服务设计中的核心作用,由Leonard Richardson撰写,他不仅是《Ruby Cookbook》的作者,还是包括Beautiful Soup在内的多个开源库的开发者。...

    sofa-rpc,sofarpc是一个高性能、高扩展性、生产级的java rpc框架。.zip

    5. **多协议支持**:除了传统的基于HTTP的RESTful接口,SOFA-RPC还支持基于TCP的SOFA协议,提供更高效的数据传输。 6. **丰富的生态**:作为阿里巴巴开源家族的一员,SOFA-RPC与Spring Cloud、Dubbo等其他开源项目...

    基于 Java Spring 将上述类的方法对外提供 RESTful 服务并调用

    在本教程中,我们将探讨如何基于 Java Spring 框架将一个特定的类的方法对外提供 RESTful 服务并进行调用。首先,我们有一个名为 `Person` 的类,包含姓名 (name)、年龄 (age) 和性别 (gender) 属性,以及对应的 ...

    将基于SOAP的WCF服务转成RESTful设计

    它主要用于在不同应用程序之间进行远程过程调用(RPC)。SOAP消息封装在HTTP、SMTP等传输协议之上,提供了一种标准化的方式来封装数据和错误处理。 2. WCF(Windows Communication Foundation):WCF是.NET ...

    restful api设计

    * gRPC 是现在最流行的二进制 RPC 框架之一,效率甩 XML,JSON 好几条街。 RESTful API 的应用场景: * 处理 CRUD 操作 * 实现客户端与服务端之间的通信 * 构建模型(资源和实体) RESTful API 设计的实用性: *...

    基于 Go 语言构建企业级的 RESTful API 服务 企业级go gin 开发框架 附带源码

    "基于 Go 语言构建企业级的 RESTful API 服务企业级go gin 开发框架 附带源码" 本小册将指导读者如何使用 Go 语言构建企业级的 RESTful API 服务,涵盖了从准备阶段到部署阶段的各个流程。小册的内容包括如何安装和...

Global site tag (gtag.js) - Google Analytics