SpringCloudAlibabaマイクロサービスの実際の戦闘23-偽のパフォーマンスチューニング

概要概要

通常の状況では、Feignには3つのクライアント実装があります。

  1. Client.Defaultクラス:デフォルトのfeign.Clientクライアント実装クラス。HTTPURLHttpURLConnnection要求処理完了するために内部的に使用されます。

  2. ApacheHttpClientクラス:Apache httpclientオープンソースコンポーネントを使用してHTTPURLリクエスト処理を完了するfeign.Clientクライアント実装クラス。

  3. 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

JMeterテストツール

「追伸:この記事のすべてのパフォーマンステスト結果を少なくとも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-servicehttpclientが信頼できるコンシューマーモジュールで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つの条件を満たす必要があることがわかります。

  1. 満たす必要がありますOkHttpClient.class現在のクラスパスに存在します。つまり、対応する依存関係を導入します

  2. 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つの結論を明確に導き出すことができます。

  1. OKHttpは、他の2つよりもパフォーマンスが優れているため、お勧めします。

  2. 同時実行性が高い場合、Apache httpclient効率はデフォルトほどHttpURLConnection高くはありませんまた、ストレステストの過程で、接続プール要求スタック現象の使用は非常に簡単に発生し、apache httpclient要求スタック状態でさえ発生することがわかりましたhttpclientはお勧めしません。

コンテナの最適化

Undertowこれは、Javaで記述された柔軟で高性能なWebサーバーであり、NIOに基づくブロッキングおよび非ブロッキングAPIを提供します。と比較してtomcatUndertowパフォーマンスはより高く、より軽いです。この機会に、テスト結果の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つのリンクに来ることを忘れないでください:

いいね、再投稿、コメント。

またね! 白い売春婦に匹敵するお気に入り 親指を立てるの は真実です!

 

SpringCloudアリババシリーズ実際の戦闘

 

おすすめ

転載: blog.csdn.net/jianzhang11/article/details/111244020