微服务中一个监控Spring Boot的神器

你是不是在一个月黑风高的晚上想过这么一件事情,就是想把spring boot actuator的那些endpoint可视化,是不是想着自己搞一个UI。

每当你有这种想法的时候,建议你一定要首先想想:开源世界是不是早就有人做了。

没错,有人为你做好了。其中最有名的当属spring-boot-admin这个项目了。

spring boot admin是个什么鬼呢?就是一个可以监控和管理spring boot应用的admin管理应用。原理很简单,就是把spring boot actuator中的那些endpoint暴露出来的json数据进行可视化显示到界面上。admin前端使用的是angularjs和bootstrap。一个spring boot应用要想接受监控和管理,很简单,只需要引入client依赖就可以了,如果你的spring boot是一个spring cloud管理的微服务应用的话。那么客户端几乎不用做什么,只需要在admin server上配置一下就可以监控服务注册中心的所有应用了,这里说的服务注册中心比如eureka,consul,zookeeper等。

创建 Spring Boot Admin Server

首先新建一个spring boot应用。

然后引入以下依赖:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server</artifactId>
   <version>1.4.6</version>
</dependency>
<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server-ui</artifactId>
   <version>1.4.6</version>
</dependency>

note:现在最新的release是1.4.6

然后在你的spring boot main application上加上如下注解,主要是autoconfiguration、enableadminserver以及configuration:

@Configuration
@EnableAutoConfiguration
@EnableAdminServer 
@EnableDiscoveryClient
@EnableTurbine
@EnableHystrixDashboard
public class SpringBootAdminApplication 

eureka方式使用

然后你需要配置eureka所在的地址,在yml文件中:

eureka:
  instance:
    leaseRenewalIntervalInSeconds: 10
    preferIpAddress: true
  client:
    registryFetchIntervalSeconds: 5
    serviceUrl:
      defaultZone: ${EUREKA_SERVICE_URL:http://localhost:1111}/
          eureka/

如果你的eureka是个集群,那么url逗号隔开就是了。

这里只说了通过服务注册中心来获取spring boot应用的使用。

纯客户端使用

你的spring boot应用没有注册到spring cloud注册中心,那么你只需要在自己的

客户端中引入如下依赖:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-starter-client</artifactId>
   <version>1.4.6</version>
</dependency>

然后在配置文件中添加spring boot admin server的url就是可以了:

spring:
  boot:
    admin:
      url: http://localhost:8080

启动server

现在你启动你刚刚创建的admin server,就可以看到如下界面:

是不是很炫酷。

可以看到在应用列表中已经显示了我们刚刚在eureka上注册的应用了。

你也许看到了就是version信息以及info信息。默认这个是没有的。你需要配置插件。

另外记住就是spring boot应用要把endpoint开启:

management:
  security:
    enabled: false

这里为了演示,只是进行了简单的安全禁用。在实际生产中,你需要为此配置安全验证。

扩展增强

在应用列表中显示版本

你只需要在你的spring boot 应用的pom中加入如下plugin:

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <executions>
      <execution>
         <goals>
            <goal>build-info</goal>
         </goals>
      </execution>
   </executions>
</plugin>

然后执行下build-info就可以了:

日志级别管理

默认是不支持的。

你只需要在logback xml中加入:

<include resource="org/springframework/boot/logging/logback/base.xml"/>
<jmxConfigurator/>

然后加入依赖:

<dependency>
   <groupId>org.jolokia</groupId>
   <artifactId>jolokia-core</artifactId>
</dependency>

然后就可以了:

日志显示

只需要在你的spring boot应用的properties中配置如下:

logging:
  path: /Users/hezhuofan/Downloads/

然后就可以显示日志了:

至于这个是什么原理呢?你懂的,actuator endpoint。

JMX-bean管理

加入这个依赖就可以了:

<dependency>
   <groupId>org.jolokia</groupId>
   <artifactId>jolokia-core</artifactId>
</dependency>

界面:

hystrix ui支持

spring boot admin还可以集成hystrix展示。

1、加入依赖:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server-ui-hystrix</artifactId>
   <version>1.4.6</version>
</dependency>

2、添加/hystrix.stream endpint:

# tag::configuration-ui-hystrix[]
spring.boot.admin.routes.endpoints: env,metrics,trace,dump,jolokia,info,configprops,trace,logfile,refresh,flyway,liquibase,heapdump,hystrix.stream,activiti
# end::configuration-ui-hystrix[]

3、界面:

turbine ui支持

spring boot admin还可以集成turbine展示。

1、加入依赖:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server-ui-turbine</artifactId>
   <version>1.4.6</version>
</dependency>

2、配置turbine的url和cluster,application.yml:

spring.boot.admin.turbine:
  clusters: demo-cluster
  url: ${SPRING_BOOT_ADMIN_TURBINE_URL:http://localhost:8989/turbine.stream}

3、界面:

activiti ui支持

1、添加依赖:

<dependency>
   <groupId>de.codecentric</groupId>
   <artifactId>spring-boot-admin-server-ui-activiti</artifactId>
   <version>1.4.6</version>
</dependency>

2、添加activiti endpoint:

spring.boot.admin.routes.endpoints: env,metrics,trace,dump,jolokia,info,configprops,trace,logfile,refresh,flyway,liquibase,heapdump,hystrix.stream,activiti

login ui支持

登陆ui目前官方文档上还没介绍。但在github仓库里已经有了。

这里分别把和login ui的都贴出来吧。

application.yml:

---

logging:
  file: "target/boot-admin-sample.log"

management:
  context-path: "/actuator"

spring:
  application:
    name: "Spring Boot Admin Server"

  profiles:
    active:
      secure
server:
  port: 9090

---


management:
  security:
    enabled: false

security:
  basic:
    enabled: true

---
spring:
  mail:
    host:smtp.exmail.qq.com
  profiles: secure
  boot:
    admin:
      notify:
          mail:
             to:hezhuofan@qq.com
      username: "${security.user.name}"       #These two are needed so that the client
      password: "${security.user.password}"   #can register at the protected server api
      client:
        metadata:
          user.name: "${security.user.name}"          #These two are needed so that the server
          user.password:  "${security.user.password}" #can access the proteceted client endpoints

security:
  user:
    name: user
    password: pass

代码:

@Profile("secure")
// tag::configuration-spring-security[]
@Configuration
public static class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Page with login form is served as /login.html and does a POST on /login
        http.formLogin().loginPage("/login.html").loginProcessingUrl("/login").permitAll();
        // The UI does a POST on /logout on logout
        http.logout().logoutUrl("/logout");
        // The ui currently doesn't support csrf
        http.csrf().disable();

        // Requests for the login page and the static assets are allowed
        http.authorizeRequests()
                .antMatchers("/login.html", "/**/*.css", "/img/**", "/third-party/**")
                .permitAll();
        // ... and any other request needs to be authorized
        http.authorizeRequests().antMatchers("/**").authenticated();

        // Enable so that the clients can authenticate via HTTP basic for registering
        http.httpBasic();
    }
}
// end::configuration-spring-security[]

