¿Cómo monitorea Spring Boot el funcionamiento de SQL?

Hoy quiero hablarles sobre la función de monitoreo en Druid.

Creo que muchos socios pequeños han utilizado el grupo de conexiones de la base de datos Druid. Personalmente, Druid es un proyecto de código abierto relativamente exitoso en Alibaba. A diferencia de Fastjson, Druid siempre ha sido excelente en todos los aspectos, con funciones completas, uso conveniente y uso básico. Sin Además, echemos un vistazo a las funciones de monitoreo en Druid hoy.

1. Preparativos

Primero, creemos un proyecto Spring Boot, introduzcamos MyBatis, etc., de la siguiente manera:

Elija los controladores MyBatis y MySQL y haga un caso de prueba simple.

Primero conectémonos a la base de datos:

spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///test05?serverTimezone=Asia/Shanghai

Cree una clase de entidad de usuario y realice un caso de consulta simple, de la siguiente manera:

public class User {
    
    
    private Integer id;
    private String username;
    private String address;
    private String password;
    private String email;
    //省略 getter/setter
}
@Mapper
public interface UserMapper {
    
    
    List<User> getUserByUsername(String username);
}
@Service
public class UserService {
    
    
    @Autowired
    UserMapper userMapper;
    public List<User> getUserByUsername(String username){
    
    
        return userMapper.getUserByUsername(username);
    }
}
@RestController
public class UserController {
    
    
    @Autowired
    UserService userService;

    @GetMapping("/user")
    public List<User> getUser(String username) {
    
    
        return userService.getUserByUsername(username);
    }
}

UserMapper.xml es el siguiente:

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.javaboy.druid_monitor.mapper.UserMapper">
    <select id="getUserByUsername" resultType="org.javaboy.druid_monitor.model.User">
        select * from user where username=#{username}
    </select>
</mapper>

Una prueba muy sencilla, no hay mucho que decir.

Todo el mundo es libre de crear este entorno. Si ya tiene un caso persistente, vaya directamente a la segunda sección para presentar a Druid.

Ahora, el grupo de conexión de base de datos predeterminado que se usa en este proyecto es HikariDataSource, que es el grupo de conexión de base de datos predeterminado en Spring Boot. De hecho, esto no está mal.

2. Presentando al druida

A continuación presentamos a Druid:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

Tenga en cuenta que el Druid presentado por Spring Boot es el anterior, que será más conveniente al configurar el monitoreo en el futuro.

A continuación, configuramos WebStatFilter en application.properties.WebStatFilter se usa para recopilar datos relacionados con el monitoreo de web-jdbc:

# 启用 WebStatFilter
spring.datasource.druid.web-stat-filter.enabled=true
# 配置拦截规则
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 排除一些不必要的 url,这些 URL 不会涉及到 SQL 查询
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
# 开启 session 统计功能
spring.datasource.druid.web-stat-filter.session-stat-enable=true
# 缺省 sessionStatMaxCount 是 1000 个,我们可以按需要进行配置
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
# 配置 principalSessionName,使得 druid 能够知道当前的 session 的用户是谁
# 根据需要,这个参数的值是 user 信息保存在 session 中的 sessionName
#spring.datasource.druid.web-stat-filter.principal-session-name=
# 下面这个配置的作用和上面配置的作用类似,这个是通过 Cookie 来识别用户
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
# 开启 profile 后就能够监控单个 URL 地址调用列表
#spring.datasource.druid.web-stat-filter.profile-enable=

Podemos configurar los primeros cinco, y los últimos tres no necesitan ser configurados.El significado de cada configuración se ha enumerado en el código.

A continuación, abra la configuración de StatViewServlet, de la siguiente manera:

# 启用内置的监控页面
spring.datasource.druid.stat-view-servlet.enabled=true
# 内置监控页面的地址
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 开启 Reset All 功能
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 设置登录用户名
spring.datasource.druid.stat-view-servlet.login-username=javaboy
# 设置登录密码
spring.datasource.druid.stat-view-servlet.login-password=123
# 白名单(如果allow没有配置或者为空,则允许所有访问)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
# 黑名单(deny 优先于 allow,如果在 deny 列表中,就算在 allow 列表中,也会被拒绝)
spring.datasource.druid.stat-view-servlet.deny=

