下面我来详细讲解Spring Boot Admin添加报警提醒和登录验证功能的具体实现。
1. 添加报警提醒
1.1 准备工作
首先,我们需要准备以下工作:
1.2 添加报警提醒功能
在 spring-boot-admin-server
项目主类中添加以下配置:
@Bean
public ApplicationListener<InstanceRegisteredEvent> instanceRegisteredEventListener() {
return event -> {
String healthEndpointUrl = getHealthEndpointUrl(event.getRegistration());
// 健康检查失败的阈值
int healthFailedThreshold = 3;
event.getApplication().registerHealthIndicator(new HealthIndicator() {
private AtomicInteger healthFailedTimes = new AtomicInteger(0);
@Override
public Health health() {
Health.Builder builder = new Health.Builder();
try {
RestTemplate restTemplate=new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(healthEndpointUrl,String.class);
if(responseEntity.getStatusCode().isError()){
builder.down();
healthFailedTimes.incrementAndGet();
} else {
builder.up();
healthFailedTimes.set(0);
}
} catch (Exception e) {
builder.down();
healthFailedTimes.incrementAndGet();
}
// 检查健康失败次数,如果大于等于指定阈值,则发送报警邮件
if(healthFailedTimes.get() >= healthFailedThreshold){
sendAlertMail(getApplicationName(event.getRegistration()));
}
return builder.build();
}
});
};
}
// 获取健康检查接口URL
private String getHealthEndpointUrl(Registration registration){
Map<String,String> metadata = registration.getMetadata();
String host = registration.getHost();
// 默认健康检查接口:/actuator/health
String healthEndpoint = metadata.getOrDefault("management.endpoint.health.show-details","")+"/actuator/health";
return String.format("http://%s:%d/%s", host, registration.getPort(), healthEndpoint);
}
// 发送报警邮件
private void sendAlertMail(String applicationName){
// TODO 发送邮件
}
该配置在服务实例注册后,会为每个服务实例添加一个健康检查的监控,判断健康检查失败的次数。如果健康检查失败次数大于等于规定的阈值,则会发送一封报警邮件。
1.3 示例说明
以一个示例说明上文的配置。例如我们有两个服务实例,分别是 service-a
和 service-b
,并且规定健康检查失败的阈值是 3 次。
当 service-a
健康检查失败 3 次后,就会触发报警,发送一封邮件。
2. 添加登录验证
2.1 准备工作
同样,我们需要先安装 Spring Boot Admin Server Extensions 扩展,以支持登录验证功能。
2.2 添加登录验证功能
在 spring-boot-admin-server
项目主类中添加以下配置:
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
@Autowired
private Environment env;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/**").hasRole("ADMIN")
.and()
.formLogin().loginPage("/login.html").defaultSuccessUrl("/").permitAll()
.and()
.logout().logoutUrl("/logout").permitAll()
.and()
.csrf().disable();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/js/**", "/img/**", "/fonts/**");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser(env.getProperty("spring.security.user.name", "admin"))
.password("{noop}" + env.getProperty("spring.security.user.password", "admin"))
.roles("ADMIN");
}
}
该配置会对所有的请求进行登录验证,只有角色为 ADMIN
的用户才能访问。此外,还会设置登录页面和登出的 URL,取消 CSRF 防护。
在添加了登录验证的情况下,我们需要添加一个 HTML 页面作为登录入口。在 resources
目录下创建登录页面 login.html
。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form method="post" action="/login">
<div>
<label>Username:</label>
<input type="text" name="username">
</div>
<div>
<label>Password:</label>
<input type="password" name="password">
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
</body>
</html>
2.3 示例说明
以一个示例说明上述配置。如果我们想通过 Spring Boot Admin 管理后台,访问 http://localhost:9090
,就必须在登录页面中输入用户名和密码。默认的用户名和密码是 admin
。
在输入正确的用户名和密码后,将会进入到 Spring Boot Admin 管理后台首页。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot Admin 添加报警提醒和登录验证功能的具体实现 - Python技术站