泽西REST客户端与Apache HTTP客户端4.5与改造
我正在阅读许多文章,以找到最佳休息客户端的Java应用程序,我发现最终使用泽西与Apache HTTP客户端4.5是伟大的,但在很多文章中,我发现,现在改进是最好的(我没有提到 Volley,因为在我的情况下,我不需要API支持缓存。泽西REST客户端与Apache HTTP客户端4.5与改造
改进对于java客户端应用程序更好吗?还是只是更好的android?和为什么我以前没有找到这个比较..他们不能比较?
我可以比较他们的性能,连接池,他们在哪一层工作,压缩的请求和响应,超时,反序列化?
HTTP3不支持连接池,这就是为什么翻新通常用于android?所以对于普通的Java应用程序来说,它会导致连接泄漏,这是不实际的。
我的目标是找到具有高性能的最佳Rest API客户端,并支持大量的连接。
谢谢你提前
你在混合不同的东西在一起。首先要清除的事情:
Retrofit是一个与REST API交互的客户端库。因此它提供了与Jersey,RESTeasy或Spring的RestTemplate相同的抽象级别。它们都允许使用类型安全的API与REST API进行交互,而无需处理序列化,请求构建和响应处理等低级方面。
这些库中的每一个都使用下面的HTTP客户端来实际与HTTP服务器交谈。例子是您提到的Apache HTTP client,OkHttp或简单的旧版HttpUrlConnection与JDK一起发货。
通常,您可以混合和匹配不同的REST客户端库和HTTP客户端,除了Retrofit because Retrofit has a hard dependency on OkHttp since version 2(使用Retrofit 1.x,您可以使用Apache HTTP Client,HttpUrlConnection或OkHttp)。
回到实际的问题:什么时候选择。
Android:这很简单,因为JAX-RS,Android和RESTeasy背后的API /技术不支持。因此,如果您不想直接与HTTP聊天,那么Retrofit或多或少是您唯一的选择,除了可能是Volley。春天也不可用,并且Spring Android is abandoned。
JRE/JDK:在这里您可以选择所有选项。
- 如果您想要一个快速简单的解决方案来实现没有SDK可用的第三方API或JAX-RS接口,那么改造可能会很不错。
- 如果您使用Spring并且没有JAX-RS接口或者您不想购买到JAX-RS,即在服务器端使用它,那么Spring的RestTemplate是一个不错的选择。
- 如果您想共享客户端和服务器之间的接口定义,或者您是否全面使用JavaEE,则JAX-RS(Jersey,RESTeasy,...)是一个不错的选择。
关于性能:这里的主要驱动程序是花在做HTTP和(de)序列化上的时间。因为(de)序列化是由像杰克逊或protobuf这样的专业库执行的,并且都使用相同的(或者你至少可以使它们),所以不应该有任何有意义的区别。
如果我同时有大量的请求,改进2是一个不错的选择,它是否支持压力测试,你有没有参考基准? –
改造是OkHttp上的一个薄层。因此,直接查看OkHttp可能更具相关性。作者的基准:https://github.com/square/okhttp/tree/master/benchmarks。关于压力测试:你有什么想法? – aha
谢谢你的时间来解释所有这一切。我心中有什么是我想使用基于okhttp3的Retrofit2,但是我担心如果他们不同时支持大量的请求。 –
找了一段时间才找到,但是我找到了一个完美的REST客户端库,这使得我们的开发更加容易和陈旧。在开发新的REST实现或API时,我们可以将其用作标准。
它被称为Feign,由Netflix团队开发并与Spring Cloud Netflix合作。更多详情here在该项目的网站上。
一些功能包括: - 集成杰克逊,GSON和其他编码器/解码器 - 使用OkHttp进行网络通信,一个成熟的HTTP库 - 与SLF4J绑定日志记录功能 - 基于接口的实现,最小的发展。下面是一个样本客户端:
@FeignClient("stores")
public interface StoreClient
{
@RequestMapping(method = RequestMethod.GET, value = "/stores")
List<Store> getStores();
@RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
Store update(@PathVariable("storeId") Long storeId, Store store);
}
并经过@aha的答案,以下引用:
JRE/JDK:这里有完整的选项的选择。
如果您想要快速简单地解决方案 实现没有SDK可用的第三方API或JAX-RS 接口,那么改装可能会更好。
Spring的RestTemplate是一个不错的选择,如果你正在使用 春天,也没有JAX-RS接口或者你不想买 到JAX-RS,即还用它在服务器端。
JAX-RS(泽西岛, RestEasy的,...)是一个很好的选择,如果你想分享客户端和服务器之间的接口 定义,或者如果你是全对的JavaEE 反正。
假死就像改装和JAX-RS一起:简单的解决方案,并可以共享客户端和服务器之间的接口定义,并且可以使用JAX-RS接口
基于观点的问题是不适合用于StackOverflow的。什么是“最好的”工具取决于你的情况和你的个人品味。此外,看起来你只是不想做比较你自己感兴趣的工具的辛苦工作,但只是收获别人为你做的工作。尽可能尊重,但我不喜欢这样的问题。如果您无法提供需要解决的工具之一的具体问题,我建议您删除该问题。 – kriegaex
@kriegaex感谢您的意见..但我必须得到最好的选择,因为我必须编写一个支持大量连接并具有最佳性能的新API,并且我想确保retrofit2是否会支持高性能良好的请求数量 –
然后,不要仅仅写出“最佳”,而是“最高吞吐量”,而不是列出许多部分冲突的标准 - 例如,反序列化的最佳工具可能是吞吐量更差。并提供您认为对您的情况来说太慢或至少是典型的示例代码,以帮助其他人为您优化。你没有得到什么StackOverflow是关于,是吗?你有没有想过,为什么没有人想在你付出恩典之前回答这个问题?因为除了你以外,没有人能真正用不明确的标准来回答这个问题 - 这到底是什么发生了。 – kriegaex