基于Netty的非阻塞REST框架

22

我正在开发一个需要高可扩展性的RESTful应用程序。我考虑使用基于Netty的框架来实现RESTful应用程序。我查看了一些可用选项,并尝试了解它们作为非阻塞实现能够提供什么。以下是我的发现:

  1. rest.li --> 还处于基于Netty的NIO实现的试验阶段,因此不适合生产环境。
  2. RESTEasy --> 标准的JBoss项目,支持Netty 4.x。但是,RESTEasy只是Netty和RESTEasy之间的缓冲交换,而不是全面采用基于Netty的NIO实现。因此,可扩展性并不像从一个基于Netty的框架所期望的那样高。
  3. Netty-http 组件 --> 另一个选择是使用Netty-http组件作为端点将请求路由到从bean中公开的服务时,与Apache Camel集成。我认为这与RESTEasy相同,只是Netty-http组件使用了基于Netty的NIO功能,而系统的其余部分将使用旧的IO。我不认为它会在获得可扩展性方面有所帮助。
  4. RESTExpress --> 它声称是基于Netty的RESTful应用程序框架。但是,它既没有一个体面的社区,也不能被信任(因为它非常新)用于需要高度安全性的企业应用程序。

在了解上述发现之前,我想使用一些现成的框架来更快地完成工作。

我知道这是一个基于意见的问题。但是,我仍然真诚地需要帮助选择适合我的应用程序的正确框架。如果没有基于Netty的REST框架:那么是否明智去编写基于低级别的Netty NIO代码来实现?感谢您的帮助。


你可能会感到惊讶,BIO 在处理短请求(即没有保持连接或 WebSocket)的情况下通常比 NIO 更有效。大多数 REST 客户端甚至 REST 本身都是短请求。 - Adam Gent
2
使用NIO REST框架并不能让您的应用程序神奇地具有可扩展性。使您的应用程序无状态并正确使用缓存头是一个不错的开始。 - eiden
@eiden 我已经开始使用具有远程功能的Akka-Actors来创建高度可扩展和分布式的应用程序。我只是想摆脱Servlet-API的阻塞特性。我已经开始尝试使用Spray + Akka Actors。 - Vaibhav Raj
7个回答

14

如果你真的想要非阻塞,你需要从头开始进行非阻塞,并拥有适当的REST客户端(proper REST clients)。否则,如我在我的评论中所述,性能差异将是可以忽略不计的,在许多情况下,NIO(Netty with thread sharing)的性能会更差。

我只知道两个库是从头开始进行非阻塞操作的Vert.xFinagle(它缺少其他东西,如非阻塞数据访问)。

你还应该知道Tomcat和其他各种支持JAX-RS的servlet容器支持NIO。问题在于,即使支持NIO,每个请求仍将是单线程的。只有Play、Finagle、Vert.x和纯Netty(无论是否使用NIO)支持不同的共享线程模型,因此具有不同的并发处理机制。


我不明白你所谓的“Proper REST client”是什么意思。你能否详细说明一下?感谢您的回复。 - Vaibhav Raj
1
我已经编辑了答案并添加了一个链接。我的意思是支持持久连接或完全使用不同的协议。Node.js和整个非阻塞/单线程事件循环的主要动力是因为持久连接变得越来越普遍(Websockets,Comet等)。几乎所有传统的Java REST服务都会因为线程/请求而在处理长时间运行的10,000个请求的流式REST API时出现问题,无论NIO如何。话虽如此,大多数REST客户端将作为请求执行GET / POST / DELETE / PUT,然后立即关闭连接。 - Adam Gent

6

3
你看过Play吗?
如果你想要使用 Netty,但是如果你愿意尝试一个非常简单的Grizzly + Jersey设置,它也能表现的足够好。另外,一个简单的 Glassfish 4.0 JAX-RS 应用程序也可能效果不错。

1

Spring 5带来了一个名为WebFlux的响应式Web框架。您可以选择多个服务器,如Netty或Undertow。Spring还添加了一个响应式非阻塞WebClient,并且它还支持响应式Mongo、Redis和Cassandra(我猜很快会有更多)。

Spring Boot是Spring的“有见地的观点”,也将推出基于Spring 5的新版本(2.0)。在撰写本文时,预计将于二月发布。

有关Spring响应式堆栈的更多信息:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html


0

您可以查看Spring Framework 4.2.5.RELEASE中的AsyncRestTemplate。它可以在Netty之上使用。

注意:默认情况下,AsyncRestTemplate依赖于标准JDK设施来建立HTTP连接。您可以通过使用接受AsyncClientHttpRequestFactory的构造函数来切换到使用不同的HTTP库,例如Apache HttpComponents、Netty和OkHttp。


0

Undertow 3.0 将置于Netty(而非 XNIO)之上。这是一个完美的、超级轻量级、简单的 API,可以构建像 REST API 服务器这样的应用程序。我几乎在所有的 Java 微服务中都使用它。


1
Undertow 3 repository在过去的8个月中没有太多活动。是时候寻找新的替代品了。 - Robert

0

还有一个使用Netty和RxJava的框架,它叫做datamill

如果你对使用函数响应式风格构建Web应用程序感兴趣,那么应该考虑它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接