2015-11-04 79 views
8

我可以通過工作臺成功連接到我的openshift mysql,如何通過我的彈簧啓動應用程序來做同樣的事情?Spring Boot SSH Mysql?

在我application.properties:

# Connection url for the database 
spring.datasource.url = jdbc:mysql://<SSH_username>:<SSH_password>@<mysql_hostname>:<mysql_port>/<mysql_schema> 

# Username and password 
spring.datasource.username = <mysql_username> 
spring.datasource.password = <mysql_password> 
我在哪裏我的供應私鑰

回答

6

爲了通過SSH(例如使用MySql-Openshift)從本地應用程序訪問您的Mysql服務器,您需要做的「唯一」額外的事情是建立一個先前的SSH連接,在您的DataSource對象試圖獲得連接。

像往常一樣,幸運的是,有幾種方法可以做到這一點,但我會盡力解釋爲我工作的最簡單的方法。

1)添加Jcraft庫到classpath(使用SSH連接到工作)

如果你使用Maven添加到您的pom.xml以下幾個要素:

<dependency> 
     <groupId>com.jcraft</groupId> 
     <artifactId>jsch</artifactId> 
     <version>0.1.53</version> 
    </dependency> 

或只是下載從http://www.jcraft.com/jsch/

2)創建一個類來連接到SSH服務器(在這裏,我們使用在上一步中導入庫)

例如:

import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class SSHConnection { 

private final static String S_PATH_FILE_PRIVATE_KEY = "C:\\Users\\Val\\.ssh\\privatekeyputy.ppk"; \\windows absolut path of our ssh private key locally saved 
private final static String S_PATH_FILE_KNOWN_HOSTS = "C:\\Users\\Val\\.ssh\\known_hosts"; 
private final static String S_PASS_PHRASE = "mypassphrase"; 
private final static int LOCAl_PORT = 3307; 
private final static int REMOTE_PORT = 3306; 
private final static int SSH_REMOTE_PORT = 22; 
private final static String SSH_USER = "87a34c7f89f5cf407100093c"; 
private final static String SSH_REMOTE_SERVER = "myapp-mydomain.rhcloud.com"; 
private final static String MYSQL_REMOTE_SERVER = "127.6.159.102"; 

private Session sesion; //represents each ssh session 

public void closeSSH() 
{ 
    sesion.disconnect(); 
} 

public SSHConnection() throws Throwable 
{ 

    JSch jsch = null; 

     jsch = new JSch(); 
     jsch.setKnownHosts(S_PATH_FILE_KNOWN_HOSTS); 
     jsch.addIdentity(S_PATH_FILE_PRIVATE_KEY, S_PASS_PHRASE.getBytes()); 

     sesion = jsch.getSession(SSH_USER, SSH_REMOTE_SERVER, SSH_REMOTE_PORT); 
     sesion.connect(); //ssh connection established! 

     //by security policy, you must connect through a fowarded port   
     sesion.setPortForwardingL(LOCAl_PORT, MYSQL_REMOTE_SERVER, REMOTE_PORT); 

} 
} 

該類不斷建立SSH連接所有相關信息。請注意,我們只定義了兩個方法:構造函數,用於實例化由該類的唯一非靜態字段表示的ssh連接,以及用於斷開/關閉ssh連接的其他方法。

3)定義一個實現了ServletContextListener接口(保持)在步驟2中所定義的類

通知的目的,我們嘗試在我們的應用程序開始創建一個ssh連接,關閉它時我們的應用程序的監聽死亡。

@WebListener 
public class MyContextListener implements ServletContextListener { 

private SSHConnection conexionssh; 


public MyContextListener() 
{ 
    super(); 
} 

/** 
* @see ServletContextListener#contextInitialized(ServletContextEvent) 
*/ 
public void contextInitialized(ServletContextEvent arg0) 
{ 
    System.out.println("Context initialized ... !"); 
    try 
     { 
      conexionssh = new SSHConnection(); 
     } 
    catch (Throwable e) 
     { 
      e.printStackTrace(); // error connecting SSH server 
     } 
} 

/** 
* @see ServletContextListener#contextDestroyed(ServletContextEvent) 
*/ 
public void contextDestroyed(ServletContextEvent arg0) 
{ 
    System.out.println("Context destroyed ... !"); 
    conexionssh.closeSSH(); // disconnect 
} 

4)使用Spring,在你的dispatcher-servlet中設置DataSource對象。XML像往常一樣,但指向您的fowarded端口

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3307/yourSchema" /> 
    <property name="username" value="admin4ajCbcWM" /> 
    <property name="password" value="dxvfwEfbyaPL-z" /> 
</bean> 

而這一切。另一種可能是創建自己的數據源,擴展Spring提供的數據源,並添加ssh功能。也許這裏詳述的解決方案更好地隔離。