目前笔记本写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


LYX6666
1.6k 声望73 粉丝

一个正在茁壮成长的零基础小白