文章目录

  • 1、服务监控的实现思路
  • 2、SpringBoot Admin服务端
  • 3、SpringBoot Admin客户端
  • 4、实现原理--Actuator与端点
  • 5、关于端点


1、服务监控的实现思路

监控的意义:

  • 监控服务状态是否宕机
  • 监控服务运行指标:内存、虚拟机、线程、请求等
  • 监控日志
  • 管理服务:服务下线与启动

当要监控的服务很多时,一个个去查看很不方便,因此考虑引入一个显示所有服务监控信息的服务。这个服务如果只能等待被监控的服务上报数据,那就会有延迟(比如人5分钟一上报),因此需要既支持上报,也支持主动拉取。但从安全方面来想,你做一个监控服务,然后想监控谁就监控谁,不管别人是否同意,这也是不合理的,因此,需要被监控方配置了对应的监控地址,才能监控。如此就有这样一个效果:被监控方来决定,我受不受你监控,我的哪些数据可以被监控。而对于负责监控的服务,又可以主动拉取其他服务的监控数据。

springboot 常见的内存泄漏_后端

  • 显示监控信息的服务:用于获取服务信息,并显示对应的信息
  • 运行的服务:启动时主动上报,告知监控服务器自己需要受到监控

而SpringBoot Admin就是这样的一个技术:

Spring Boot Admin,开源社区项目,用于管理和监控SpringBoot应用程序。 客户端注册到服务端后,通过HTTP请求方式,服务端定期从客户端获取对应的信息,并通过UI界面展示对应信息。

2、SpringBoot Admin服务端

先来做SpringBoot Admin的服务端,也就是上面思路里负责监控所有服务的那个服务。引入依赖:

<dependency>    
	<groupId>de.codecentric</groupId>    
	<artifactId>spring-boot-admin-starter-server</artifactId>    
	<version>2.5.4</version>
</dependency>
<!--这个版本不是SpringBoot维护的,
	注意和SpringBoot的版本保持相近
-->

当然一般来说,服务端都是新创建的模块,那直接勾选Ops里的Admin Server也行

springboot 常见的内存泄漏_后端_02


另外,如果是新模块的话,也记得加入mvc的依赖,配成web服务,不然服务启动完又停了:

springboot 常见的内存泄漏_spring boot_03

<dependency>    
	<groupId>org.springframework.boot</groupId>    
	<artifactId>spring-boot-starter-web</artifactId>    
</dependency>

新模块的话记得改下服务端口,别冲突了:

server:  
  port: 8080

启动类加@EnableAdminServer注解开启用Spring-Admin:

@SpringBootApplication
@EnableAdminServer
public class SpringbootServerApplication {    
	public static void main(String[] args) {        
		SpringApplication.run(SpringbootServerApplication.class, args);    
	}
}

访问IP:PORT即可进入服务端监控页面

springboot 常见的内存泄漏_spring boot_04

3、SpringBoot Admin客户端

SpringBoot Admin即要被监控的服务,首先引入admin客户端依赖:

<dependency>    
	<groupId>de.codecentric</groupId>    
	<artifactId>spring-boot-admin-starter-client</artifactId>    
	<version>2.5.4</version>
</dependency>
<!--这个版本不是SpringBoot维护的,注意和SpringBoot的版本保持相近-->

待监控的客户端服务加配置,这些配置就是上面说的"受不受监控,哪些数据可以被监控"。

spring:  
  boot:    
    admin:      
      client:        
        url: http://localhost:8080  # The admin server urls to register at 
        
management:  
  endpoint:    
    health:     
      show-details: always  # 服务的健康信息默认也是不开放的,默认never,改为always  
  endpoints:    
    web:     
      exposure:       
        include: "*"  # 别直接写个*,记得加单引号或者双引号。默认值为health,所以没配这一项的时候可以看到健康状况

修改完成,重启客户端服务,查看服务端页面,可以看到监控成功:

springboot 常见的内存泄漏_后端_05

springboot 常见的内存泄漏_后端_06

如果配置中只写了允许监控服务监控状况,那服务端页面就长这样:

springboot 常见的内存泄漏_spring boot_07

4、实现原理–Actuator与端点

看下客户端的依赖,里面有个actuator,Actuator提供了SpringBoot生产就绪功能,通过端点的配置与访问,获取端点信息。端点就是某一类监控信息,如health就是一个端点。SpringBoot提供了多个内置端点,也可以根据需要自定义端点信息。

springboot 常见的内存泄漏_SpringBootAdmin_08

访问当前应用所有端点信息:GET => 客户端ip:port/actuator

springboot 常见的内存泄漏_spring boot_09

访问某个端点的详细信息:GET => 客户端ip:port/actuator/端点名称

springboot 常见的内存泄漏_spring boot_10

5、关于端点

springboot 常见的内存泄漏_java_11


springboot 常见的内存泄漏_SpringBootAdmin_12

Web程序专用端点:

springboot 常见的内存泄漏_后端_13

关于端点的启用,通过enabled来启用指定端点:

management:  
  endpoint:    
    health:   # 端点名称      
      enabled: true      # health必须开放,要不SpringBoot Admin启动就报错了
      show-details: always    
    beans:    # 端点名称      
      enabled: true
    info:
      enabled: false 
    # ......

要启用所有端点的话:

management: 
  endpoints:    
    enabled-by-default: true

回顾下前面客户端SpringBoot Admin的部分配置,上面是决定是否对外开放这个数据,下面的只针对web方式:

management:  
  endpoint:    # 这里配的是:是否对外开放
    health:     
      show-details: always  
  endpoints:    
    web:        # 这个是配能不能在web下看到
      exposure:       
        include: "*"

端点中包含的信息存在敏感信息,需要对外暴露端点功能时手动设定指定端点信息,对于Jmx方式,默认都开启,没有排除的,如下表:

springboot 常见的内存泄漏_spring boot_14

展开就是:

springboot 常见的内存泄漏_java_15


springboot 常见的内存泄漏_SpringBootAdmin_16

jmx的方式即jconsole,cmd打开DOS窗口输入jconsole,选择要查看的服务即可:

springboot 常见的内存泄漏_后端_17