序
今天本来是来参加公司所谓的核心员工的内部培训的,会议在下午,想着搞一天算加班。所以上午送老婆上班就顺便过来了,看了会技术视频,头有点大,就想着换换脑子。昨天看到一个朋友分享的SpringBoot+Prometheus+Grafana实现应用监控和报警,大概看了下springboot版本有点老,况且觉得现在spring生态有这样的组件支持为啥不试试,所以就整整这个Admin。这里分享的是springCloud使用Eureka下的监控监控,废话完毕。
一、各个服务开启actuator
说到底这个Admin实际就是对actuator监控监控没有界面的补充,所以要弄这个Admin必须先集成开启actuator。我这里因为是springCloud项目,且所有项目是简历在一个父级项目下的,所以我直接在父级的pom.xml增加对actuator的支持。
<!-- actuator支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
我这里因为各个springBoot服务都有自定义的WebMvcConfigurer类,里面有对请求进行拦截,所以我需要放开所有actuator的请求。我这里的放行请求url是放在一个global.yml配置文件里,各配置类拦截到请求先比较匹配确定是否要校验token,看看我这里/actuator/**.
#不校验token放行url
web:
pass:
url: /**/error,/**/login/**,/**/user/info/checkUserExist,/**/user/info/register,/**/getMobileValidCode,/**/user/info/forgetLoginPassword,/**/open/**,/**/file/storage/downloadFile,/actuator/**
验证各服务是否可以直接访问/actuator请求,例如我这里:
二、增加健康监控Admin moudle
这个建一个springBoot的maven项目我就不多说了,下面先看下结构:
1、pom.xml
<!-- 注册中心客户端支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- openFeign支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 配置中心支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- springboot admin支持 -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
</dependency>
<!-- security权限支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 邮件支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
这个module也是在主项目下的,所以里面没有actuator的引包。这几个除了配置中心、openFeign不是必须的(根据自己项目的情况)其他几个都是必须的。
2、配置文件
bootstrap.yml
#如果通过注册中心取配置,eureka的配置必须本地配置
eureka:
client:
serviceUrl:
defaultZone: http://@fsihouse.eureka@:8801/eureka/
instance:
metadata-map:
user.name: fsihouseAdmin
user.password: 123456
#配置信息获取配置设置
spring:
cloud:
config:
name: fsihouse-global-config,fsihouse-cloud-admin
profile: @spring.cloud.config.profile@
#uri: http://localhost:8802
discovery:
enabled: true
serviceId: fsihouse-cloud-config
loadbalancer: #springCloud已经包含,ribbon已经进入维护期,不会再增加新特性
ribbon:
enabled: false
main:
allow-bean-definition-overriding: true
这里要说明的是instance下的配置,这个里面的账号是配置的security安全方面的账号与后面的Admin的登录账号密码一致。
然后我这里因为是用的配置中心,可以看到是引入了global配置、admin的配置。
fsihouse-cloud-admin.yml
#admin的配置
server:
port: 9009
spring:
application:
name: FSIHOUSE-CLOUD-ADMIN
security: #security授权账号,与eureka里的账号一致
user:
name: fsihouseAdmin
password: 123456
boot:
admin:
ui:
title: 菲寓Admin
notify: #开启邮件通过
mail:
cc: zhengwen@xx.com #抄送
enabled: true #开启邮件通知功能
from: 269026790@qq.com #发送者
to: zwsky88@126.com #发给谁
mail:
host: smtp.qq.com
port: 465
username: 269026790@qq.com
password: xxxxxx
protocol: smtp
test-connection: true
properties:
mail.smtp.auth: true
mail.smtp.ssl.enable: true
mail.smtp.connectiontimeout: 5000
mail.smtp.writetimeout: 5000
mail.smtp.timeout: 3000
#日志配置
logging:
file:
name: ./logs/fsihouse-cloud-admin.log
level:
root: info
config: classpath:config/logback-spring.xml
path:
log: ./logs/fsihouse-cloud-admin/
3、java类
启动类,注意注解@EnableAdminServer
/**
* @author zhengwen
*/
@EnableDiscoveryClient
@EnableAdminServer
@SpringBootApplication
public class FsihouseCloudAdminApplication {
public static void main(String[] args) {
SpringApplication.run(FsihouseCloudAdminApplication.class, args);
System.out.println("--健康监控启动成功--");
}
}
配置类
/**
* @author zhengwen
**/
@Configuration
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
private final String adminContextPath;
public SecuritySecureConfig(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())
.ignoringAntMatchers(
adminContextPath + "/instances",
adminContextPath + "/actuator/**"
);
}
}
三、监控报警邮件提醒
这个其实已经在上面的pom.xml、admin.yml里都有了配置,也有描述。其实就是要引入mail支持,然后配置邮件发送、接收信息,注意password不是真实的密码,而是生成的客户端的专用密码。具体配置各邮箱都有说明。我这里是用qq邮箱试验的。
四、效果查看
账号密码与配置文件里的一致。
五、总结
先赞美下spring生态,这个真是不错,妈妈再也不用担心我服务不知不觉挂了的情况了。
但是也有不足,首先就是监控的界面都不怎么好看,发送的邮件更是不忍直视。
前面说的SpringBoot+Prometheus+Grafana好像做的更好,而且支持k8s,不过个人还是期待spring的生态做的更好点。其实理解这个原理了,自己都可以专门做个Admin,反正就是将actuator的一下指标美化展示嘛。另外就是部署说一下,这个Admin我个人觉得单独部署在一个靠谱服务器上才能真正起到监控效果,不然,那服务器都挂了,邮件肯定也发不出来。