REST已然成为最流行的提供外界服务API的方式。同时,随着互联网和物联网的普及,如今的应用需要处理大量并发的请求。因此,开发高性能REST服务已经成为一个成功应用的必备条件。
我这里集中讨论Java和JVM相关技术。基于Java的REST应用比基于python和ruby的应用往往具备更好的性能。而另外一些新兴的语言如Go超出了讨论的范围。
标准
JAX-RS是Java世界定义REST API的通用标准。Jersey 是JAX-RS的官方实现,(其他实现如rest-easy)。这是一个简单的Jersey REST GET例子。
@Path("myresource") public class MyResource { /** * Method handling HTTP GET requests. The returned object will be sent * to the client as "text/plain" media type. * * @return String that will be returned as a text/plain response. */ @GET @Produces(MediaType.TEXT_PLAIN) public String getIt() { try { Thread.sleep(100); // do some job } catch (InterruptedException e) { e.printStackTrace(); } return "Got it!"; } }
标准Jersey及其底层servlet实现最大的问题是每处理一个讲求,就需要一个相应的Socket线程处理。在成千上万的并发请求下,系统性能将会明显下降。
异步
为了解决这个问题,JAX-RS提出了异步的解决方案。在这种模式下,请求线程和用户连接之间的联系被打破。I/O容器不再假设等待请求完成,在关闭连接。这是上面简单的Jersey REST GET例子的异步实现:
@Path("myresource") public class MyResource { @GET @Produces(MediaType.TEXT_PLAIN) public void asyncGet(@Suspended final AsyncResponse asyncResponse) { new Thread(new Runnable() { @Override public void run() { String result = veryExpensiveOperation(); asyncResponse.resume(result); } private String veryExpensiveOperation() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } return "Got it!"; } }).start(); } }
非阻塞
标准Jersey及其底层servlet实现最大的问题是每处理一个讲求,就需要一个相应的Socket线程处理。在成千上万的并发请求下,系统性能将会明显下降。
为了解决这个问题,JAX-RS提出了异步的解决方案。在这种模式下,请求线程和用户连接之间的联系被打破。I/O容器不再假设等待请求完成,在关闭连接。这是上面简单的Jersey REST GET例子的异步实现:
@Path("myresource") public class MyResource { @GET @Produces(MediaType.TEXT_PLAIN) public void asyncGet(@Suspended final AsyncResponse asyncResponse) { new Thread(new Runnable() { @Override public void run() { String result = veryExpensiveOperation(); asyncResponse.resume(result); } private String veryExpensiveOperation() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } return "Got it!"; } }).start(); } }
使用异步技术可以大幅提高吞吐量,但是后端的工作已然需要创建独立的线程完成。系统的负担已然很大。
另外一种完全不同的实现是把“非阻塞”应用到方方面面,不仅仅是HTTP请求处理。在这种模式下,系统仅仅需要少量线程来检测事件的发生。使用这种方法最为重要的是将任务分解为一个个小部分。每个部分的执行事件非常短。Vert.x就是这样一个非阻塞,事件驱动,跨语言的开发框架。Node.JS则是另外一个JavaScript领域很流行的非阻塞框架。
上面简单REST服务的Vert.x实现如下
public class RestServer extends Verticle { public void start() { RouteMatcher rm = new RouteMatcher(); rm.get("/myapp/myresource", new Handler() { public void handle(final HttpServerRequest req) { // sleep 100 ms vertx.setTimer(100, new Handler() { public void handle(Long timerID) { req.response().end("Got it"); } }); } }); vertx.createHttpServer().requestHandler(rm).listen(8080); } }
我这里比较了jersey同步,异步和vert.x的实现。这里的服务实现工作100毫秒,然后返回结果。我使用gatling模拟了1000个用户并发,每个用户重复请求100次。测试结果显示vertx具有最高的吞吐率(即每秒中完成请求次数)5K和最低的平均时延105ms。Jersey异步居中,达到1K的吞吐量和300ms的平均时延。Jersey同步表现最差,吞吐量只有70,平均时延高达12秒。完整的例子在我的github项目vertx-jersey-benchmark。当然,这不意味着Vertx是所有人的最佳选择。Vertx也有很多问题。例如,Vertx缺少JAX—RS那样方便易懂的annotation来描述服务资源路径,参数等等。有一个第三方模块vertx-jersey试图将vertx和jersey集成。但是目前它的性能和jersey同步的性能差不多。
相关推荐
REST(Representational State Transfer)API是H3C CAS系统提供的一种接口方式,用于允许外部应用程序与CAS系统进行交互,实现系统的集成和二次开发。通过REST API,开发者可以远程操作和管理H3C CAS中的各种资源,...
8. 使用Spring的Etags实现REST:本节阐述了如何使用Etags来缓存控制,优化REST API的性能。 9. Spring中的REST分页:这部分讲解了如何在Spring中实现REST API的分页功能,使得客户端可以更方便地处理大量的数据集。...
**ActiveMQ与REST API实践** ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循开放消息中间件标准——Java Message Service(JMS)。ActiveMQ以其高性能、稳定性和丰富的特性在分布式系统中广泛使用,...
根据提供的文件信息,本文将对“Rest api下载”这一主题进行深入探讨,并结合描述与链接内容,提炼出关键知识点。 ### 一、Rest API简介 REST(Representational State Transfer)是一种网络应用程序的设计风格和...
10. **监控与日志**:部署后,对API性能、错误率、响应时间等进行监控是必要的。日志记录可以帮助排查问题,如使用Log4j、Logback等日志系统。 综上所述,配置Rest API服务器涉及多种技术和实践,从服务器环境的...
**跨平台的 REST API 客户端 Insomnia** Insomnia是一款功能强大的跨平台REST API测试和调试工具,专为开发者设计,便于与Web服务进行交互。它基于Electron框架构建,这意味着它能够运行在Windows、MacOS和Linux等...
"Total Control REST API 脚本助手"是一个专为开发者设计的工具,旨在简化REST API的测试和管理过程。此工具提供了对RESTful API的全面控制,帮助用户进行模拟请求,执行基本操作,并且能够快速捕获接口响应的截图,...
标题中的“可轻松与REST API集成的GraphQL指令”是指一种特定的GraphQL工具或技术,它简化了在GraphQL服务中对接RESTful API的过程。GraphQL是一种强大的查询语言,它允许客户端定义他们需要的数据,而不是服务器...
REST API的优点:缓存Cache提高响应性能,本身的“无状态”和“扩展性”,不需要额外的资源发现机制 REST 、DO、RPC之间区别对比 REST与CORBA、SNMP、SOAP比较 腾讯开放平台REST API 示例 通过URL来设计系统...
在IT行业中,C# REST API开发是构建现代网络服务的核心技术之一。REST(Representational State Transfer)是一种架构风格,用于设计分布式系统,尤其是Web服务。本篇将详细讲解如何使用C#来创建一个REST API,并...
使用像Postman这样的API测试工具,可以帮助调试和测试SharePoint REST Search API请求,确保正确性和效率。 总之,SharePoint REST Search API为开发人员提供了一种强大而灵活的方式来整合和扩展SharePoint的搜索...
总之,REST API接口测试工具如Advanced REST Client是开发者和测试人员不可或缺的工具,它们帮助确保REST API的质量、性能和安全性。了解和熟练使用这些工具,对于提升Web服务的开发效率和质量具有重要意义。
9. **分页与性能优化**:对于大量数据,REST API支持分页查询,通过`?offset`和`?limit`参数控制返回结果的数量。此外,使用正确的过滤策略和缓存机制也是提高性能的关键。 10. **版本管理**:Odoo的REST API可能会...
这个"REST api demo"项目提供了学习和实践REST API设计和实现的一个基础平台,对于理解如何将这些技术结合使用以构建现代Web服务非常有帮助。通过深入研究和扩展这个项目,开发者可以更好地掌握RESTful API设计原则...
### Elasticsearch与ES-RestAPI技术概述 #### 一、Elasticsearch简介 Elasticsearch是一款高性能的分布式搜索和分析引擎,适用于实时数据处理场景。它基于Lucene构建,提供了强大的分布式多用户全文检索功能,通过...
RESTful API,全称为Representational State Transfer,是一种网络应用程序的设计风格和开发方式,基于HTTP协议,用于...此外,还可以了解到如何与数据库交互、进行身份验证和授权,以及如何优化API性能等高级话题。
### REST API开发详解 #### REST概述 REST(Representational State Transfer),即表述性状态转移,是一种用于设计网络应用和服务的架构风格。它基于一套简单的原则和规则,利用现有的网络协议和标准来构建灵活且...