Springboot使用hikari连接池进行Kerberos认证访问Impala

springboot-kerberos-hikari-impala

Springboot使用hikari连接池并进行Kerberos认证访问Impala的演示项目

Springboot使用hikari连接池并进行Kerberos认证访问Impala的demo地址:https://github.com/Raray-chuan/springboot-kerberos-hikari-impala

修改后的Hikari源码地址:https://github.com/Raray-chuan/HikariCP-4.0.3

springboot版本:2.7.5
HikariCP版本:4.0.3
impala驱动版本:2.6.3
CDH集群的Hadoop版本:3.0.0-cdh6.3.2

1. Hikari源码改造,以支持Kerberos认证

如果想了解为什么要修改Hikari来支持Kerberos认证,以及如何修改Hikari源码,请到下面地址查看:https://github.com/Raray-chuan/HikariCP-4.0.3 , 此项目中有详细的readme解答

如果不想手动修改源码以及编译,而且HikariCP版本为4.0.3,在项目的resources目录中有编译好的HikariCP-4.0.3.jar可供使用

2. 准备测试的hive数据

1.在hive中创建表与导入数据:

create database test_xichuan_db;

CREATE TABLE test_xichuan_db.test_xichuan_table (
  start_time String,
  id STRING
)
row format delimited fields terminated by ','
stored as textfile;


测试数据:sample.txt
20211107,id1
20211207,id2
20211210,id3
20211214,id4
20211220,id5
20211222,id6
20211228,id7
20211101,id7
20211227,id4
20211228,id3
20211229,id2
20211230,id1


LOAD DATA LOCAL INPATH '/home/xichuan/sample.txt'
OVERWRITE INTO TABLE test_xichuan_db.test_xichuan_table;

Springboot使用hikari连接池进行Kerberos认证访问Impala_第1张图片

2.在impala中查询数据

select * from test_xichuan_db.test_xichuan_table;

Springboot使用hikari连接池进行Kerberos认证访问Impala_第2张图片

3.项目说明

此项目是一个很简单的springboot的demo项目,项目结构以及每个注解就不详细说了,而且项目中是通过principal+keytab的方式进行认证的,Kerberos如何使用,请参考:https://raray-chuan.github.io/xichuan_note/#/docs/big-data/kerberos/CDH6.3.2集成Kerberos

此项目很简单,我们在DataSourceConfig中自定义dataSource这个spring bean,这样我们使用mybatis进行impala查询的时候,会自动获取到dataSource这个bean,就可以不用修改代码了。

我们修改了Hikari的源码,在HikariConfig类中添加了Kerberos四个参数,分别是:

authenticationType:安全验证的类型,如果值是"kerberos",则进行Kerberos认证,如果为null,则不进行认证
krb5FilePath:krb5.conf文件的路径
principal:principal的名称
keytabPath:对应principal的keytab的路径

这样我们在创建HikariDataSource的时候,就可以使用HikariDataSource(HikariConfig configuration)这个构造方法创建即可将Kerberos参数传入其中。DataSourceConfig代码如下:

package com.xichuan.dev.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.*;

/**
 * @Author Xichuan
 * @Date 2022/11/1 15:15
 * @Description
 */
@Configuration
public class DataSourceConfig {
    private Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);

    @Value("${authentication.type}")
    private String authenticationType;

    @Value("${authentication.kerberos.krb5FilePath}")
    private String krb5FilePath;

    @Value("${authentication.kerberos.principal}")
    private String principal;

    @Value("${authentication.kerberos.keytabPath}")
    private String keytabPath;

    /**
     * inint datasource
     * @return
     */
    @Bean
    public DataSource dataSource(DataSourceProperties dataSourceProperties) throws SQLException {
        HikariConfig config = new HikariConfig();
        //kerberos config
        config.setAuthenticationType(authenticationType);
        config.setKrb5FilePath(krb5FilePath);
        config.setPrincipal(principal);
        config.setKeytabPath(keytabPath);

        //jdbc and pool config
        config.setJdbcUrl(dataSourceProperties.getUrl());
        config.setDriverClassName(dataSourceProperties.getDriverClassName());
        config.setUsername(dataSourceProperties.getUsername());
        config.setPassword(dataSourceProperties.getPassword());
        config.setPoolName(dataSourceProperties.getPoolName());
        config.setReadOnly(dataSourceProperties.isReadOnly());
        config.setAutoCommit(dataSourceProperties.isAutoCommit());
        config.setMaximumPoolSize(dataSourceProperties.getMaximumPoolSize());
        //maxLifetime 池中连接最长生命周期
        config.setMaxLifetime(dataSourceProperties.getMaxLifetime());
        //等待来自池的连接的最大毫秒数 30000
        config.setIdleTimeout(dataSourceProperties.getIdleTimeout());
        //连接将被测试活动的最大时间量
        config.setValidationTimeout(dataSourceProperties.getValidationTimeout());


        HikariDataSource dataSource = new HikariDataSource(config);
        logger.info("init new dataSource: {}", dataSource);
        return dataSource;
    }
}

4. 修改application-prod.yml中的参数,以符合自己的测试环境

# datasource and pool
# 修改为自己的impala链接地址
datasource.xichuan.url=jdbc:impala://node01:21050/;AuthMech=1;KrbRealm=XICHUAN.COM;KrbHostFQDN=node01;KrbServiceName=impala
datasource.xichuan.driver-class-name=com.cloudera.impala.jdbc41.Driver
datasource.xichuan.username=
datasource.xichuan.password=
datasource.xichuan.pool-name=xichuan-pool
datasource.xichuan.read-only=false
datasource.xichuan.auto-commit=true
datasource.xichuan.maximum-pool-size=3
# 此处是演示值,让connection的最长生存时长为35秒
datasource.xichuan.max-lifetime=35000
datasource.xichuan.idle-timeout=10000
datasource.xichuan.validation-timeout=5000


# kerberos
# 此值为null,则不进行Kerberos认证,如果此值为kerberos,则进行kerberos认证
authentication.type=kerberos
# 修改为服务器中的krb5.conf地址,或者是本地的krb5.conf地址
authentication.kerberos.krb5FilePath=D:\\development\\license_dll\\krb5.conf
# 修改为自己的principle名称
authentication.kerberos.principal=xichuan/[email protected]
# 修改为服务器中的keytab地址,或者是本地的keytab地址
authentication.kerberos.keytabPath=D:\\development\\license_dll\\xichuan.keytab

5. 项目验证演示

1.启动项目

Springboot使用hikari连接池进行Kerberos认证访问Impala_第3张图片

我们可以看出刚启动项目后,Hikari连接池已经进行了Kerberos认证,并创建了三个Connection

2.访问数据

访问接口:http://localhost:18080/lot_operation/all_data

Springboot使用hikari连接池进行Kerberos认证访问Impala_第4张图片

我们可以看出访问访问数据一切正常

3.验证HikariPool中Connection失效后,自动Kerberos验证并创建新的Connection

我们设置的datasource.xichuan.max-lifetime=35000,所以每过35秒HikariPool中的Connection就会失效,并重新生成新的Connection,我们查看日志:

Springboot使用hikari连接池进行Kerberos认证访问Impala_第5张图片

通过日志可以看出,HikariPool中的Connection每过35秒就会失效,但HikariPool会通过Kerberos认证,并创建新的Connection添加到HikariPool中。

你可能感兴趣的:(spring,boot,后端,java)