オンラインspringcloudコンフィグサーバRomのgitのは、マイクロサービスクラスタがハングアップゆっくりとしている問題。
入り口層で追跡ログを増やしています。
org.springframework.cloud.config.server.environment.EnvironmentController.java
@RequestMapping( "/{name}/{profiles}/{label:.*}" ) 公衆環境ラベル(@PathVariable文字列名、文字列@PathVariableプロファイル、 @PathVariable文字列のラベル){ 場合(名前!= nullの &&名前。含有( "(_)" )){ // "(_)" Gitのレポ名にまれであるが、 "/"一致させることができない // 春のMVCによって 名= name.replace( "(_)"、 " /」); } 場合(ラベル!= nullの && label.contains( "(_)" )){ // "(_)" // 春のMVCによって ラベル= label.replace( "(_)"、 "/" )。 } ストップウォッチSW = 新しいストップウォッチ(「標識」)。 sw.start(); logger.info( "EnvironmentController.labelled()开始、名前= {}、プロファイル= {}、ラベル= {}" 、名前、プロファイル、ラベル)。 環境環境 = この.repository.findOne(名前、プロフィール、ラベル); sw.stop(); logger.info( "EnvironmentController.labelled()结束、名前= {}、プロファイル= {}、ラベル= {}、耗时= {}毫秒、耗时= {}秒" 、名前、プロファイル、ラベル、SW。 getTotalTimeMillis()、sw.getTotalTimeSeconds())。 環境; }
ヘルスチェックは、ログエントリを増やすConfigServerHealthIndicator.java:
@Override 保護 ボイド doHealthCheck(Health.Builderビルダー)がスロー例外{ ストップウォッチSW = 新しいストップウォッチ( "doHealthCheckを" )。 sw.start(); logger.info( "ConfigServerHealthIndicator.doHealthCheck()开始、ビルダー= {}" 、ビルダー)。 builder.up(); 一覧 <地図<文字列、オブジェクト>>詳細= 新しい ArrayListを<> (); 用(:文字列名この.repositories.keySet()){ リポジトリリポジトリ = この .repositories.get(名前); 文字列のアプリケーション =(repository.getName()== nullの)?名前:repository.getName(); ストリングプロファイル = repository.getProfiles()。 試す{ 環境環境 = この.environmentRepository.findOne(アプリケーション、プロファイル、repository.getLabel())。 ハッシュマップの<string、オブジェクト>詳細= 新規 HashMapの<> (); detail.put( "名前" 、environment.getName()); detail.put( "ラベル" 、environment.getLabel()); もし(environment.getProfiles()!= nullを&& environment.getProfiles()長さ> 0 ){ detail.put( "プロファイル" 、は、Arrays.asList(environment.getProfiles()))。 } もし(!{CollectionUtils.isEmpty(environment.getPropertySources())) リストの<string>ソース= 新規のArrayList <> (); 用(PropertySource源:environment.getPropertySources()){ sources.add(source.getName())。 } detail.put( "ソース" 、源) } details.add(詳細)。 } キャッチ(例外e){ HashMapの <文字列、文字列>マップ= 新しい HashMapの<> (); map.put( "アプリケーション" 、アプリケーション)。 map.put( "プロファイル" 、プロファイル)。 builder.withDetail( "リポジトリ" 、マップ)。 builder.down(E); 返します。 } } builder.withDetail( "リポジトリ" 、詳細)。 sw.stop(); logger.info("ConfigServerHealthIndicator.doHealthCheck()结束、耗时= {}毫秒、耗时= {}秒、ビルダー= {}" 、sw.getTotalTimeMillis()、sw.getTotalTimeSeconds()、ビルダー)。 }
ログの時間のかかる統計分析の後とEnvironmentControllerとConfigServerHealthIndicator呼び出し回数が多すぎるが、両方の呼び出しが最終的にJGitEnvironmentRepository.fetch()メソッドを呼び出します、このメソッドは、要求のgitをフェッチ行く、タイムアウト時間は5秒程度であることがわかりました。
リクエストの過剰な数に、サービス要求は、しかし、スレッドが長時間ブロックされています。
分析:
1、その各マイクロ開始サービスモジュール、そしてなぜEnvironmentControllerを呼びますか?
2、ConfigServerHealthIndicatorはコンフィグサーバのヘルスチェックで、チェックする間隔を設定することで、問題を軽減することができます呼び出します。
領事: ホスト: 10.200.110.100 :ポート 8500 が有効:真の 発見: 有効:真の ホスト名: 10.200.110.100 healthCheckInterval:30代の queryPassing:真の
クライアント側の設定 - サーバーが開始した通話のヘルスチェックとするとEnvironmentController要求。ソースを見て:
構成例の中心部に到達するために、レジストリへの各クライアント接続した後、それがオンライン環境、ロジック上記のコードは、環境変数にデータセンターから取得するように構成された呼び出して、問題が発生し、ログを表示し、このロジックが保たれていることがわかりました20秒ごとに呼び出すするヘルス・インディケータを通じて構成サーバーがSpringCloudConfig公式文書を見ることにより、正常に動作し、構成EnvironmentRepositoryを検出するかどうかを知るために、アプリケーションに、アプリケーションの名前、一度呼び出されます。デフォルトでは、アプリケーションがEnvironmentRepositoryを設定するには、アプリの名前を尋ねてきます、EnvironmentRepository例は、デフォルトの設定を答えました。これは、ヘルスモニタがデフォルトでオンになったときで、設定を検出するためのfindOneを呼び出して停止することはありません提供されています、例外があるかどうか、
このコードはorg.springframework.cloud.config.server.config.ConfigServerHealthIndicatorクラスの初期化ですアプリのアプリケーション・コード・ネームの名前
@ConfigurationProperties( "spring.cloud.config.server.health" ) パブリック クラス ConfigServerHealthIndicatorが延びAbstractHealthIndicator { プライベートEnvironmentRepository environmentRepositoryと、 プライベート地図<文字列、リポジトリ>リポジトリ= 新しいのLinkedHashMap <> (); 公共ConfigServerHealthIndicator(EnvironmentRepository environmentRepository){ この .environmentRepository = environmentRepository。 } @PostConstruct 公共 ボイドINITを(){ 場合(この.repositories.isEmpty()){ この .repositories.put( "APP"、新たなリポジトリ())。 } } // ... }
あなたは、このような検出はspring.cloud.config.server.health.enabled出て停止する場合= falseのは、この機能をオフにするように構成することができます。
ソースを見て:。org.springframework.cloud.config.client ConfigClientAutoConfiguration.java
@Configuration パブリック クラスConfigClientAutoConfiguration { @Configuration @ConditionalOnClass(HealthIndicator。クラス) @ConditionalOnBean(ConfigServicePropertySourceLocator。クラス) @ConditionalOnProperty(値 = "health.config.enabled"、matchIfMissing =真)は、 保護された 静的 クラスConfigServerHealthIndicatorConfiguration { @Bean 公共ConfigServerHealthIndicator configServerHealthIndicatorを( ConfigServicePropertySourceLocatorロケータ、 ConfigClientHealthProperties特性、環境環境){ 返す 新しいConfigServerHealthIndicator(ロケータ、環境、プロパティ)。 } } // ...