今天本来是来参加公司所谓的核心员工的内部培训的,会议在下午,想着搞一天算加班。所以上午送老婆上班就顺便过来了,看了会技术视频,头有点大,就想着换换脑子。昨天看到一个朋友分享的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请求,例如我这里:

springcloud 微服务跟踪 springcloud微服务监控_springbootAdmin

二、增加健康监控Admin moudle

这个建一个springBoot的maven项目我就不多说了,下面先看下结构:

springcloud 微服务跟踪 springcloud微服务监控_微服务监控监控_02


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邮箱试验的。

四、效果查看

springcloud 微服务跟踪 springcloud微服务监控_springbootAdmin_03


账号密码与配置文件里的一致。

springcloud 微服务跟踪 springcloud微服务监控_springcloud 微服务跟踪_04


springcloud 微服务跟踪 springcloud微服务监控_springbootAdmin_05


springcloud 微服务跟踪 springcloud微服务监控_springcloud 微服务跟踪_06


五、总结

先赞美下spring生态,这个真是不错,妈妈再也不用担心我服务不知不觉挂了的情况了。

但是也有不足,首先就是监控的界面都不怎么好看,发送的邮件更是不忍直视。

前面说的SpringBoot+Prometheus+Grafana好像做的更好,而且支持k8s,不过个人还是期待spring的生态做的更好点。其实理解这个原理了,自己都可以专门做个Admin,反正就是将actuator的一下指标美化展示嘛。另外就是部署说一下,这个Admin我个人觉得单独部署在一个靠谱服务器上才能真正起到监控效果,不然,那服务器都挂了,邮件肯定也发不出来。