2017-02-13 159 views
16

我正在閱讀許多文章,以找到最佳休息客戶端的Java應用程序,我發現最終使用澤西與Apache HTTP客戶端4.5是偉大的,但在很多文章中,我發現,現在改進是最好的(我沒有提到 Volley,因爲在我的情況下,我不需要API支持緩存。澤西REST客戶端與Apache HTTP客戶端4.5與改造

改進對於java客戶端應用程序更好嗎?還是隻是更好的android?和爲什麼我以前沒有找到這個比較..他們不能比較?

我可以比較他們的性能,連接池,他們在哪一層工作,壓縮的請求和響應,超時,反序列化?

HTTP3不支持連接池,這就是爲什麼翻新通常用於android?所以對於普通的Java應用程序來說,它會導致連接泄漏,這是不實際的。

我的目標是找到具有高性能的最佳Rest API客戶端,並支持大量的連接。

謝謝你提前

+0

基於觀點的問題是不適合用於StackOverflow的。什麼是「最好的」工具取決於你的情況和你的個人品味。此外,看起來你只是不想做比較你自己感興趣的工具的辛苦工作,但只是收穫別人爲你做的工作。儘可能尊重,但我不喜歡這樣的問題。如果您無法提供需要解決的工具之一的具體問題,我建議您刪除該問題。 – kriegaex

+0

@kriegaex感謝您的意見..但我必須得到最好的選擇,因爲我必須編寫一個支持大量連接並具有最佳性能的新API,並且我想確保ret​​rofit2是否會支持高性能良好的請求數量 –

+0

然後,不要僅僅寫出「最佳」,而是「最高吞吐量」,而不是列出許多部分衝突的標準 - 例如,反序列化的最佳工具可能是吞吐量更差。並提供您認爲對您的情況來說太慢或至少是典型的示例代碼,以幫助其他人爲您優化。你沒有得到什麼StackOverflow是關於,是嗎?你有沒有想過,爲什麼沒有人想在你付出恩典之前回答這個問題?因爲除了你以外,沒有人能真正用不明確的標準來回答這個問題 - 這到底是什麼發生了。 – kriegaex

回答

20

你在混合不同的東西在一起。首先要清除的事情:

Retrofit是一個與REST API交互的客戶端庫。因此它提供了與Jersey,RESTeasy或Spring的RestTemplate相同的抽象級別。它們都允許使用類型安全的API與REST API進行交互,而無需處理序列化,請求構建和響應處理等低級方面。

這些庫中的每一個都使用下面的HTTP客戶端來實際與HTTP服務器交談。例子是您提到的Apache HTTP clientOkHttp或簡單的舊版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這樣的專業庫執行的,並且都使用相同的(或者你至少可以使它們),所以不應該有任何有意義的區別。

+0

如果我同時有大量的請求,改進2是一個不錯的選擇,它是否支持壓力測試,你有沒有參考基準? –

+0

改造是OkHttp上的一個薄層。因此,直接查看OkHttp可能更具相關性。作者的基準:https://github.com/square/okhttp/tree/master/benchmarks。關於壓力測試:你有什麼想法? – aha

+0

謝謝你的時間來解釋所有這一切。我心中有什麼是我想使用基於okhttp3的Retrofit2,但是我擔心如果他們不同時支持大量的請求。 –

3

找了一段時間才找到,但是我找到了一個完美的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接口