场景: 现有数据库服务器 C , 本地机器无法直连,需通过跳板机(堡垒机) B 才能连接服务器 C. 现在想要在本地开发程序,需要能在本地机器 A 连接数据库服务器 C 进行数据库相关操作.
解决方案: 使用 ssh 从本地机器登录跳板机 B, 建立 ssh tunnel , 将 B 作为代理服务器,传达本地机器操作数据库的指令,从服务器 C 接收到返回值后,然后转回本地机器 A.
在下面的代码示例中, A 即是 127.0.0.1 , B 是 192.168.100.11 , C 是 192.168.100.10
依赖 jar 包:
![b99c689f597d2935ac67fb3d614282aa.png](https://i-blog.csdnimg.cn/blog_migrate/f478f0f40d526062672ccccee12b4ef0.jpeg)
配置文件:
![b57f9abbf2446af141904190fdd2e100.png](https://i-blog.csdnimg.cn/blog_migrate/449c4d00df2ecc96fdba2933acd0b85f.jpeg)
db.properties :
# 远程数据库服务 ip 地址
gp.server.ip=192.168.100.10
# 数据库服务端口号
gp.server.port=5432
# 要连接的数据库名称
gp.database=test
# 连接数据库使用的用户
gp.user=postgres
# 数据库用户密码
gp.password=postgres
# 要连接的 schema 名称
gp.schema=public
# 映射到本地机器的端口号
local.port=6666
ssh.properties :
# linux 堡垒机地址
base.server.ip=192.168.100.11
# 堡垒机 ssh 开放端口
base.server.port=22
# 堡垒机登录用户
base.server.user=admin
# 堡垒机登录用户密码
base.server.password=admin123
项目架构:
![d3d7854699888c91a5d7507f730136f2.png](https://i-blog.csdnimg.cn/blog_migrate/5898fe0e59e3b297ebaab0895aa70ae8.jpeg)
建立连接相关代码:
public
DbUtil :
private static Logger LOG = Logger.getLogger(DbUtil.class);
private static SshService ss = SshService.getInstance();
private static String pgDriver = "org.postgresql.Driver";
private static Connection pgConn = null;
private static void connect(){
if (pgConn == null) {
try {
Class.forName(pgDriver);
int port = ss.portMapping(DbConf.getLocalPort());
pgUrl = "jdbc:postgresql://127.0.0.1:" + port + "/" + DbConf.getGpDatabase();
pgConn = DriverManager.getConnection(pgUrl, DbConf.getGpUser(), DbConf.getGpPassword());
} catch (ClassNotFoundException e) {
LOG.error("获取 greenplum 连接失败!", e);
ss.closeSession();
} catch (SQLException e) {
LOG.error("获取 greenplum 连接失败!", e);
ss.closeSession();
}
}
}
public static Connection getPgConn() {
if (pgConn == null) {
connectPgSql();
}
return pgConn;
}
public static void closePgConn() {
if (pgConn != null) {
try {
pgConn.close();
pgConn = null;
} catch (SQLException e) {
LOG.error("关闭 greenplum 连接失败!", e);
}
}
}
代码与可直连服务代码区别:
- 连接 url 中的 ip 地址为映射之后绑定的 ip地址(本地机器,直接写 127.0.0.1),端口号为映射的端口
- 在进行连接之前需要先使用 ssh 建立与代理服务器的连接,并进行端口映射操作