Apollo構成をオフにするテストについて
7347 ワード
Apolloはまだいくつかの穴があって、自分で一つ一つ踏んでからどのように処理するかを知ることができます.最近はコンフィギュレーションファイルでApolloをオフにしようとして、いろいろ試してみましたが、成功しませんでした.公式サイトではApolloを統合する方法だけが説明されており、Apolloを閉じる構成方法は紹介されていません.後で間違いを犯さないように、これらの状況と解決策を記録します.
テスト環境
apollo.bootstrap.enabled=true/false
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=true
bootstrap.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を構成する必要があります.