惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
量子位
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
B
Blog RSS Feed
宝玉的分享
宝玉的分享
Security Latest
Security Latest
小众软件
小众软件
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
博客园_首页
美团技术团队
T
Tailwind CSS Blog
The Cloudflare Blog
爱范儿
爱范儿
L
LINUX DO - 热门话题
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Threatpost
V
Vulnerabilities – Threatpost
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
阮一峰的网络日志
阮一峰的网络日志
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Schneier on Security
Schneier on Security
Jina AI
Jina AI
N
News and Events Feed by Topic
C
Cisco Blogs
L
Lohrmann on Cybersecurity
V
V2EX
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cisco Talos Blog
Cisco Talos Blog
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
O
OpenAI News
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research

BMPI

构建自己的信息简报 2.0 我的退休计划:把无期变成有期 从情绪化交易到系统化投资 策引2025 实盘大考:当算法跑赢人性 三十五 我的AI投资助手 我的投资之路 BMPI周记008:设止损而勇试错 BMPI周记007:经济下行 BMPI周记006:时光机 BMPI周记005:直播小完结 BMPI周记004:不要做空 BMPI周记003:十年前的今天 BMPI周记002:交易之难 BMPI周记001:开始直播 对交易的思考 AI驱动开发:从Prompt到Product(直播) 策引全球投资组合:A股1号 策引全球投资组合:A股2号 策引全球投资组合:A股3号 策引全球投资组合:A股全球 策引全球投资组合:加密币1号 策引全球投资组合:加密币2号 策引全球投资组合:美股1号 策引全球投资组合:美股2号 策引全球投资组合:美股3号 策引全球投资组合:美股4号 策引全球投资组合:美股全球 全球投资开户完全指南:A股与美股篇 我的2023 全球经济中的隐形巨人 海外银行证券开户薅羊毛小记 我与ChatGPT结对编程的体验 ChatGPT背后的语言模型简史 ChatGPT应用开发小记 我的AI阅读助手 SQLite的文艺复兴 2022亏了多少 # 组合季报(2022Q4) AI降临 构建自己的信息简报 善用GitHub Real-time Web应用开发新体验 我的巨亏经历 # 组合季报(2022Q3) Google软件工程之工具篇 构建自己的杠杆 我的投资助手 Google软件工程之过程篇 Google软件工程之文化篇 交易之难 # 组合季报(2022Q2) 从技术难题中学习 编程语言是如何实现并发的之并发模型篇 疫情与战争 # 组合季报(2022Q1) 编程语言是如何实现并发的之操作系统篇 编程语言是如何实现泛型的 写在第二十五万字 走进 Web3 财富常识 复盘2021 # 组合季报(2021Q4) 分布式系统中的时间 分布式系统下的认证与授权 如何学习一门技术 K8S 云原生应用开发小记 使用 Beancount 管理家庭财务 三周年小记 # 组合月报(202109) 仓位管理是核心 # 组合月报(202108) 护城河还在但城没了 # 组合月报(202107) 构建高质量的信息输入渠道 最牛指数 # 组合月报(202106) 国际化与本地化 慢慢变富 # 组合月报(202105) 失败驱动开发 加密币挖矿小记 家庭资产配置的阶段 # 组合月报(202104) OKR + GTD + Note => Logseq 我的个人项目技术栈 长期投资之难 # 组合月报(202103) 我的人生管理系统 当别人的股票基金上涨时 # 组合月报(202101) 基于Serverless实现静态博客访问统计功能 构建终身学习体系进行自我提升 我的家庭理财规划 投资的秘密 # 组合月报(202012) 零成本搭建现代博客之优化国内访问速度 我的绘图工具箱 关于银行分期贷款的坑 # 组合月报(202011) 投资交易的心理建设 # 组合月报(202010) 大跌时我们能做什么 # 组合月报(202009) 双均线交易策略 # 组合月报(202008) Serverless应用开发小记 投资理财书籍推荐 # 组合月报(202007) 200万小目标 # 组合月报(202006) 零成本搭建现代博客之加载速度优化篇 零成本搭建现代博客之订阅推送篇 我常用的浏览器插件 零成本搭建现代博客之SEO优化篇 什么是SEO 零成本搭建现代博客之搭建篇 用Markdown可以做什么 什么是互联网广告 使用AWS Lambda提高网站图片加载速度1X倍
云端 IDE
马大伟 · 2021-08-23 · via BMPI
  • 云端 IDE
  • 为什么是 VSCode
    • 良好的设计
    • 跨平台
    • 开源
  • 基于 AWS 与 Pulumi 搭建个人云 IDE
  • 远程访问
  • 关于费用
  • 云 IDE 研发模式
  • 参考文章

