SpringBoot + Druid는 MySQL을 모니터링하고 느린 SQL을 빠르게 찾을 수 있으며 사용하기 정말 쉽습니다!

예를 들어 C3P0,DBCP,hikari, DruidHikariCP는 약간 빠르지만 Druid는 강력한 모니터링 및 확장 기능을 제공할 수 있으며 Alibaba의 오픈 소스 프로젝트이기도 합니다.

Druid는 Monitoring으로 알려진 Alibaba에서 개발한 데이터베이스 연결 풀로 기능, 성능 및 확장성 등에서 다른 데이터베이스 연결 풀을 능가하며 모든 것을 몇 초 만에 죽입니다 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource.

Druid는 DB 풀 연결 및 SQL 실행을 매우 잘 모니터링할 수 있으며 모니터링을 위한 DB 연결 풀입니다.

Spring Boot의 기본 데이터 소스는 Spring Boot 2.x에서 기본적으로 Hikari 데이터 소스를 사용한다고 소개 HikariDataSource했는데 JdbcTemplate, Hikari와 Driud는 Java Web에서 가장 좋은 데이터 소스라고 할 수 있습니다.

그리고 Druid는 몇 년 동안 생산 환경에서 대규모 배포에 대한 엄격한 테스트를 거친 후 Alibaba에 600개 이상의 애플리케이션을 배포했습니다!

  • stat:StatFilter Druid는 통계 모니터링 정보를 위한  내장 기능을 제공합니다 .

  • wall:  SQL 삽입 공격에 대한 Druid의 방어는 WallFilterDruid의 SQL Parser 분석을 통해 이루어집니다. Druid는 SQL Parser하위 데이터베이스 하위 테이블, 감사 등과 같은 해당 처리를 위해 JDBC 계층에서 SQL을 가로챌 수 있습니다.

  • log4j2:  문제 해결을 위해 log4j2에 SQL 문을 인쇄할 수 있는 로깅 기능입니다.

1. 관련 구성

1.1 종속성 추가

<properties>
    <java.version>1.8</java.version>
    <alibabaDruidStarter.version>1.2.11</alibabaDruidStarter.version>
</properties>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>${alibabaDruidStarter.version}</version>
</dependency>

1.2 구성 속성

  • Druid 데이터 소스(연결 풀) 구성:  c3p0 및 dbcp 데이터 소스가 데이터 소스 연결 초기화 크기, 최대 연결 수, 대기 시간, 최소 연결 수 등을 설정할 수 있는 것과 마찬가지로 Druid 데이터 소스도 동일한 방식으로 설정할 수 있습니다. .

  • Druid 웹 모니터링 필터(WebStatFilter) 구성:  이 필터의 기능은 웹 애플리케이션 요청에서 발행된 sql 문, sql 실행 시간, 요청 수, 요청된 url 주소 및 seesion 모니터링, 데이터베이스 테이블과 같은 모든 데이터베이스 정보를 카운트하는 것입니다. 방문 등

  • Druid 백그라운드 관리 서블릿 구성(StatViewServlet):  Druid 데이터 소스에는 모니터링 기능이 있으며 사용자가 볼 수 있는 웹 인터페이스를 제공합니다. 라우터를 설치할 때와 마찬가지로 기본 웹 페이지도 제공하므로 Druid 백그라운드를 설정해야 합니다. 관리 페이지 로그인 계정, 비밀번호 등과 같은 속성

[참고]: 구성 속성의 이름은 Druid를 완전히 따릅니다.Druid 데이터베이스 연결 풀을 구성하고 Spring Boot 구성 파일을 통해 모니터링할 수 있습니다.구성이 없으면 기본값을 사용하십시오. Druid Spring Boot Starter다음과 같이 application.yml관련 속성을 구성하십시오 .