前端代码:

具体代码稍后我会贴到“原文阅读”处。

效果:

用户名:user,密码:pass

然后进入:

看到没?右上角有个“退出”,点击退出就退出了。

你也许疑惑为什么是中文,那是因为我把js改了一下。默认会有一点乱码:

默认长这样:

此外,spring boot admin还支持通知告警功能。这里就不赘述了。你可以自己去官网查阅。

总结

spring boot admin作为一个把endpoint端点可视化的web应用,至少比你看json要好很多,而且还支持了其他监控管理功能。而且还对spring cloud支持友好。毫无疑问,是你在微服务化过程中或spring boot应用监控方案中一个不可获取的选择之一。

你也可以针对此admin进行自己的扩展,从而使用你所在公司的需求。

ps:上面说的login-ui 的代码 你可以去spring boot admin的github去复制粘贴,然后改改就可以了。相信未来这些都不用你来搞了,直接引入依赖就好了。

原文发布于微信公众号 - ImportSource(importsource)

原文发表时间:2017-03-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源项目

码云推荐 | J2EE 快速开发平台 renren-security-boot

renren-security-boot 是一款基于代码生成器的 J2EE 快速开发平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展;使用 Spring...

47880
来自专栏zhisheng

HBase 集群监控

为什么需要监控? 为了保证系统的稳定性,可靠性,可运维性。 掌控集群的核心性能指标,了解集群的性能表现。 集群出现问题时及时报警,便于运维同学及时修复问题。 集...

69480
来自专栏菩提树下的杨过

intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理

之前写过一篇IntelliJ IDEA 13试用手记 ,idea还有很多高大上的功能,易用性几乎能与vs.net媲美,反正我自从改用idea后,再也没开过ecl...

47450
来自专栏Web项目聚集地

RESTful 接口实现简明指南

在我所见过的 RESTful 接口的实现中,以 GitHub 最让人惊叹。我第一次如此强烈得感受到 REST 接口的美妙,完全满足了我所期待的「接口的形式美感」...

10010
来自专栏aoho求索

微服务网关netflix-zuul

引言:前面一个系列文章介绍了认证鉴权与API权限控制在微服务架构中的设计与实现 ,好多同学询问有没有完整的demo项目,笔者回答肯定有的。由于之前系列文章侧重讲...

66690
来自专栏Java技术栈

10个Eclipse珍藏插件推荐

1、Open Explorer 打开资源管理器插件,这是一个从Eclipse里面可以直接定位打开windows资源管理器文件的插件,这个版本的插件在最新的Ecl...

38180
来自专栏happyJared

Hexo,自定义域名http升级https

  数数手指头,我这基于 Hexo + GitHub Page 搭起来的个人博客也有两个月时间了,之前就想过把 http 升级为 https,无奈因为各种原因也...

23420
来自专栏java一日一条

SSH框架总结

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于...

21240
来自专栏about云

flume应该思考的问题

问题导读 1.flume的配置你是如何理解的? 2.flume与kafka整合,kafka可以做哪些组件? 3.flume与kafka的区别是什么? flu...

438110
来自专栏后端云

实时操作系统

一般的linux都是GPOS(通用)内核。GPOS是不保证实时的,但是对于大多数应用程序来说是没有问题的。GPOS可以充分利用物理资源。但在实时性要求性比较高的...

36770

扫码关注云+社区

领取腾讯云代金券