初識遠端開發,使用Jetbrains IDE進行遠端開發解決筆記本記憶體不夠的問題

LYX6666發表於2023-01-18

目前筆記本寫Java的基本矛盾是:IDEA日益增長的記憶體容量需要,和落後的筆記本記憶體不可增加之間的矛盾

遠端開發解決了什麼痛點問題?

移動裝置效能有限

當前IDEA和Chrome兩個記憶體大戶,分分鐘把16G吃滿不成問題,直接導致SWAP瘋狂增加。

但辛辛苦苦攢出來大幾千買的筆記本,不可能因為記憶體不夠用就把筆記本整個換掉。

我們的第一反應可能是:搞一臺高效能桌上型電腦就可以了,畢竟桌上型電腦加記憶體的成本太低了。

但是這樣就出現了第二個問題:

兩臺裝置的環境不統一

不僅要分別維護桌上型電腦和筆記本上的開發環境,而且出門前還要記得push程式碼。

此外,出門的過程中還會回到16G記憶體的小水管,使用體驗就會下降。

為了解決統一環境和統一效能的問題,我們可能又會想到用筆記本遠端桌面到桌上型電腦上,此時又出現了下一個問題:

遠端桌面的操作體驗一言難盡

遠端桌面的缺點包括但不限於:

  • 對網路要求高
  • 顯示效果和本地的差距非常大
  • 存在不可避免的延遲

之前也嘗試過很多遠端桌面方案例如RDP、VNC、SPICE等等,而這些協議各有各的缺點

那麼,有沒有一種可能,讓編輯器原生的跑在本地,而把編譯等繁重任務跑在伺服器上,再透過SSH連線呢?
這就是遠端開發了。

遠端開發的實質也是前後端分離

遠端開發整體的結構是:

  1. 只有編輯器(IDEA、Webstorm、Navicat、終端等)跑在本地
  2. 所有服務(Node、JAVA、MySQL、Nginx、Docker等)全部執行在Linux伺服器上
  3. 本地與伺服器僅使用SSH埠連線
  4. 檔案和命令透過SSH傳輸
  5. 透過SSH隧道完成埠對映(TCP 代理),在伺服器只開放SSH埠的情況下,實現類似本地開發的體驗(即瀏覽器訪問localhost自動轉發到伺服器)

整體的結構如下:
image.png

接下來的內容就是使用Jetbrains遠端開發的步驟:

使用Jetbrains進行遠端開發

Linux伺服器開放SSH埠

當前服務端僅支援Linux,圖形化和桌面版均可,實體機或虛擬機器均可。

因為所有的通訊都是用SSH埠進行,並且編輯器的後端是自動安裝的,所有伺服器什麼也不需要準備,只需要開放埠即可

為了安全起見,建議避免使用預設的22埠,並且設定強密碼或者只允許證照登入

修改SSH埠

# 編輯
nano /etc/ssh/sshd_config
# 修改檔案,刪掉port的註釋,把埠改成自己想要的
port 8222
# 重啟服務
service ssh restart

修改密碼

# 修改密碼
passwd

使用IDEA連線伺服器

在主頁面找到SSH,點選新建連線:
image.png

輸入Linux伺服器的使用者名稱、地址、SSH埠,確定:
image.png

輸入密碼:根據實際情況選擇要不要永久儲存密碼
image.png

選擇IDE版本和專案根目錄,包括Jetbrains所有的IDE都可以使用:
image.png

如果伺服器上沒有專案檔案,可以先用終端clone程式碼到伺服器上:
image.png

點選確定後IDEA會返回主頁,並且彈出視窗,提示正在準備IDEA的後端:
image.png

全部完成後,會開啟一個和IDEA一模一樣的編輯器,名叫Jetbrains Client
image.png

遠端部署開發環境

此時如果在IDEA(即Client)中開啟終端,開啟的不是本地的終端,而是遠端伺服器
image.png

這樣就很方便了,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,等待索引完成:
image.png

然後mvn install(或者build),不出意外的話就可以執行了:
image.png

如果出意外的話,可能會在編譯時出現一個​ 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訪問的

此時控制檯能檢測到專案監聽了哪些埠,可以一鍵對映:
image.png

如果要修改已有的埠或增加其他埠(比如新增Nginx埠):
image.png

至此,整個遠端部署就完成了

展示&總結

展示

編輯器右下角可以看到網路傳輸情況:
image.png
只有KB級的傳輸,和遠端連線相比,可以說基本上對網路沒有任何要求了,並且由於編輯器是本地執行,不會產生延遲。

左上角顯示當前遠端伺服器(Linux)的負載:
image.png

透過第三方軟體檢視本地(Mac)的記憶體佔用:
image.png

同時啟用了一個IDEA和Webstorm的遠端連線,每個編輯器大概只佔1-2G的記憶體,比起IDEA動輒7-8G記憶體,可以說非常少了

總結

遠端開發基於“前後端分離”的理念,把使用者感知明顯的IDE仍然執行在本地,而把繁重的編譯任務和吃記憶體的Web服務交給伺服器來執行。

  • 與本地開發相比,遠端開發不再依賴筆記本的配置(尤其是記憶體)
  • 與多裝置方案相比,遠端開發的所有資料都在伺服器上,既安全,又不需要維護多個環境
  • 與遠端桌面相比,遠端開發的網路要求非常低
  • 還有一些附帶的好處,比如可以使用Linux原生的docker,而不用再在Mac上跑docker虛擬機器

Jetbrains的IDE確實強大,可以把遠端開發的部署過程變得如此簡單。雖然目前軟體的圖示上還寫著Beta的標誌,並且使用中也會有小問題(比如上面提到的編譯問題),但這種模式是真的香(某些筆記本的記憶體條快比金條貴了,而桌上型電腦記憶體卻是白菜價,同時16核心以上的至強或銳龍CPU也是便宜大碗,價效比非常高)。

就筆者本身而言,在目前基本滿足需求的情況下,更願意嘗試這種模式,因為真的可以節約成本。

進一步簡化:

學會了基本配置之後,我們可以發現,本地環境實際上是不需要啟動IDEA和Webstorm的,因為實際上啟動的是名叫Jetbrains Client的軟體:
image.png

所以,再開啟專案的時候,就不需要使用IDEA來連線伺服器了,我們只需要下載一個Jetbrains Gateway(翻譯為閘道器),就可以統一管理所有使用Jetbrains IDE的專案了。

它的介面和IDEA首頁非常像,操作方式也是一樣的:
image.png

相關文章