Apollo構成をオフにするテストについて

7347 ワード

 


 
Apolloはまだいくつかの穴があって、自分で一つ一つ踏んでからどのように処理するかを知ることができます.最近はコンフィギュレーションファイルでApolloをオフにしようとして、いろいろ試してみましたが、成功しませんでした.公式サイトではApolloを統合する方法だけが説明されており、Apolloを閉じる構成方法は紹介されていません.後で間違いを犯さないように、これらの状況と解決策を記録します.

テスト環境

  • bootstrap.properties/yml
  • apollo.bootstrap.enabled=true/false
    
  •  
  • application.properties/yml
  • apollo:
      bootstrap:
        enabled: true/false
    
  •  
  • 起動クラス
  • @EnableTransactionManagement
    @SpringBootApplication
    @EnableEurekaClient
    @EnableApolloConfig// 
    @Slf4j
    public class AppApplication {
    
        public static void main(String[] args) {
             ConfigurableApplicationContext context = SpringApplication.run(FormEngineApplication.class, args);
            ConfigurableEnvironment environment = context.getEnvironment();
            String apolloEnable = environment.getProperty("apollo.bootstrap.enabled");
            System.out.println(apolloEnable);
        }
        
        @Value("${testname:}")
      private String testName;
    
      @Bean
      public TestBean testBean() {
          if (!StringUtils.isEmpty(testName)) {
              System.out.println(" Apollo ");
          }
          return new TestBean();
      }
    }
    
    @RestController
    @RequestMapping("test")
    public class TestController {
    
      @Value("${testname:}")
      private String testName;
    
      @GetMapping("testApollo")
      public String testApollo() {
          return "hello: " + testName;
      }
    
    }
    
  •  

  • テスト開始


    SpringBootが注釈や構成でApolloを統合する方法は主に3つありますが、以下の3つの場合についてテストします.
    bootstrap.properties/yml構成apollo.bootstrap.enabled=truebootstrap.properties/yml構成apollo.bootstrap.enabled=true起動クラス構成@EnableApolloConfig注記
    bootstrap
    application
    注記を設定するかどうか
    印刷結果
    起動前に読み取り可能かどうか
    起動後に読み取り可能
    リアルタイムで読み取れるか
    結論
    true
    true
    コンフィギュレーション
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    true
    true
    構成しない
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    true
    false
    コンフィギュレーション
    false
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    true
    false
    構成しない
    false
    できる
    できる
    できません
    アプリケーション起動時にApollo構成を読み込むのは有効ですが、リアルタイムで更新することはできません.
    true
    構成しない
    コンフィギュレーション
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    true
    構成しない
    構成しない
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    false
    true
    コンフィギュレーション
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    false
    true
    構成しない
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    false
    false
    コンフィギュレーション
    false
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新できます(注釈がある場合は無効にできません)
    false
    false
    構成しない
    false
    できません
    できません
    できません
    Apollo構成が有効でない
    false
    構成しない
    コンフィギュレーション
    false
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    false
    構成しない
    構成しない
    false
    できません
    できません
    できません
    Apollo構成が有効でない
    構成しない
    true
    コンフィギュレーション
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    構成しない
    true
    構成しない
    true
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    構成しない
    false
    コンフィギュレーション
    false
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    構成しない
    false
    構成しない
    false
    できません
    できません
    できません
    Apollo構成が有効でない
    構成しない
    構成しない
    コンフィギュレーション
    null
    できる
    できる
    できる
    Apollo構成が有効で、リアルタイムで更新可能
    構成しない
    構成しない
    構成しない
    null
    できません
    できません
    できません
    Apollo構成が有効でない
    印刷結果の解析:
    bootstrapを通るとymlは、Bootstrapコンテキストを構成する、親コンテキストが設定されている場合にbootstrap.ymlのプロパティは、サブレベルのコンテキストに追加されます.アプリケーションより優先度が低い.Spring Bootアプリケーションを作成するプロパティソースとして、ymlおよびその他のサブレベルに追加します.
    したがって、印刷結果はアプリケーション構成と同じであり、アプリケーション構成が存在しない場合、bootstrapと同じになります.

    結論


    これらの状況を比較すると、次のようになります.
    注記が構成されている限り、Apolloは有効であり、最新の構成をリアルタイムで読み取ることができます.注記が構成されていない場合は、アプリケーションの構成が主です.(アプリケーションやbootstrapだけで制御できるとはいえ)
    したがって、Apolloが有効かどうかを制御する構成が必要な場合は、これらの統合方式をできるだけ混合しにくい.最良の方法は、bootstrapを構成せず、注釈を構成せず、アプリケーションのみを構成し、アプリケーションによってApolloのスイッチを制御することです.

    namespaceのテスト


    テストの目的:apollo.bootstrap.namespacesがどのプロファイルに構成されているかをテストします.
    試験条件1:
    私はまずApolloで2つのnamespaceを構成しましたが、2つのnamespaceの同じ構成の構成値が違います.
    application.properties:testname=test1
    application.yml:testname:test2
    次に、プロジェクトの起動前および起動後に、ロードされた構成を観察します.
    試験条件2:
    テストはSpringBootのbootstrapのみです.propertiesとアプリケーションymlで行い、スイッチはアプリケーションによって行う.yml構成制御
    ps:注釈を使用すると、注釈にnamespaceを配置します
    bootstrap.properties/yml
    apollo.bootstrap.namespaces=application/application.yml/ 
    

    application.properties/yml
    apollo:
      bootstrap:
        enabled: true
        namespaces: application/application.yml/ 
    

    起動クラス:
    @EnableTransactionManagement
    @SpringBootApplication
    @EnableEurekaClient
    //@EnableApolloConfig
    @Slf4j
    public class AppApplication {
    
        public static void main(String[] args) {
             ConfigurableApplicationContext context = SpringApplication.run(FormEngineApplication.class, args);
            ConfigurableEnvironment environment = context.getEnvironment();
            String apolloEnable = environment.getProperty("apollo.bootstrap.enabled");
            System.out.println(apolloEnable);
        }
        
        @Value("${testname:}")
        private String testName;
    
        @Bean
        public TestBean testBean() {
            if (!StringUtils.isEmpty(testName)) {
                System.out.println(" Apollo ");
            }
            return new TestBean();
        }
    }
    

    テストインタフェース:プロジェクトの開始後のtestNameの値をテストします.
    @RestController
    @RequestMapping("test")
    public class TestController {
    
        @Value("${testname:}")
        private String testName;
    
        @GetMapping("testApollo")
        public String testApollo() {
            return "hello: " + testName;
        }
    
    }
    

    テスト:
    bootstrap
    application
    起動前のtestName
    起動後のtestName
    結論
    構成しない
    構成しない
    test1
    test1
    アプリケーションをデフォルトで読み込みます.propertiesのnamespace構成
    構成しない
    application
    test1
    test1
    どれが効き目があるかわからない
    構成しない
    application.yml
    test2
    test2
    application.ymlプロファイルでのnamespaceの構成が有効
    application
    構成しない
    test1
    test1
    どれが効き目があるかわからない
    application
    application
    test1
    test1
    どれが効き目があるかわからない
    application
    application.yml
    test2
    test2
    application.ymlプロファイルでのnamespaceの構成が有効
    application.yml
    構成しない
    test1
    test1
    application.ymlプロファイルでのnamespaceの構成が有効
    application.yml
    application
    test1
    test1
    application.ymlプロファイルでのnamespaceの構成が有効
    application.yml
    application.yml
    test2
    test2
    どれが効き目があるかわからない
    結論
    Apolloスイッチはアプリケーションにあります.propertiesプロファイルで構成する場合はアプリケーション.propertiesプロファイルで構成されているnamespaceがメインです.

    まとめ


    どのようにApolloを統合するかは、対応するnamespaceをそのように構成してこそ機能します.
    ps:テスト済み(ここでは省略)
    Apolloスイッチがbootstrapにあるときpropertiesプロファイルで構成する場合、namespaceの構成はbootstrapになります.propertiesプロファイルのメインです.
    注記統合Apolloを使用する場合は、注記でnamespaceを構成する必要があります.