
云服务器软件开发,从字面看是把开发流程放在云服务器上进行,但和本地虚拟机里开发不一样,云服务器本身的资源特性、网络特性,都决定了它的开发流程和本地开发有很多不一样的地方。很多人觉得不就是个远程电脑吗?装个开发工具连上去写代码不就完了?实际上真这么做的话,大部分人都会碰到各种预料不到的问题。
适合的几个常见场景
多人协作开发的统一环境是最常见的适用场景。不同开发用的本地系统不一样,有人用Windows有人用Mac,依赖库版本、环境变量配置各不相同,经常出现"我这里跑的好好的,你那边怎么报错"的问题,排查这种环境差异问题,经常要花掉几个小时甚至更久。如果所有人都在同一个云服务器软件开发,环境配置统一,这类问题基本不会出现。如果是团队做小型项目,或者做快速迭代的项目需要频繁出测试版本,这个模式能省掉很多环境配置的时间,整体效率会高不少。
第二个常见场景是本地算力不足的开发任务。比如很多大型代码工程,全量编译一次就要十几甚至几十分钟,普通笔记本跑起来不仅进度慢,还会因为持续高负载发烫,连正常写代码都受影响。这时候把开发放在云服务器上,利用云服务器的多核心大内存完成编译、打包这类重负载工作,本地只需要连接云端进行代码编写和调试,整体体验会好很多。还有一些需要持续跑自动化测试的开发任务,本地电脑不可能24小时开机运行,放在云服务器上就可以随时执行任务,也不会占用本地的硬件资源。
第三个场景是需要对外暴露调试服务的开发过程。开发过程中经常需要给产品、测试或者协作的其他角色看实时调试效果,如果在本地开发,要做端口映射还要处理网络连通性异常的问题,折腾半天不一定能保证稳定访问。如果直接在云服务器软件开发,云服务器本身有可公网访问的IP,调试的时候直接给出访问地址就能用,省了很多处理网络的麻烦。
开发时容易踩的坑
第一个常见的坑就是资源配置不合理。很多新手接触云服务器软件开发,要么图便宜选了最低配置的实例,要么盲目追求高配置造成资源浪费。我见过最典型的例子,是一个开发Java Web项目的学生,选了1核2G的实例,还要装远程开发组件、跑数据库和应用服务,实际用起来内存直接被占满,系统开始用swap分区置换内存,每次项目重新编译都要等十几分钟,根本没法正常开发。反过来也有一些团队,一开始就选了很高的配置,实际上大部分时间资源利用率不到10%,平白增加了很多不必要的投入。这里容易被忽视的一点是,云服务器的资源是弹性可调的,不是选完之后就不能修改,很多人不知道这点,要么硬扛着低配置继续用,要么一直挂着高配置浪费资源。
第二个坑是安全配置不到位。云服务器接入公网之后,从开机启动开始就会持续收到大量的扫描探测,很多做云服务器软件开发的开发者图方便,会保留很多不安全的默认配置,比如直接开放root用户远程登录、使用简单密码、把数据库和开发调试端口直接绑定到公网IP上。我之前碰到过一个开发者,项目开发到一半,突然云服务器变得特别卡,登录上去查看,发现有陌生进程占用了几乎全部的CPU和带宽,就是因为用了弱密码被非授权入侵,所有算力都被占用,根本没法继续开发,最后只能重新初始化环境,还丢了一部分没来得及提交的代码。这个坑看起来很基础,提醒的人也多,但实际开发中因为赶进度忽略配置的人真的不少,出了问题才后悔没有提前做好准备。
第三个坑是本地和云端代码不同步。很多人刚开始做云服务器软件开发,会习惯一边在本地改代码,一边在云端调试修改,经常出现本地改了忘了传到云上,或者云上改了没拉回本地的情况,搞到最后版本混乱,甚至出现已经调好的功能被旧版本覆盖的问题。我自己刚尝试这个模式的时候也踩过这个坑,当时赶项目截止时间,两边改来改去,最后合并代码的时候出了一堆冲突,多花了大半天整理代码,反而比直接在单一环境开发慢了很多。
实际用下来的一些经验
第一点是资源配比要按实际需求调整,不用一步到位。一般来说,普通的业务项目开发,比如常见的Web开发、应用开发,只需要放开发环境、数据库和远程开发组件,2核4G的配置基本就能满足日常开发的需求。如果需要经常编译大型项目,或者同时跑多个测试服务,可以再升级到4核8G。不需要一开始就上很高的配置,用的时候如果觉得卡顿再调整配置,闲的时候长期不用也可以降配,弹性是云服务器最大的优势,利用好这点就能平衡使用体验和资源成本。另外,如果是多人同时在一个云服务器软件开发,可以给每个开发单独创建用户账号,分配对应的权限,不要共用root账号,既更安全也能避免误修改别人的文件。
第二点是基础安全配置一定要做,不用太复杂但不能省。首先,只开放需要用到的端口,不需要对外提供服务的端口,都不要在安全规则里放开。比如只需要SSH远程连接,那就只开放SSH对应的端口,其他端口全部关闭。其次,不要用root账号直接远程登录,新建一个普通用户,需要高权限的时候再用sudo提权,密码要设置足够的复杂度,有条件的话直接用密钥登录,安全性比密码登录高很多。另外,如果需要在本地访问云端的开发服务,比如本地连接云端的数据库,或者本地访问云端的开发调试页面,可以用SSH隧道做端口转发,不需要把这些端口直接暴露到公网,能大幅降低被扫描探测到的风险。这些操作都不复杂,花十几分钟就能配置完成,能避免大部分常见的安全问题。
第三点是代码同步要用规范工具,不要手动随意修改。不管是个人开发还是团队开发,都要用版本控制工具管理代码,云端修改完成后及时提交,本地需要的时候直接拉取,本地修改完成后提交推送到云端,尽量不要两边同时修改同一部分代码。如果需要实时同步修改,也有现成的自动同步工具,配置好之后会自动同步两边的修改,不用手动传输文件。养成定期提交代码的习惯,哪怕是开发中的半成品,每天工作结束前提交一次,就算出了问题也能快速回滚,不会丢失代码。
很多人会问,是不是现在所有开发都要转到云上做?其实也不是,云服务器软件开发只是一种开发模式,不是必须要取代本地开发。对个人小项目,习惯本地开发的开发者完全可以继续用本地环境,只是碰到需要统一环境、大算力或者公网调试的场景,用云服务器软件开发会更方便灵活。从我自己实际使用的感受来看,这个模式最大的好处就是灵活,什么时候需要用什么时候调整资源,不用了就降低配置,也不用自己维护物理硬件,对开发者来说省了很多运维的麻烦。