Java开发工具Java框架

SpringBoot整合druid多数据源监控

2019-05-30  本文已影响0人  虫儿飞ZLEI

1. maven引入配置

        <!--druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.16</version>
        </dependency>

2. 配置数据源,SpringBoot 的配置文件

这里使用的是MySql+kylin两种数据源

spring:
  datasource-kylin:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.apache.kylin.jdbc.Driver
    url: jdbc:kylin://ip:7013/Pro01
    username: ADMIN
    password: ob98hyK9g/uvM/rIhpMT+WBLT7kdfOHfZC7slJcXPHcTxSTE//19/mbeJCsboK1Nn3Eub/xzdv+J8JHbWA+8SQ==
    validationQuery: select 'x'
    filters: default
    publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKK4LArN8Vx3wUuYS5tw6+YPmj/acdi9djlrTBE+1Nc32siEAr6BPb+PxkpGoI82MhyJeQK26yIh5B5MdIXNKcMCAwEAAQ==
    connectionProperties: timeZone=GMT +08;druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource-kylin.publicKey}
  datasource-mysql:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.202.162:3306/jcpt?useUnicode=true&characterEncoding=utf8
    username: root
    password: Fg8rH4UnByjNQ4d+kz+L3PSfBV4GoDlrINWIc9w6chBqwhdQnfJjvL83f1FwqhcwC8JI6/op46lp1BzWpoYcXQ==
    initialSize: 20
    minIdle: 3
    maxActive: 200
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 30000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打开PSCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: config,stat,wall,slf4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALsHTtzfPi8BdWb2ZYol4gxdsAoeeMlGHIT7lttLijCdeBCFgjr/yS6clTCFOsb5syw+qcOLDD7EFHpDhzlOiPkCAwEAAQ==
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource-mysql.publicKey}
    # 合并多个DruidDataSource的监控数据
    useGlobalDataSourceStat: true

3. 配置对应数据源的bean

Mysql:

@Configuration
@MapperScan(basePackages = {"com.base.web.aisino.dao","com.base.web.common.dao","com.base.web.system.dao","com.base.web.test.dao"} , sqlSessionFactoryRef = "mysqlSessionFactory")
public class MysqlConfig {

    /**
     *  精确到 master 目录,以便跟其他数据源隔离
     */
    private static final String MAPPER_LOCATION = "classpath:mybatis/*/*.xml";

    @Value("${other.loginPassword}")
    private String loginPassword;

    @Autowired
    @Qualifier("mysqlDataSource")
    private DataSource mysqlDataSource;

    @Bean(name = "mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager mysqlTransactionManager() {
        return new DataSourceTransactionManager(mysqlDataSource);
    }

    @Bean(name = "mysqlSessionFactory")
    @Primary
    public SqlSessionFactory mysqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
            throws Exception {

        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(mysqlDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MysqlConfig.MAPPER_LOCATION));
        //添加驼峰命名法 映射
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}

Kylin:

@Configuration
@MapperScan(basePackages = {"com.base.web.kylin.*.dao","com.base.web.openapi.*.dao"},sqlSessionFactoryRef = "kylinSessionFactory")
public class KylinConfig {
    private static final String MAPPER_LOCATION = "classpath:kylinmybatis/*/*.xml";

    @Autowired
    @Qualifier("kylinDataSource")
    private DataSource kylinDataSource;

    @Bean(name = "kylinTransactionManager")
    public DataSourceTransactionManager kylinTransactionManager() {
        return new DataSourceTransactionManager(kylinDataSource);
    }

    @Bean(name = "kylinSessionFactory")
    public SqlSessionFactory kylinSessionFactory(@Qualifier("kylinDataSource") DataSource kylinDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(kylinDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(KylinConfig.MAPPER_LOCATION));
        //添加驼峰命名法 映射
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}

4. 配置druid页面相关信息

    @Bean
    @Primary
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean reg = new ServletRegistrationBean();
        reg.setServlet(new StatViewServlet());
        reg.addUrlMappings("/druid/*");
        //白名单
        Map<String,String> initParameters = new HashMap<>(16);
        //禁用HTML页面上的“REST ALL”功能
        initParameters.put("resetEnable","false");
        //IP白名单(没有配置或者为空,则允许所有访问)
        initParameters.put("/druid/*","");
        //监控页面登录用户名
        initParameters.put("loginUsername","admin");
        //监控页面登录用户密码
        initParameters.put("loginPassword", loginPassword);
        //ip黑名单
        initParameters.put("deny","");
        reg.setInitParameters(initParameters);
        return reg;
    }


    @Bean
    @Primary
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.addInitParameter("profileEnable", "true");
        filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");
        filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION");
        filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*");
        return filterRegistrationBean;
    }

5. 访问页面查看

ip:port/druid


ps:若使用druid监控页面,必须在springboot配置文件中配置filters的stat

ps2:使用druid监控页面监控kylin时,使用密文密码可能会导致无法监控sql的情况,可以使用明文密码验证

上一篇 下一篇

猜你喜欢

热点阅读