最近公司需要调研一套微服务监控,摸索了一下prometheus和springbootadmin最终还是觉得springbootadmin更好用所以就记录一下自己的学习历程
首先springbootadmin(以下简称SBA)是基于springboot actuator的也是通过/actuator/health去拉取每个服务的statusInfo的
其次SBA有两种实现方式springboot和SBA版本2.0.4,springcloud是F版本
1.基于server和client的服务端和客户端模式
server端加入依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动类:
@SpringBootApplication
@EnableAdminServer
//@EnableDiscoveryClient
public class SpringbootadminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootadminApplication.class, args);
}
// @Configuration
// public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
// @Override
// protected void configure(HttpSecurity http) throws Exception {
// http.authorizeRequests().anyRequest().permitAll()
// .and().csrf().disable();
// }
// }
}
配置文件:
spring.application.name=admin-server
server.port=8009
启动服务访问localhost:8009就可以看到ui页面了,如下:
client客户端依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.0.4</version>
</dependency>
启动类:
@SpringBootApplication
//@EnableDiscoveryClient
//@EnableEurekaClient
public class SpringbootadminclientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootadminclientApplication.class, args);
}
}
配置文件:
spring.application.name=admin-client
server.port=8010
spring.boot.admin.client.url=http://localhost:8009 #申明SBA的地址
management.endpoints.web.exposure.include=* #SpringBoot 2.x版本所有节点默认关闭的,这里打开是为了SBA过来获取该服务状态时候可以访问/actuator/health接口
第二种实现方式是基于springcloud的实现模式,这种实现模式也很简单,我们只需要在server端加入一个
@EnableDiscoveryClient注解,SBA就会主动去拉取注册中心的注册服务列表,从而获取他们的服务动态信息
官方文档上是这么说的:The Spring Boot Admin Server can use Spring Clouds DiscoveryClient
to discover applications. The advantage is that the clients don’t have to include the spring-boot-admin-starter-client
. You just have to add a DiscoveryClient
implementation to your admin server - everything else is done by AutoConfiguration.
代码实现如下:
我们只需要在server的启动类上加一个注解即可
@SpringBootApplication
@EnableAdminServer
@EnableDiscoveryClient//加入该注解即可
public class SpringbootadminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootadminApplication.class, args);
}
// @Configuration
// public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
// @Override
// protected void configure(HttpSecurity http) throws Exception {
// http.authorizeRequests().anyRequest().permitAll()
// .and().csrf().disable();
// }
// }
}
配置文件中加入注册中心的地址:
spring.application.name=admin-server
server.port=8009
eureka.client.service-url.defaultZone=http://localhost:8001/eureka #加入该配置
management.endpoints.web.exposure.include=*
启动服务就可以看到注册到注册中心的所有服务都会被监控,这里要特别注意一点就是,如果springboot用的版本2的话,所有的服务都要手动配置打开/actuator/health节点的访问权限,下图EUREKA-CLIENT就是没有手动开启导致的(其实服务是up状态)
下图是注册中心已经注册的服务列表,在上路中都被监控了,这也说明这个思路是没错的
接下来再说一说SBA的授权认证问题
因为服务比较多,不可能直接访问ip端口就可以查看所有服务状态的,所以需要做一个登录认证
这个只需要加入一下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后再加入配置类:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecurityConfig(AdminServerProperties adminServerProperties) {
this.adminContextPath = adminServerProperties.getContextPath();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
successHandler.setTargetUrlParameter("redirectTo");
successHandler.setDefaultTargetUrl(adminContextPath + "/");
http.authorizeRequests()
.antMatchers(adminContextPath + "/assets/**").permitAll()
.antMatchers(adminContextPath + "/login").permitAll()
.anyRequest().authenticated()
.and()
//上边代码是为了允许所有人访问静态资源和登录页面
.formLogin().loginPage(adminContextPath + "/login").successHandler(successHandler).and()
.logout().logoutUrl(adminContextPath + "/logout").and()
.httpBasic().and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())//Cookie启用CSRF保护
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);//禁用执行器端点的CRSF保护
}
}
接下来需要在配置文件配置用户名和密码
spring.security.user.name=admin
spring.security.user.password=admin
如果你是使用方式一(server-client的方式)你需要在你的server配置中加入以下配置进行授权
spring.boot.admin.client:
url: client的地址
instance:
metadata:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
如果你是使用方式二(注册中心拉取服务列表的方式)需要加入以下配置进行授权
eureka:
instance:
metadata-map:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
加入以上配置和代码之后重启服务再次访问server的ip端口就会是一个登录页面输入配置文件的用户名和密码就可以查看监控信息了
最后在说一个发邮件的功能,一般发邮件都是自己手写一个JavaMailSender,这里我们只需要配置一下自己的邮件信息就可以发送了,所以是很方便简洁的,配置如下:
spring.boot.admin.notify.mail.enabled=true//开启邮件通知功能
spring.mail.host=smtp.xxx.com
spring.mail.port=25
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
#spring.mail.properties.mail.smtp.starttls.enable=true
#spring.mail.properties.mail.smtp.starttls.required=true
spring.boot.admin.notify.mail.from=xxx@qq.com//发送者
spring.boot.admin.notify.mail.cc=xxx@qq.com//抄送
spring.boot.admin.notify.mail.to=xxx@qq.com//发给谁
这样配置完成重启服务如果有服务DOWN或者UP就会发送邮件通知
好了以上只是一些主题功能,还有很多通知可以手动开启实现就不一一列出来了,我也没研究,哈哈只研究了一下邮件,还有日志级别也可以在这里修改等等
官网地址:http://codecentric.github.io/spring-boot-admin/2.0.4/#_securing_spring_boot_admin_server