初识远程开发,使用Jetbrains IDE进行远程开发解决笔记本内存不够的问题

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

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

1.3k 声望
49 粉丝
0 条评论
推荐阅读
IDEA 创建基于SpringCloud多模块项目
最近开始学习SpringCloud 2020.0.2新的版本,准备使用全新的架构,如图所示所以记录下使用idea创建多模块项目,一步一步记录搭建的过程

Awbeci3阅读 3.6k

JVS低代码基础介绍
JVS是面向软件开发团队可以快速实现应用的基础开发脚手架,主要定位于企业信息化通用底座,采用微服务分布式框架,提供丰富的基础功能,集成众多业务引擎,它灵活性强,界面化配置对开发者友好,底层容器化构建,...

软件部长阅读 1.4k

JVS低代码多账号统一登录介绍
功能需求来源于企业的日常工作过程中,有太多的账号与密码需要记录,因互联网的使用习惯所致,很多客户提出了通过扫码认证登陆的形式,在便捷登陆的同时要保障信息安全的要求,也就是外部的账号 仅仅用于扫码登陆...

软件部长阅读 1.4k

【JVS低代码】一分钟学会如何快速创建应用
应用中心功能介绍在JVS角色中有“应用管理员”的角色,如果赋予该角色,则用户为应用管理员,应用管理员有进入应用配置中心的权限。创建空白应用:从模板创建应用:应用中心入口具备应用管理员权限的用户,进入系统...

软件部长阅读 1.3k

JVS低代码首页功能介绍
应用快捷导航是将登录用户有权限使用的应用展示出来,鼠标点击后,系统展示可见的应用于对应的操作应用展示包括,应用的名称以及介绍,应用的目录以及子页面等,点击对应目录或者页面可以直接进入对应的 系统页面...

软件部长阅读 1.3k

无忧·企业文档,为企业客户的场景而思考
作为无忧企业文档的设计者,常常被问到一个问题,这个和腾X文档有什么区别?其实这个问题我口头回答了很多次,这次,我将这个问题做个记录与分析。主要是有以下几个方面不同:1、客户定位不同2、核心功能不同3、...

软件部长阅读 1.3k

数据智仓功能介绍(四)
对数据类型的转换,主要用户复杂数据的处理的情况下 ,例如某个字段是JSON ,那么通过数据抽取的加工情况下 ,扩展出来的数据是一个字符串,如果其表达的意义是数值,那么就需要用到类型转换。

软件部长阅读 1.2k

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

1.3k 声望
49 粉丝
宣传栏