目前筆記本寫Java的基本矛盾是:IDEA日益增長的記憶體容量需要,和落後的筆記本記憶體不可增加之間的矛盾。
遠端開發解決了什麼痛點問題?
移動裝置效能有限
當前IDEA和Chrome兩個記憶體大戶,分分鐘把16G吃滿不成問題,直接導致SWAP瘋狂增加。
但辛辛苦苦攢出來大幾千買的筆記本,不可能因為記憶體不夠用就把筆記本整個換掉。
我們的第一反應可能是:搞一臺高效能桌上型電腦就可以了,畢竟桌上型電腦加記憶體的成本太低了。
但是這樣就出現了第二個問題:
兩臺裝置的環境不統一
不僅要分別維護桌上型電腦和筆記本上的開發環境,而且出門前還要記得push程式碼。
此外,出門的過程中還會回到16G記憶體的小水管,使用體驗就會下降。
為了解決統一環境和統一效能的問題,我們可能又會想到用筆記本遠端桌面到桌上型電腦上,此時又出現了下一個問題:
遠端桌面的操作體驗一言難盡
遠端桌面的缺點包括但不限於:
- 對網路要求高
- 顯示效果和本地的差距非常大
- 存在不可避免的延遲
之前也嘗試過很多遠端桌面方案例如RDP、VNC、SPICE等等,而這些協議各有各的缺點
那麼,有沒有一種可能,讓編輯器原生的跑在本地,而把編譯等繁重任務跑在伺服器上,再透過SSH連線呢?
這就是遠端開發了。
遠端開發的實質也是前後端分離
遠端開發整體的結構是:
- 只有編輯器(IDEA、Webstorm、Navicat、終端等)跑在本地
- 所有服務(Node、JAVA、MySQL、Nginx、Docker等)全部執行在Linux伺服器上
- 本地與伺服器僅使用SSH埠連線
- 檔案和命令透過SSH傳輸
- 透過SSH隧道完成埠對映(TCP 代理),在伺服器只開放SSH埠的情況下,實現類似本地開發的體驗(即瀏覽器訪問localhost自動轉發到伺服器)
整體的結構如下:
接下來的內容就是使用Jetbrains遠端開發的步驟:
使用Jetbrains進行遠端開發
Linux伺服器開放SSH埠
當前服務端僅支援Linux,圖形化和桌面版均可,實體機或虛擬機器均可。
因為所有的通訊都是用SSH埠進行,並且編輯器的後端是自動安裝的,所有伺服器什麼也不需要準備,只需要開放埠即可
為了安全起見,建議避免使用預設的22埠,並且設定強密碼或者只允許證照登入
修改SSH埠
# 編輯
nano /etc/ssh/sshd_config
# 修改檔案,刪掉port的註釋,把埠改成自己想要的
port 8222
# 重啟服務
service ssh restart
修改密碼
# 修改密碼
passwd
使用IDEA連線伺服器
在主頁面找到SSH,點選新建連線:
輸入Linux伺服器的使用者名稱、地址、SSH埠,確定:
輸入密碼:根據實際情況選擇要不要永久儲存密碼
選擇IDE版本和專案根目錄,包括Jetbrains所有的IDE都可以使用:
如果伺服器上沒有專案檔案,可以先用終端clone程式碼到伺服器上:
點選確定後IDEA會返回主頁,並且彈出視窗,提示正在準備IDEA的後端:
全部完成後,會開啟一個和IDEA一模一樣的編輯器,名叫Jetbrains Client
:
遠端部署開發環境
此時如果在IDEA(即Client)中開啟終端,開啟的不是本地的終端,而是遠端伺服器
這樣就很方便了,IDEA接管了SSH連線管理器的功能,就不需要每次連線都輸入密碼了,並且可以同時開啟很多終端視窗,就和本地開發幾乎一致了
Linux是完全可以擺脫圖形介面的,只使用終端就可以把常用的環境都裝好。
以debian系的部分服務為例:
// jdk
sudo apt install openjdk-8-jdk
// maven
sudo apt-get install maven
// docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
// node
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
裝好各種環境並且初始化資料庫後,簡單設定一下JDK,等待索引完成:
然後mvn install(或者build),不出意外的話就可以執行了:
如果出意外的話,可能會在編譯時出現一個 Failed to exec spawn helper
的報錯:
java: Cannot run program "/home/<redacted>/.jdks/corretto-1.8.0_352/bin/java" (in directory "/local/home/<redacted>/.cache/JetBrains/RemoteDev-IU/<redacted>/compile-server"): error=0, Failed to exec spawn helper: pid: 31592, exit value: 1
來源:https://youtrack.jetbrains.co...
解決方法就是,可以去https://www.jetbrains.com/zh-...下載2022.2以前的版本IDEA,安裝到遠端伺服器之後,用舊版本開啟就可以正常編譯了
還差最後一步,就是設定埠對映:
埠對映
這個時候就算專案起來了也是不能透過localhost訪問的
此時控制檯能檢測到專案監聽了哪些埠,可以一鍵對映:
如果要修改已有的埠或增加其他埠(比如新增Nginx埠):
至此,整個遠端部署就完成了
展示&總結
展示
編輯器右下角可以看到網路傳輸情況:
只有KB級的傳輸,和遠端連線相比,可以說基本上對網路沒有任何要求了,並且由於編輯器是本地執行,不會產生延遲。
左上角顯示當前遠端伺服器(Linux)的負載:
透過第三方軟體檢視本地(Mac)的記憶體佔用:
同時啟用了一個IDEA和Webstorm的遠端連線,每個編輯器大概只佔1-2G的記憶體,比起IDEA動輒7-8G記憶體,可以說非常少了
總結
遠端開發基於“前後端分離”的理念,把使用者感知明顯的IDE仍然執行在本地,而把繁重的編譯任務和吃記憶體的Web服務交給伺服器來執行。
- 與本地開發相比,遠端開發不再依賴筆記本的配置(尤其是記憶體)
- 與多裝置方案相比,遠端開發的所有資料都在伺服器上,既安全,又不需要維護多個環境
- 與遠端桌面相比,遠端開發的網路要求非常低
- 還有一些附帶的好處,比如可以使用Linux原生的docker,而不用再在Mac上跑docker虛擬機器
Jetbrains的IDE確實強大,可以把遠端開發的部署過程變得如此簡單。雖然目前軟體的圖示上還寫著Beta的標誌,並且使用中也會有小問題(比如上面提到的編譯問題),但這種模式是真的香(某些筆記本的記憶體條快比金條貴了,而桌上型電腦記憶體卻是白菜價,同時16核心以上的至強或銳龍CPU也是便宜大碗,價效比非常高)。
就筆者本身而言,在目前基本滿足需求的情況下,更願意嘗試這種模式,因為真的可以節約成本。
進一步簡化:
學會了基本配置之後,我們可以發現,本地環境實際上是不需要啟動IDEA和Webstorm的,因為實際上啟動的是名叫Jetbrains Client的軟體:
所以,再開啟專案的時候,就不需要使用IDEA來連線伺服器了,我們只需要下載一個Jetbrains Gateway(翻譯為閘道器),就可以統一管理所有使用Jetbrains IDE的專案了。
它的介面和IDEA首頁非常像,操作方式也是一樣的: