您鬆了一口氣,因為 QA 已批准在 Prod 上部署一項期待已久的功能。然而,作為該流程的一部分,它首先部署在 UAT 環境上,其中有測試帳戶可用於驗證該功能在本地開發人員和 QA 測試系統之外的工作情況。
但是...執行測試套件會導致很多失敗!
回覆總是相關的「但它可以在我的機器上運行!」
你是做什麼的?您確信程式碼可以工作。絕對確定。也許是 UAT 環境的問題?但環境可能會出現什麼問題呢?也許新建立的測試帳戶配置不正確?也許是的,你想。您可以存取環境的日誌,但失敗的場景僅限於沒有日誌來識別問題。你內心咒罵你祖先的開發者。
另一個選擇?遠端調試!雖然這是一個好主意,但對於經常使用應用程式的環境來說,它很少實用。如果您的程式碼位於「熱路徑」中,那麼祝您好運,弄清楚您的請求是什麼。它還可能會顯著減慢應用程式的速度。
本質上,你想要的是調試應用程序,就像它部署在你的本地機器上一樣,但是UAT伺服器的資料庫。但由於本地應用程式無法直接訪問 UAT 伺服器,所以你運氣不好。
或者你是嗎?不用擔心,因為 SSH 隧道可以幫助您。
什麼是 SSH 隧道?以及如何使用它?
簡短回答:
SSH 隧道將允許您的應用程式表現得就像部署在遠端系統上一樣,透過該系統可以存取 UAT 資料庫。
長答:
Linux ssh 指令提供了「連接埠轉送」功能。誠然,「連接埠轉送」這個詞相當不具描述性。因此,我將讓 StackOverflow 為您提供比我在這裡提供的更詳細、更簡單的 SSH 隧道解釋。您可以在這裡閱讀:https://unix.stackexchange.com/a/115906。我建議您閱讀答案,因為它的圖表比基於文字的答案更容易理解。
不過,我還是將相關部分複製到這裡。
ssh -L 123:farawayhost:456 remotehost登入後複製local: -L 指定本機(客戶端)主機上的給定連接埠將轉送到遠端的給定主機和連接埠。
ssh -L sourcePort:forwardToHost:onPort connectToHost 意思是:使用ssh 連接到connectToHost,並將所有連接嘗試轉送到local sourcePort 到名為forwardToHost 的機器上的on 端口,可以是從connectToHost 機器到達。
對於我們的用例,我們的範例命令將是:
ssh -L <Local Port>:<UAT Database IP>:<UAT Database Port> <JumpHost IP>
注意,這裡的JumpHost是一個可以連接到
一旦我們弄清楚了這一點,其他一切都是小菜一碟!
您只需執行指令,就可以存取本機上的 UAT 資料庫:<本機連接埠>。感覺就像魔法一樣!
如果需要連接多個資料庫,則需要多次執行此命令。或者您可以編寫一個 bash 腳本,該腳本可以動態讀取設定檔以開啟多個 SSH 隧道。
身為 Java 程式設計師,我寧願處理靜態編譯的 Java 程式碼,也不願擔心像 bash 這樣的動態型別語言。因此,我利用 jsch 庫創建了一個可擴展項目,該項目創建並維護多個 SSH 隧道。您可以在這裡查看:https://github.com/darshitpp/java-ssh-tunnel
java-ssh-tunnel └── src └── main ├── java │ └── dev │ └── darshit │ └── java_ssh_tunnel │ ├── Main.java │ ├── MultiTunneler.java │ ├── Tunneler.java │ └── ssh │ ├── TunnelDetails.java │ └── UserDetails.java └── resources
如果一切順利,您將在標準輸出上看到以下輸出
Starting tunneling... <remoteHost>:<remotePort> is available on localhost:<localPort> Press Enter to terminate the tunnels...
雖然上述非常方便,請勿使用它連接到 PROD。是的,必須用粗體寫出來並強調。我也應該將訊息列印到 stderr 嗎?請在下面評論。
以上是使用 Java 進行 SSH 隧道的詳細內容。更多資訊請關注PHP中文網其他相關文章!