Spring Boot + Druid는 간단하고 실용적인 MySQL 성능 모니터링을 구현합니다!

출처: blog.csdn.net/lvoelife/article/details/128092586

1. 기본 개념

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

Druid는 모니터링이라고 알려진 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: 문제 해결을 위해 SQL 문을 log4j2에 인쇄할 수 있는 로깅 기능입니다.

2. 관련 구성

2.1 종속성 추가

Spring Boot의 기본에 대해서는 소개하지 않겠습니다. 다음 실제 프로젝트를 시청하는 것이 좋습니다.

https://github.com/javastacks/spring-boot-best-practice

<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>

2.2 구성 속성

  • Druid 데이터 소스 구성(연결 풀): c3p0 및 dbcp 데이터 소스에서 데이터 소스 연결 초기화 크기, 최대 연결 수, 대기 시간, 최소 연결 수 등을 설정할 수 있는 것처럼 Druid 데이터 소스도 동일한 방식으로 설정할 수 있습니다. .
  • Druid 웹 모니터링 필터 구성(WebStatFilter): 이 필터의 기능은 발행된 SQL 문, SQL 실행 시간, 요청 수, 요청된 URL 주소 및 Seesion 모니터링, 데이터베이스 테이블 등 웹 애플리케이션 요청에 있는 모든 데이터베이스 정보를 계산하는 것입니다. 방문 등
  • Druid 백그라운드 관리 Servlet(StatViewServlet) 구성: Druid 데이터 소스에는 모니터링 기능이 있으며 사용자가 볼 수 있는 웹 인터페이스를 제공합니다. 라우터 설치와 마찬가지로 기본 웹 페이지도 제공하므로 Druid 배경을 설정해야 합니다. 관리 페이지 로그인 계정, 비밀번호 등과 같은 속성

[참고] : 설정 속성명은 Druid를 완전히 따르며, Spring Boot 설정 파일을 통해 Druid 데이터베이스 커넥션 풀 및 모니터링 설정이 가능하며, 설정이 없을 경우 기본값을 사용하며, 관련 속성은 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.

오픈 소스 및 무료 Spring Boot 실습 프로젝트를 추천합니다.

https://github.com/javastacks/spring-boot-best-practice

2.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
  • Log4j필터
  • Log4j2필터
  • CommonsLogFilter

내장된 필터를 사용하지 않으려면 해당 필터의 활성화를 true로 설정하여 사용자 정의 필터 구성을 적용해야 합니다. Druid Spring Boot StarterStatFilter는 기본적으로 비활성화되어 있으며 활성화하려면 true로 설정하면 활성화됩니다. .

3 모니터링 페이지

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

데이터 소스 페이지는 현재 DataSource 구성의 기본 정보로 위에서 구성한 Filter를 확인할 수 있으며, Filter가 구성되지 않은 경우(일부 정보는 카운트되지 않습니다. 예를 들어 SQL 모니터링에서는 JDBC 관련 정보를 얻을 수 없습니다.) SQL 실행정보)

SQL 모니터링 페이지

모든 SQL 문 실행에 대한 통계

URL 모니터링 페이지

모든 컨트롤러 인터페이스의 액세스 및 실행 통계

스프링 모니터링 페이지

aop를 사용하여 지정된 인터페이스의 실행 시간과 jdbc 번호를 기록합니다.

SQL 방화벽 페이지

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

세션 모니터링 페이지

현재 세션 상태와 생성 시간, 마지막 활성 시간, 요청 수, 요청 시간 등의 세부 매개변수를 확인할 수 있습니다.

JSON API 페이지

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

4. 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

5. 느린 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이 발생하면 로그에 출력됩니다.

6. 스프링 모니터링

액세스 후 스프링 모니터링에는 기본적으로 데이터가 없지만 다음과 같이 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.*"

7. 광고(Ad) 제거

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

이유: 가져온 druid jar 패키지의 common.js(페이지 바닥글에 광고를 추가하는 js 코드가 포함되어 있음)

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

1. 이 코드를 직접 수동으로 주석 처리합니다.

Maven을 사용하는 경우 로컬 창고로 직접 이동하여 jar 패키지를 찾고 다음 코드에 주석을 추가합니다.

// this.buildFooter();

common.js의 위치:

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

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;
    }
}

두 가지 방법 모두 가능하며, 근본 원인부터 문제를 해결하려면 첫 번째 방법을 사용하는 것이 좋습니다.

8. 드루이드 모니터링 데이터 획득

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

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

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

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

최근 핫한 기사 추천:

1. 1,000개 이상의 Java 면접 질문과 답변(2022년 최신 버전)

2. 훌륭해요! Java 코루틴이 출시됩니다. . .

3. Spring Boot 2.x 튜토리얼은 너무 포괄적입니다!

4. 화면을 폭발과 폭발로 가득 채우지 말고 데코레이터 모드를 사용해 보세요. 이것이 우아한 방법입니다! !

5. "Java 개발 매뉴얼(송산판)" 최신 릴리스를 빠르게 다운로드하세요!

기분 좋으시구요, 좋아요+전달 잊지 마세요!

추천

출처blog.csdn.net/youanyyou/article/details/132474307