我打算HealtCheckContributors使用 spring-boot-actuator 為 Spring Boot 應用程式撰寫一些代碼。因此,我實作了其中的兩個。當然,它們旨在檢查不同應用程式的運行狀況,但具有幾乎相同的結構,除了配置屬性,...
SonarQube 對此有所抱怨,我想知道是否有可能有一個健康檢查類,但實體化的次數與application.properties. 一個例子:
application.properties:
# actuator
app1.management.baseUrl=http://localhost:10000
app1.management.name=app1HealthCheckContributor
app2.management.basUrl=http://localhost:10001
app2.management.name=app2HealthCheckContributor
HealthCheckContributor 對于應用程式1:
@Slf4j
@Component("xxx")
public class App1HealthCheckContributor extends AbstractHealthIndicator {
private final App1Properties app1Properties;
public App1HealthCheckContributor(final App1Properties app1Properties) {
this.app1Properties = app1Properties;
}
@Override
protected void doHealthCheck(Health.Builder builder) {...}
}
...并且此代碼HealthCheckContributor僅在其appXProperties 中不同。
難道不可能有某種基類,例如:
@Slf4j
@Component()
public class MyHealthCheckContributor extends AbstractHealthIndicator {
private final MyProperties myProperties;
public MyHealthCheckContributor(final MyProperties myProperties) {
this.myProperties = myProperties;
}
@Override
protected void doHealthCheck(Health.Builder builder) {...}
}
讓春天啟動照顧實體兩個HealthCheckContributors(在我們的情況App1HealthCheckContributor和App2HealthCheckContributor)?這將消除代碼重復。
屬性類檔案的示例:
@Slf4j
@Data
@ConfigurationProperties(prefix = "app1.management")
public class App1Properties {
private String baseUrl;
private String ...;
}
我怎樣才能做到這一點,一個application.properties檔案必須如何才能實作我打算做的事情?
我發現如何根據配置屬性在 Spring-Boot 中動態實體化多個 Bean,但(說實話)我幾乎不明白。
uj5u.com熱心網友回復:
假設doHealthCheck所有要檢查的應用程式中的代碼完全相同,您可以執行以下操作。
您將首先創建一個健康檢查類:
@Slf4j
public class AppHealthCheckContributor extends AbstractHealthIndicator {
private final AppProperties appProperties;
public App1HealthCheckContributor(final AppProperties appProperties) {
this.appProperties = appProperties;
}
@Override
protected void doHealthCheck(Health.Builder builder) {...}
}
和屬性模型如下:
@Slf4j
@Data
public class AppProperties {
private String baseUrl;
private String name;
}
這意味著配置將類似于以下內容(在 中application.yml):
health-check:
apps:
- baseUrl: http://localhost:10000
name: app1
- baseUrl: http://localhost:10001
name: app2
最后,您需要為每個應用程式創建一個 bean 并在應用程式背景關系中注冊它們:
@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "health-check")
public class AllAppPropertiesConfiguration {
private List<AppProperties> apps;
@Autowired
private GenericApplicationContext applicationContext;
@PostConstruct
fun init() {
for (AppProperties app : apps) {
applicationContext.registerBean(app.getName(), AppHealthCheckContributor.class, app);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317094.html