更新时间:2021/10/11
最近我将 VSCode Server 从 AWS 迁移到了 Azure 云平台,并且集成了 OAuth2 。具体的实现见 Out-of-the-Box-CodeServer。新的实现方案可以做到:
1、关闭浏览器一定时间后自动关闭服务器以停止计费;
2、使用 GitHub OAuth2 登录;
3、使用自定义域名访问。

前不久 GitHub 官方 Twitter 发了一个如下的 Tweet:

只要你在任何 GitHub Repo 页面上按下.键会自动跳转到github.dev的网站,此网站是一个网页版的 VSCode 并且会自动克隆下这个 Repo 的代码。在这个网页版的 VSCode 里你甚至可以安装一些特定的插件(无法安装需要外部依赖的插件),能更方便的阅读代码。因为这个网站是官方出品,这个 VSCode 已自动绑定了你的 GitHub 账户,开发者可以在里面阅读、编辑及提交代码,整个过程行云流水,甚至全程不需要打开本地的 IDE。此举直接干掉了 github1s 这个具备类似功能的开源项目。

在浏览器写代码还能拥有桌面 IDE 的开发体验,是 IT 行业一直在追求的。VSCode 的团队负责人 Erich Gamma(JUnit 作者之一,《设计模式》作者之一,Eclipse 架构师) 在 2011 年入职微软后的工作内容就是:

Envision new paradigms for online developer tooling that will be as successful as the IDE has been for the desktop.

之后才有了 VSCode 的诞生。可以说 VSCode 从诞生之处就朝着云端 IDE 的方向去设计。

为什么要使用云端 IDE?这源于本地开发环境的一些问题,比如:

  • 环境差异问题:如 Mac 与 Linux 就有一些差异,尤其是在 Mac 上使用基于 Linux 内核的流行技术如 Docker,会让整个体验变差。
  • 性能问题:本地的开发机器一般需要运行很多软件,如一些办公和通讯软件啥的,让本来就不高的性能捉襟见肘。
  • 稳定性问题:本地的开发机器启动时间长了就需要重启,每次重启后需要花费很多时间去设置相关的开发环境,浪费了大量时间。
  • 依赖问题:如果开发环境依赖一些特定的云基础设施,网络通信就会很麻烦。而在云主机上,天然与其他云基础设施在一个网络环境中,环境设置简单。
  • 网络问题:现代软件开发都是站在巨人的肩膀上,很多软件都依赖大量的库、框架和运行时,这些依赖下载需要快的网络速度。一般云主机的网络性能要好于家庭或办公网络。
  • 安全问题:代码或者密钥放在本地开发环境有泄漏的风险,比如开发人员的开发机器被盗后丢失了代码或者密钥。
  • 存储问题:本地开发机器的磁盘存储有限,扩展性也不好。而云主机的磁盘很容易扩容。

而解决这些问题的终极办法就是把开发环境搬到云端,而在云端开发最重要的就是需要一个好的 IDE 支持,这也导致了行业对云端 IDE 强烈的需求。

云端 IDE

在说云端 IDE 前我们先了解下 IDE 的一些主要功能点,如下图所示:

