通过 SSH 并使用 Spring Boot 连接到 MySQL

Aks*_*kur 6 java mysql ssh spring spring-boot

在我的Spring Boot应用程序 WAR 中,我有一个application.properties文件,其中定义了以下datasource属性:

spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true&useSSL=false&rewriteBatchedStatements=true
spring.datasource.username=used
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Run Code Online (Sandbox Code Playgroud)

这样,我就可以连接到数据库了。

现在,我想通过连接到另一个数据库SSH tunnel。我应该如何指定spring.datasource.url以获得这样的连接?

请注意,我不想编写任何样板 Java 代码来执行此 SSH 隧道!

PS 我用谷歌搜索但找不到满意的答案。

小智 12

如果您正在寻找的话,我认为 spring 无法为您创建 SSH 隧道。如果你想在代码中完成,你需要像jsch这样的框架。

最好的解决方案是在服务器上手动或使用 autossh 创建 SSH 隧道(以保持其正常运行)。要手动创建隧道,请登录到您的应用程序服务器并在屏幕中运行以下命令:

ssh -L 3307:localhost:3306 serverIp
Run Code Online (Sandbox Code Playgroud)

3306是mysql运行的端口。3307 是您要转发的端口。有了这个隧道,您现在可以使用以下方式进行连接:

spring.datasource.url=jdbc:mysql://localhost:3307/
Run Code Online (Sandbox Code Playgroud)


bam*_*sza 5

和我有同样的问题。

我的解决方案解决了,

第 1 步:在 VPC公有子网内创建ec2 实例

步骤 2:安全组中,此 ec2 实例必须允许端口 22 (SSH)

步骤3: RDS MySQL必须允许ec2实例访问的私有IP

第 4 步:在 Dev Local ~> 设置转发侦听器 tcp_ip打开终端

ssh -f <user>@<ec2-public-dns> -L <localhost_ip>:<localhost_port>:<rds_mysql_host_ip>:<rds_mysql_host_port> -N -i <private_key>.pem
Run Code Online (Sandbox Code Playgroud)

例子:

ssh -f ec2-user@ec2-public-dns -L dev-mysql-c-lib.internal:3306:***.ap-southeast-1.rds.amazonaws.com:3306 -N -i ~/.ssh/ec2-instance.pem
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第5步:在文件配置application-dev.yml中

将主机从公共 dns更改为内部 dns

例子:

主机: '***.ap-southeast-1.rds.amazonaws.com'

主机: 'dev-mysql-c-lib.internal'

spring.datasource.url: jdbc:mysql://dev-mysql-c-lib.internal:3306/mydb

终于运行 Spring Boot

查找MySQL已连接

为我工作。^____^


小智 -3

与您在问题中使用的相同,但如果您的数据库使用自签名证书,则 useSSL=true 和可能 verifyServerCertificate=false 除外。