春のクラウド設定TER:コンフィグサーバのヘルスチェックサーバとクライアント側のサービスのタイムアウトが問題をブロックにつながるので、

オンライン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(ロケータ、環境、プロパティ)。
        } 
    } 
// ...

 

おすすめ

転載: www.cnblogs.com/duanxz/p/11272215.html
おすすめ