一个优秀的 IDE 当然要让程序员写代码写的爽,看代码看的溜。而要达到这个目的,必不可少的要支持以下功能点:

  • 优秀的文本编辑功能,支持键盘自定义布局;
  • 代码提示功能,如语法高亮,代码跳转,错误提示等;
  • 调试功能;
  • 多编程语言支持;
  • 代码补全功能;
  • 代码重构功能;
  • 扩展能力,支持用户自定义或提供插件;
  • 好的生态。

在桌面级 IDE 里,这些功能都不是事,有很多 IDE 支持这些功能,比如 Visual Studio、Eclipse、IntelliJ IDEA、NetBeans 及 Xcode 等。但以支持在线使用的维度看,这些老牌 IDE 都不行。

早期行业里对云端 IDE 的要求也不高,所以有了大约三个大的类别的云端 IDE,如下图:

  • 在线编辑器。以 CodePen 与 JSFiddle 为主的 Web 在线编辑器,可以方便的对前端页面做在线开发。但这距离桌面 IDE 的体验相差甚远。
  • 类 REPL。以 Repl.it 和 Jupyter 为主的在线 REPL。REPL 最多算桌面 IDE 支持众多功能中的一个点,它的使用场景适合一些编写一些验证类型的代码片段,距离工程化的代码开发体验还有很多路需要走。
  • 功能受限的云 IDE。以 AWS Cloud9 为主的云 IDE,这类云 IDE 已经能给予很好的代码开发体验了,甚至可以无缝使用云基础设施,很适合规模化的代码开发协作。但这类云 IDE 一般不具备扩展能力,比如无法安装一些插件。

在上述功能受限的云 IDE 类别里面有一些基于 VSCode 而实现的云 IDE,比如 Github Codespaces 使用了 VSCode 结合 Azure 云服务器可以给予开发者桌面 IDE 的体验,也可以安装插件。同时在最受欢迎的开发者社区 StackOverflow 的一份 2021 Developer Survey 调查问卷里的 Integrated development environment(IDE) 部分中(共八万多个开发者调查反馈),VSCode 以 71% 的高票(2019 年这个占比已经到了 50%)当选最受欢迎的 IDE:

看起来 VSCode 达到了云 IDE 想要实现的终极目标:与桌面级 IDE 一样的开发体验。这里的问题是为什么是 VSCode 呢?

为什么是 VSCode

良好的设计

VSCode 远程开发模式如下图所示:

通过 CS 架构设计让 VSCode 具备使用远程服务器或容器的能力,本地的 VSCode 只负责 UI 界面与主题的显示,其他的如插件、程序运行、终端进程与调试器都运行在远程服务器上。界面显示与计算分离的设计,这也是实现云 IDE 很重要的一点。

CS 架构设计也体现在代码提示上,通过制定Language Server Protocol标准协议,VSCode 核心无需解析多种编程语言的 AST 或实现多个编程语言 Parser,而将这些功能委托给各语言的插件来实现,保证了核心非常小巧且稳定。

同样的设计也体现在了调试器(Debugger)与Debug Adaptor Protocol标准协议上。

更多的架构设计分析可以看我的这篇 VSCode插件开发小记

跨平台

VSCode 的前身是 monaco-editor 在线编辑器。作为一个 Web 软件,想要实现跨平台功能,就需要使用Electron技术。所以桌面级的 VSCode 和服务器端 Web 版的 VSCode 其实是一个代码库。

正因为其是一个 Web 软件,才有了 code-server 这个第三方 Repo 的出现,也才有了运行在浏览器里的 VSCode。这才导致了众多基于 VSCode 的云 IDE 的出现。

开源

VSCode 如果没有开源,结局可能大不相同。正是有了微软华丽的转身,对开源的热情拥抱,才打开了 VSCode 走向世界的大门,否则结局可能是沦落为微软众多内部项目的一员。

基于 AWS 与 Pulumi 搭建个人云 IDE

由于 VSCode 的开源和 Web 特性,让我们可以快速搭建一个基于 VSCode 的个人云 IDE,功能对标 Github Codespaces,但比其便宜很多。

