SpringBoot + Druid は MySQL を監視し、遅い SQL をすぐに見つけることができ、非常に使いやすいです。

誰もが接続プールを使用したことがありますが、たとえばC3P0,DBCP,hikari, Druid、HikariCP の方が若干高速ですが、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:  Druid は、統計監視情報用の組み込み機能を提供しますStatFilter

  • Wall:  SQL インジェクション攻撃に対する Druid の防御は、WallFilterDruid の SQL パーサー分析によって行われます。Druid は、SQL Parserサブデータベースのサブテーブル、監査などの対応する処理のために JDBC レイヤーで SQL をインターセプトできます。

  • log4j2: これはログ機能であり、トラブルシューティングのために SQL ステートメントを log4j2 に出力できます。

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 Web 監視フィルター (WebStatFilter) を構成する: このフィルターの機能は、発行された SQL ステートメント、SQL 実行時間、リクエスト数、リクエストされた URL アドレス、セッション監視、データベース テーブルなど、Web アプリケーション リクエスト内のすべてのデータベース情報をカウントすることです。訪問など

  • Druid バックグラウンド管理サーブレット (StatViewServlet) の構成:  Druid データ ソースには監視機能があり、ユーザーが表示できる Web インターフェイスが提供されます。ルーターのインストール時と同様に、デフォルトの Web ページも提供されます。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

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.*( ) に従って構成されています。

  • 統計フィルター

  • ウォールフィルター

  • 構成フィルター

  • エンコーディング変換フィルター

  • Slf4jLogFilter

  • Log4jフィルター

  • Log4j2フィルター

  • コモンズログフィルター

組み込みフィルターを使用したくない場合は、カスタム フィルター構成を有効にするために、対応するフィルターの有効を true に設定する必要があります。StatFilter はデフォルトで無効になっており、有効にするにはその有効を true に設定できますDruid Spring Boot Starter

2. モニタリングページ

2.1 プロジェクトを開始した後、http://localhost:8081/druid/login.html以下に示すようにログインページにアクセスし、ユーザー名とパスワードを入力してログインします。

2.2 データ ソース ページは、現在のデータソース構成の基本情報です。上で構成されたフィルターはそこにあります。フィルターが構成されていない場合 (一部の情報はカウントされません。たとえば、SQL 監視では JDBC を取得できません)関連する SQL 実行情報)

2.3 SQL 監視ページ。すべての SQL ステートメントの実行をカウントします。

2.4 URL 監視ページ。すべてのコントローラー インターフェイスのアクセスと実行をカウントします。

2.5 Spring モニタリング ページ。aop を使用して、指定されたインターフェイスの実行時間と jdbc 番号を記録します。

2.6 SQL ファイアウォール ページ

Druid はブラック リストとホワイト リストへのアクセスを提供し、SQL の保護状況を明確に確認できます。

2.7 セッション監視ページ

現在のセッションのステータス、作成時間、最終アクティブ時間、リクエスト数、リクエスト時間などの詳細なパラメータを確認できます。

2.8 JSON API ページ

API 形式で Druid の監視インターフェイスにアクセスすると、API インターフェイスは Json 形式でデータを返します。

3. SQL監視

Druid Web モニタリング フィルター ( WebStatFilter) を設定します。これは、発行された SQL ステートメント、SQL 実行時間、リクエスト数、リクエストされた URL アドレス、セッション監視、データベース テーブル アクセス時間など、Web アプリケーション リクエスト内のすべてのデータベース情報をカウントするために使用されます。次のように:

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. スプリングモニタリング

アクセス後、Spring Monitoring にはデフォルトでデータがありませんが、次のように 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. 広告を削除する (広告)

モニタリング ページにアクセスすると、以下に示すように、ページの下部 (フッター) に Alibaba の広告が表示される場合があります。

理由: インポートされた druid jar パッケージ内の common.js (ページのフッターに広告を追加するための js コードが含まれています)

これを削除したい場合は、次の 2 つの方法があります。

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

 

おすすめ

転載: blog.csdn.net/2301_77463738/article/details/131484742