web-dev-qa-db-ja.com

Jersey-clientとApache HTTP Clientはどのように比較されますか?

まず第一に、私はここで火炎戦争を始めようとはしていません。私はジャージーを十分に知っていますが、httpclientをほとんど使用していません。

Jersey-clientとApacheのhttpclientの主な違いは何ですか?どちらの分野が他よりも優れているのでしょうか?どこかに良い比較チャートはありますか?大きなファイル(2048 MBなど)でパフォーマンスが向上するのはどれですか?

コメントありがとうございます!

48
carlspring

これら2つのことは、おそらく直接比較すべきではありません。 Jerseyは、完全なJAX-RS実装、きちんとした流APIなAPI、強力なフィルタースタックを備えたRESTクライアントです。 Apache Httpクライアントは、タイムアウト、複雑なプロキシルート、接続ポーリングなどの低レベルの詳細の管理に最適なHTTPクライアントです。プロトコルスタックのさまざまなレベルで機能します。 Jerseyを使用している場合、常に何らかの種類のHTTPクライアントバックエンドが関係しています。バックエンドが明示的に指定されていない場合、JerseyはHttpUrlConnectionをデフォルトのバックエンドとして使用します。

HttpUrlConnectionバックエンドを使用したJerseyの例:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

Apache Http Clientを使用したJerseyバックエンドの例:

HttpClient apacheClient = HttpClientBuilder.create().build();
Client client = new Client(new ApacheHttpClient4Handler(apacheClient,
                                                        new BasicCookieStore(),
                                                        true));
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

最後の例のハンドラーの使用に注意してください。これは、ジャージーがさまざまなバックエンドを組み込み、利用するための重要な統合の抽象化です。最初の例では、URLConnectionClientHandlerを内部で使用しています。

パフォーマンスと機能について言えば、Apache Http ClientとJerseyを比較することはほとんど意味がありません。ジャージー自体は単なるラッピングAPIであるため、ここで異なるジャージーバックエンドを比較したい場合があります。私の経験に基づいて、HttpUrlConnectionとApache Http Clientの主な違いを強調したいと思います。

HttpUrlConnection

  • 外部の依存関係は必要ありません。これは、組み込みプラットフォームまたはモバイルプラットフォームで非常に価値があります。
  • どこでも非常によく文書化されています
  • APIの設計が不十分です。 HttpUrlConnectionベースの実装は、維持および拡張が困難です。
  • 多くの機能はJVMプロパティを介して設定されますが、その一部は実行時に再構成できない場合があります。
  • 場合によっては、タイムアウトの処理に絶望的です。タイムアウトごとに10個のJVMプロパティを設定しても、状況によっては接続が永久にハングすることがあります。
  • Gingerbreadは 推奨 AndroidのhttpクライアントAPIであるため。

Apache Httpクライアント

  • 3.Xバージョンでは、パフォーマンスはHttpUrlConnectionに多少似ていました。バージョン4.1には多くのパフォーマンス拡張が含まれており、対応するものよりも優れたパフォーマンスを発揮します
  • 接続およびデータ読み取りタイムアウトの管理に非常に優れている
  • デザインは Open/Closed Principle に準拠しているため、独自の実装でHTTP処理のほぼすべての部分をカスタマイズできます。例:リダイレクト戦略、再試行戦略、カスタムCookieストレージ、リクエスト/レスポンスのインターセプターなど。
  • 複雑なマルチプロキシパス用にカスタマイズ可能なルートビルダーで豊富なプロキシサポートを提供
  • すぐに使用可能なルートごとの接続プールがあります。 SSL/TLSを使用する場合、特にハードウェアPKCS#11トークンを使用すると、これによりパフォーマンスが向上する場合があります。 HttpUrlConnectionにも内部プーリングがありますが、プールする内容やタイミングをカスタマイズするツールはなく、プールの状態を確認する監視機能もありません。
  • 詳細なロギング機能

適切なcom.Sun.jersey.api.client.ClientHandler実装がある場合、ジャージーで他のバックエンド(たとえば、非ブロッキングクライアント用)を使用することも可能です。

78
Jk1