Configure la dirección de la página y configure la lista blanca y negra.

Cabe señalar que incluso si la propiedad reset-enable se establece en false, se mostrará el botón de reinicio, pero al hacer clic en el botón no se restablecerá.

Vale eso es todo.

3. prueba

Ok, comencemos el proyecto Spring Boot para probar.

Después de que el proyecto Spring Boot se haya iniciado con éxito, primero visite la siguiente dirección:

  • http://localhost:8080/druida/login.html

En este punto veremos la página de autenticación de inicio de sesión, de la siguiente manera:

Ingrese el nombre de usuario/contraseña (javaboy/123) que configuramos anteriormente para iniciar sesión. Después de iniciar sesión correctamente, podrá ver la siguiente página:

Como puede ver en la barra de título, la fuente de datos, el monitoreo de SQL, el firewall de SQL y otras funciones están todas disponibles.

A continuación, accedemos a la http://localhost:8080/user?username=aaadirección y ejecutamos un SQL, una vez completada la ejecución, veamos el seguimiento del SQL:

Como puede ver, hay un registro de seguimiento de la ejecución de SQL en este punto.

También se pueden ver otros datos de seguimiento, no los enumeraré uno por uno. Si cree que los datos que se muestran aquí no son intuitivos y desea dibujar páginas HTML usted mismo, está bien. Haga clic en la API JSON al final, puede ver la dirección JSON de cada elemento de monitoreo y puede mostrarla como desee. quiero con JSON.show.

4. Ir a anuncios

Si desea usar esta página de monitoreo directamente, esta tiene el anuncio de Ali, como se muestra en la figura a continuación, si la empresa la usa, será muy incómodo:

Es posible que queramos deshacernos de este anuncio, lo cual también es fácil.

Primero, después del análisis, encontramos que el anuncio se crea a partir de un archivo llamado common.js, que se encuentra druid-1.2.8.jar!/support/http/resources/js/common.jsaquí , y el archivo common.js tiene las siguientes líneas:

init : function() {
    
    
	this.buildFooter();
	druid.lang.init();
},
buildFooter : function() {
    
    
	var html ='';
	$(document.body).append(html);
},

La lógica general es la anterior, el método buildFooter es responsable de construir el anuncio al final de la página y la llamada al método buildFooter se completa en el método init.

Entonces, si desea eliminar anuncios, simplemente no llame al método buildFooter.

Entonces, nuestra idea de publicidad también es muy simple, escriba un filtro, intercepte la solicitud a common.js y luego haga una pequeña modificación, de la siguiente manera:

@WebFilter(urlPatterns = "/druid/js/common.js")
public class RemoveAdFilter implements Filter {
    
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        String text = Utils.readFromResource("support/http/resources/js/common.js");
        text = text.replace("this.buildFooter();", "");
        servletResponse.getWriter().write(text);
    }
}

Se puede ver que este filtro es para interceptar la /druid/js/common.jssolicitud Después de interceptar, lea el archivo common.js en el archivo usted mismo, luego reemplace manualmente this.buildFooter();esta oración y finalmente escriba el archivo.

Por supuesto, recuerde escanear el Filtro en la clase de inicio, de la siguiente manera:

@SpringBootApplication
@ServletComponentScan("org.javaboy.druid_monitor.filter")
public class DruidMonitorApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(DruidMonitorApplication.class, args);
    }

}

Bien, eso es todo, con este filtro los anuncios se han ido.

Puede descargar este caso respondiendo a druid_monitor en el fondo de la cuenta oficial.

Referencias:

  • https://github.com/alibaba/druida/wiki/

Supongo que te gusta

Origin blog.csdn.net/u012702547/article/details/122941479
Recomendado
Clasificación