我的实现见这个 Repo。架构如下:

前置条件:

  1. 需要一个 AWS 账号且安装 AWS CLI,本地配置好 AWS Credentials。 AWS 账号需具备对 EC2 的一些操作权限;
  2. 需要一个 Pulumi 账号,并创建一个工程;(如果你对 Pulumi 不熟悉,可参考我这篇 基于Serverless实现静态博客访问统计功能 文章里的介绍)

使用非常简单(得益于 Pulumi 和 AWS CLI 的强大功能):

git clone https://github.com/bmpi-dev/code.bmpi.dev.git
cd code.bmpi.dev/server
pulumi up # 使用 Pulumi 设置 AWS EC2
./run work # 打开远程 VSCode
./run rest # 关闭远程 VSCode

如果./run open_tunnel因为服务器还在启动时通道无法连接,可在服务器启动后再次执行即可建立通道连接。

首次访问需要输入 VSCode 的登录密码,通过执行sh connect-server.sh登录服务器后执行cat ~/.config/code-server/config.yaml | grep password:获取登陆密码。

通过浏览器访问http://localhost:8888/后即可开始使用远端 VSCode:

如果暂时不需要这个环境了记得通过./run rest休眠这台云服务器,服务器在关闭后 AWS 就不对该 EC2 实例计费了,只对存储卷收取很便宜的费用。

如果你彻底不需要这个环境,想销毁所有资源免得 AWS 继续收费,只需要执行pulumi destroy即可删除所有 AWS 资源。

远程访问

服务器因安全原因一般只会开启特定端口供客户端远程访问。Code Server 只开放了 8888 端口,但这对开发来说很不方便。我们在开发过程中,经常需要不同的端口来测试,比如通过多个端口连接多个 Web Server 或中间件服务等。

一种解决方案是通过临时端口转发来允许远端客户端访问,但这种方法需要不停的修改服务器防火墙配置,不是很方便。

另外一种方案可以通过建立客户端和服务器的 VPN 网络,以使客户端和服务器在同一个虚拟网络之中。我用 tailscale 来实现搭建一个本地电脑和远端服务器间的 VPN 网络。一旦配置好 tailscale 后,Code Server 就变成本地电脑可以直接访问的服务器了。同时安全性也有保障。

关于费用

以AWS EC2 T2.Medium 实例(2 核 4GB 内存 + 50GB 存储)为例。每天开发 5 小时,每月 20 天共100小时,总成本为 $0.0464 * 100 + $0.1 * 50 = $9.64。相同的服务器配置 Github Codespaces 需要 21.5 美元,相差近 2.23 倍。

云 IDE 研发模式

云 IDE 代表了一种研发模式的发展方向。这种研发模式可能的发展趋势有:

  • 标准化的开发环境:一套云 IDE 开发环境可以标准化批量配置,开箱即用,大幅度降低开发者在配置开发环境上的时间消耗。
  • 定制化的开发环境:可以对开发环境做定制,满足不同类型项目的开发环境需求。
  • 弹性的开发环境:开发环境的配置依托于云服务的自动弹性扩容,可动态调整配置,满足开发环境对资源配置的动态需求。
  • 智能的开发环境:依托云服务器对特定代码仓库的机器学习分析,能够更好的做到智能提示,辅助开发,类似于 GitHub Copilot
  • 安全的开发环境:代码和基础设施配置都在云服务器上存储,可以极大的降低因开发人员疏忽而造成的代码或者环境密钥泄露的风险。只要做好云服务器的系统安全配置,就可以降低研发环境的安全风险。
  • 随时可用的开发环境:无需特定开发机器,只需要一个具备浏览器的电脑即可访问云 IDE 开始开发。

一句话总结就是:

Cloud IDE, Coding Anytime Anywhere.

参考文章

  1. 从 VSCode 看大型 IDE 技术架构
  2. Implementing VSCode-based (Code-Server) on Cloud with AWS CDK