目前笔记本写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首页非常像,操作方式也是一样的:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。