如何使用Java通过SSH连接Amazon Neptune数据库
Java通过SSH隧道连接NeptuneDB的实现方案
方案1:直接使用已搭建完成的本地SSH隧道
该方案无需修改核心业务逻辑,直接复用你已经建好的SSH端口映射即可:
- 假设你的本地SSH隧道规则为:
本地127.0.0.1:映射端口转发到远端Neptune实例的Neptune端点:8182(Neptune默认端口为8182,开启IAM认证时也可使用443端口) - Java代码里直接将Neptune连接地址指向本地映射端口,和直连Neptune的代码逻辑完全一致
Gremlin Java Driver连接示例:
import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.Client; public class NeptuneConnectDemo { public static void main(String[] args) { Cluster cluster = Cluster.build() // 指向本地SSH隧道入口 .addContactPoint("localhost") // 替换为你本地实际映射的端口 .port(8182) .enableSsl(true) // 若Neptune开启IAM认证,在此处添加SigV4签名配置即可,和常规连接逻辑一致 .create(); Client client = cluster.connect(); // 执行查询逻辑 client.submit("g.V().limit(10)").forEach(result -> System.out.println(result)); // 释放资源 client.close(); cluster.close(); } }
注意:如果开启了SSL证书校验,需要将Neptune的CA证书导入本地JDK信任库,或配置SSL上下文跳过主机名校验(生产环境不推荐)
方案2:Java代码内置SSH端口转发(无需提前手动搭建隧道)
如果不想单独维护SSH隧道进程,可以在Java代码中引入SSH工具库实现动态端口转发,程序启动时自动建立隧道、关闭时自动销毁:
依赖引入(Maven为例,使用JSch实现SSH功能)
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> <dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-driver</artifactId> <version>3.6.2</version> </dependency>
完整示例代码
import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.Client; public class NeptuneEmbeddedSshDemo { public static void main(String[] args) throws Exception { // SSH跳板机配置 String sshHost = "你的SSH跳板机地址"; int sshPort = 22; String sshUser = "SSH登录用户名"; String sshPassword = "SSH登录密码"; // Neptune实例配置 String neptuneHost = "你的Neptune实例端点"; int neptunePort = 8182; // 本地转发端口自定义 int localForwardPort = 8182; // 建立SSH会话 JSch jsch = new JSch(); // 若使用私钥认证,替换密码配置为该行:jsch.addIdentity("你的私钥文件本地路径"); Session session = jsch.getSession(sshUser, sshHost, sshPort); session.setPassword(sshPassword); // 跳过主机密钥校验,生产环境建议配置已知主机列表替换该配置规避安全风险 session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 配置端口转发规则 session.setPortForwardingL(localForwardPort, neptuneHost, neptunePort); // 连接Neptune逻辑和方案1完全一致 Cluster cluster = Cluster.build() .addContactPoint("localhost") .port(localForwardPort) .enableSsl(true) .create(); Client client = cluster.connect(); // 执行业务查询 client.submit("g.V().limit(5)").forEach(res -> System.out.println(res)); // 按顺序释放资源 client.close(); cluster.close(); session.disconnect(); } }
内容的提问来源于stack exchange,提问作者Tien Vu
相关产品推荐
相关产品推荐

