概要概要
通常の状況では、Feignには3つのクライアント実装があります。
-
Client.Default
クラス:デフォルトのfeign.Clientクライアント実装クラス。HTTPURLHttpURLConnnection
要求処理を完了するために内部的に使用されます。 -
ApacheHttpClient
クラス:Apache httpclient
オープンソースコンポーネントを使用してHTTPURLリクエスト処理を完了するfeign.Clientクライアント実装クラス。 -
OkHttpClient
クラス:内部使用OkHttp3
オープンソースコンポーネントは、HTTPURL要求処理のfeign.Clientクライアント実装クラスを完了します。
@ConditionalOnClass({ ILoadBalancer.class, Feign.class })
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.ribbon.enabled",
matchIfMissing = true)
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore(FeignAutoConfiguration.class)
@EnableConfigurationProperties({ FeignHttpClientProperties.class })
@Import({ HttpClientFeignLoadBalancedConfiguration.class,
OkHttpFeignLoadBalancedConfiguration.class,
DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration {
...
}
前のセクションでは、Feignのデフォルトのクライアント実装のHttpURLConnnection
パフォーマンスがあまり良くなく、DubboRPCのパフォーマンスに大きな違いがあることを確認しました。HttpURLConnnection
テスト結果に基づくものは次のとおりです。
平均応答時間 | スループット | 最小応答時間 | 最大応答時間 |
---|---|---|---|
6866ms | 59.5 /秒 | 3056ms | 12232ms |
この章では、すべてのFeignクライアントでパフォーマンステストを実行して、最適なクライアント呼び出しツールを決定する必要があります。
テストツール
テストサーバー:Intel Core i5-7200U CPU @ 2.50GHz 2.70GHz6コア16Gメモリ
テストツール:JMeter5.1
スレッド数:1000
ランプアップ:10
「追伸:この記事のすべてのパフォーマンステスト結果を少なくとも10回テストし、最終的に比較的平均的な結果を選択しました。テスト結果は比較的正確です。」
HttpClient
まず、最初にクライアントツールをHttpClientに切り替え、HttpClientFeignLoadBalancedConfiguration構成クラスを確認します。ソースコードは次のとおりです。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
@Import(HttpClientFeignConfiguration.class)
class HttpClientFeignLoadBalancedConfiguration {
@Bean
@ConditionalOnMissingBean(Client.class)
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory, HttpClient httpClient) {
ApacheHttpClient delegate = new ApacheHttpClient(httpClient);
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
}
}
コードで@ConditionalOnClass({ApacheHttpClient.class})
見つかったコメントから、pomファイルを追加するだけでHttpClient
信頼性が高まります。また、設定ファイルで設定する必要がありますfeign.httpclient.enabled
ようtrue
、从@ConditionalOnProperty
ノートを見ることができ、デフォルトではそれが本当であるので、この構成は、書き込むことはできません。
したがって、order-service
httpclientが信頼できるコンシューマーモジュールでHttpClientを使用するだけで済みます。
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
試験結果
平均応答時間 | スループット | 最小応答時間 | 最大応答時間 |
---|---|---|---|
8390ms | 48.5 /秒 | 2691ms | 20371ms |
高い同時実行性でのパフォーマンステストは、実際にはネイティブのテストよりも優れていませんHttpURLConnnection
。これは少し残念です。
OkHttp
また、最初にokhttpの構成クラスを確認してください OkHttpFeignLoadBalancedConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty("feign.okhttp.enabled")
@Import(OkHttpFeignConfiguration.class)
class OkHttpFeignLoadBalancedConfiguration {
@Bean
@ConditionalOnMissingBean(Client.class)
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory, okhttp3.OkHttpClient okHttpClient) {
OkHttpClient delegate = new OkHttpClient(okHttpClient);
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
}
}
コメントを見ると、OkHttpを使用するには、次の2つの条件を満たす必要があることがわかります。
-
満たす必要があります
OkHttpClient.class
現在のクラスパスに存在します。つまり、対応する依存関係を導入します -
feign.okhttp.enabled
構成アイテムの値は、trueになるように構成する必要があります
そこで、ここで最初にOkHttpの依存関係を紹介します。
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
次に、構成ファイルを変更し、OkHttpを有効にします。
feign:
...
okhttp:
enabled: true
試験結果
平均応答時間 | スループット | 最小応答時間 | 最大応答時間 |
---|---|---|---|
5335ms | 66.3 /秒 | 1874ms | 9011ms |
3人のクライアントの中で最高のパフォーマンス!
テスト結果の分析
上記のテスト結果(デフォルト構成)から、次の2つの結論を明確に導き出すことができます。
-
OKHttpは、他の2つよりもパフォーマンスが優れているため、お勧めします。
-
同時実行性が高い場合、
Apache httpclient
効率はデフォルトほどHttpURLConnection
高くはありません。また、ストレステストの過程で、接続プール要求スタック現象の使用は非常に簡単に発生し、apache httpclient
要求スタック状態でさえ発生することがわかりました。httpclientはお勧めしません。
コンテナの最適化
Undertow
これは、Javaで記述された柔軟で高性能なWebサーバーであり、NIOに基づくブロッキングおよび非ブロッキングAPIを提供します。と比較してtomcat
、Undertow
パフォーマンスはより高く、より軽いです。この機会に、テスト結果のUndertow
追加を検討したいと思いOkHttp
ます。
まず、undertowの依存関係を導入し、tomcatの依存関係を除外する必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
テスト効果
平均応答時間 | スループット | 最小応答時間 | 最大応答時間 |
---|---|---|---|
3817ms | 71.7 /秒 | 1830ms | 6174ms |
試験結果から、アンダートウコンテナを使用した後、性能が若干向上していることがわかります。
総括する
このホワイトペーパーのすべてのテスト結果は、コンポーネントのデフォルト構成に基づいています。パフォーマンスを求めているが、パラメーターの調整のOkHttp + Undertow
組み合わせを考慮したくない場合は、プロトコルパフォーマンスダボや他のrpcと比較することはできませんが、springcloudアーキテクチャではhttp call 、2つの組み合わせが最高のパフォーマンスを発揮します。
最後に、視覚的な比較を容易にするためにHttpURLConnnection
、テスト結果のネイティブでありOkHttp + Undertow
、参照用にまとめられたテスト結果に基づいています。
-
HttpURLConnnection
平均応答時間 | スループット | 最小応答時間 | 最大応答時間 |
---|---|---|---|
6866ms | 59.5 /秒 | 3056ms | 12232ms |
-
OkHttp + Undertow
平均応答時間 | スループット | 最小応答時間 | 最大応答時間 |
---|---|---|---|
3817ms | 71.7 /秒 | 1830ms | 6174ms |
この記事がお役に立てば、
3つのリンクに来ることを忘れないでください:
いいね、再投稿、コメント。
またね! 白い売春婦に匹敵するお気に入り 、親指を立てるの は真実です!