# spring 配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    password: 123456
    username: root
    url: jdbc:mysql://localhost:3306/superjson?useUnicode=true&characterEncoding=utf8&useSSL=false
    # 连接池配置
    druid:
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      # 配置获取连接等待超时的时间
      max-wait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存时间
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1 FROM user
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 打开 PSCache,并且指定每个连接上 PSCache 的大小
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
      filters: stat,wall,slf4j
      # 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录
      connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      # 配置 DruidStatFilter
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
      # 配置 DruidStatViewServlet
      stat-view-servlet:
        url-pattern: /druid/*
        # IP 白名单,没有配置或者为空,则允许所有访问
        allow: 127.0.0.1
        # IP 黑名单,若白名单也存在,则优先使用
        deny: 192.168.31.253
        # 禁用 HTML 中 Reset All 按钮
        reset-enable: false
        # 登录用户名/密码
        login-username: root
        login-password: 123456
        # 需要设置enabled=true,否则会报出There was an unexpected error (type=Not Found, status=404).错误,或者将druid-spring-boot-starter的版本降低到1.1.10及以下
        # 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
        enabled: true

위 구성 파일의 매개변수는 com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties및  에서 찾을 수 있습니다 org.springframework.boot.autoconfigure.jdbc.DataSourcePropertie.

1.3 필터 구성

spring.datasource.druid.filters=stat,wall,log4j ...해당 내장 필터는 메서드를 통해 활성화할 수 있지만 이러한 필터는 모두 기본 구성입니다. 기본 구성이 요구 사항을 충족하지 못하는 경우 이 방법을 포기하고 다음과 같이 구성 파일을 통해 필터를 구성할 수 있습니다.

# 配置StatFilter 
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

# 配置WallFilter 
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false

spring.datasource.druid.filter.*현재 ( )에 따라 구성된 다음 필터에 대한 구성 지원이 제공됩니다 .

  • StatFilter

  • 월필터

  • 구성 필터

  • 인코딩 변환 필터

  • Slf4jLogFilter

  • Log4jFilter

  • Log4j2Filter

  • CommonsLogFilter

기본 제공 필터를 사용하지 않으려면 해당 필터의 활성화를 참으로 설정하여 사용자 지정 필터 구성을 적용해야 합니다.StatFilter는 기본적으로 비활성화되어 있으며 활성화를 활성화하려면 활성화를 참으로 설정할 수 있습니다 Druid Spring Boot Starter.

2. 모니터링 페이지

2.1 프로젝트를 시작한 후 http://localhost:8081/druid/login.html로그인 페이지에 액세스하고 아래와 같이 사용자 이름과 비밀번호를 입력하여 로그인합니다.

2.2 데이터 소스 페이지는 현재 DataSource 구성의 기본 정보로 위에서 설정한 Filter를 찾을 수 있으며, Filter를 설정하지 않은 경우(일부 정보는 집계되지 않음, 예를 들어 SQL 모니터링에서 JDBC를 얻을 수 없음) 관련 SQL 실행 정보)

2.3 모든 SQL 문의 실행을 카운트하는 SQL 모니터링 페이지

2.4 모든 컨트롤러 인터페이스의 액세스 및 실행을 계산하는 URL 모니터링 페이지

2.5 지정된 인터페이스의 실행 시간 및 jdbc 번호를 기록하기 위해 aop를 사용하는 Spring 모니터링 페이지

2.6 SQL 방화벽 페이지

Druid는 블랙리스트와 화이트리스트에 대한 액세스를 제공하며 SQL 보호 상황을 명확하게 볼 수 있습니다.

2.7 세션 모니터링 페이지

현재 세션 상태, 생성 시간, 마지막 활성 시간, 요청 수 및 요청 시간과 같은 세부 매개 변수를 볼 수 있습니다.

2.8 JSON API 페이지

api 형태로 Druid의 모니터링 인터페이스에 접근하고, api 인터페이스는 Json 형태로 데이터를 반환합니다.

3. SQL 모니터링

Druid 웹 모니터링 필터( WebStatFilter)를 구성하여 웹 애플리케이션 요청에서 SQL 문 실행, SQL 실행 시간, 요청 수, 요청 URL 주소 및 Seesion 모니터링, 데이터베이스 테이블 액세스 시간, 구성 등 모든 데이터베이스 정보를 계산하는 데 사용됩니다. 다음과 같이:

spring:
  datasource:
    druid:
      ########## 配置WebStatFilter,用于采集web关联监控的数据 ##########
      web-stat-filter:
        enabled: true                   # 启动 StatFilter
        url-pattern: /*                 # 过滤所有url
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url
        session-stat-enable: true       # 开启session统计功能
        session-stat-max-count: 1000    # session的最大个数,默认100

4. 느린 SQL 레코드

때때로 시스템의 일부 SQL이 매우 느리게 실행되고 이를 기록하기 위해 로그를 사용하려는 경우 Druid의 느린 SQL 기록 기능을 활성화하고 다음과 같이 구성할 수 있습니다.

spring:
  datasource:
    druid:
      filter:
        stat:
          enabled: true         # 开启DruidDataSource状态监控
          db-type: mysql        # 数据库的类型
          log-slow-sql: true    # 开启慢SQL记录功能
          slow-sql-millis: 2000 # 默认3000毫秒,这里超过2s,就是慢,记录到日志

시작 후 느린 SQL이 발생하면 로그에 출력됩니다.

5. 스프링 모니터링

액세스 후 스프링 모니터링에는 기본적으로 데이터가 없지만 다음과 같이 SprngBoot의 AOP Starter를 가져와야 합니다.

<!--SpringBoot 的aop 模块-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

동시에 application.yml에서 다음과 같이 구성해야 합니다.

com.springboot.template.dao.*Spring은 쉼표로 구분된 여러 영어 구성 과 같은 AOP 진입점을 모니터링합니다.

spring.datasource.druid.aop-patterns="com.springboot.template.dao.*"

6. 광고 제거(Ad)

모니터링 페이지를 방문하면 아래와 같이 페이지 하단(바닥글)에 Alibaba의 광고가 표시될 수 있습니다.

이유: 가져온 druid jar 패키지의 common.js(페이지 바닥글에 광고를 추가하기 위한 js 코드가 있음)

제거하려면 두 가지 방법이 있습니다.

6.1 이 코드를 직접 수동으로 주석 처리

Maven을 사용하는 경우 로컬 웨어하우스로 직접 이동하여 jar 패키지를 찾고 다음 코드를 주석 처리합니다.

// this.buildFooter();

common.js의 위치:

com/alibaba/druid/1.1.23/druid-1.1.23.jar!/support/http/resources/js/common.js

6.2 필터로 필터링

common.js다음 코드와 같이 필터를 등록하고 요청을 필터링 하고 정규식을 사용하여 관련 광고 콘텐츠를 교체합니다.

@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled",
havingValue = "true", matchIfMissing = true)
public class RemoveDruidAdConfig {

    /**
    * 方法名: removeDruidAdFilterRegistrationBean
    * 方法描述 除去页面底部的广告
    * @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties
    * @return org.springframework.boot.web.servlet.FilterRegistrationBean
    */
    @Bean
    public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) {

        // 获取web监控页面的参数
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
        // 提取common.js的配置路径
        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");

        final String filePath = "support/http/resources/js/common.js";

        //创建filter进行过滤
        Filter filter = new Filter() {
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {}

            @Override
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                chain.doFilter(request, response);
                // 重置缓冲区,响应头不会被重置
                response.resetBuffer();
                // 获取common.js
                String text = Utils.readFromResource(filePath);
                // 正则替换banner, 除去底部的广告信息
                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
                text = text.replaceAll("powered.*?shrek.wang</a>", "");
                response.getWriter().write(text);
            }

            @Override
            public void destroy() {}
        };

        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns(commonJsPattern);
        return registrationBean;
    }
}

두 가지 방법을 모두 사용할 수 있으며 근본 원인에서 문제를 해결하려면 첫 번째 방법을 사용하는 것이 좋습니다.

7. Druid 모니터링 데이터 얻기

Druid의 모니터링 데이터는 다음을 사용 StatFilter하여 얻을 수 있습니다 DruidStatManagerFacade.

DruidStatManagerFacade#getDataSourceStatDataList이 방법은 모든 데이터 소스에서 모니터링 데이터를 얻을 수 있으며, DruidStatManagerFacade필요에 따라 선택하여 사용할 수 있는 몇 가지 다른 방법이 제공됩니다.

@RestController
@RequestMapping(value = "/druid")
public class DruidStatController {

    @GetMapping("/stat")
    public Object druidStat(){
        // 获取数据源的监控数据
        return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/2301_77463738/article/details/131484742
Recomendado
Clasificación