不是把本地开发直接搬上去

很多入门的开发者对云服务器软件开发的第一个误解,就是把它等同于“本地开发机换个位置”,把本地养成的习惯直接搬过去。本地开发用的物理机或者笔记本,资源大多是自己独占,就算稍微多装点软件,进程跑满了大不了慢一点,很少会完全连不上。但云服务器的资源是按配额分配的,不管是CPU、内存还是磁盘IO、带宽,都有明确的硬限制,超配额之后的表现不是变慢,很可能是服务直接挂掉,甚至连远程连接都建立不了。

刚才那个朋友的问题,其实就是把所有东西都堆在了同一个实例上,做开发的时候同时跑着三个数据库、两个缓存服务,还有全量自动化测试任务,每一个都在占资源。他以为加了配置就能解决,其实就算配置再翻一倍,不加管控,最后还是会被占满。我之前还碰到过一个开发者,习惯开发的时候开着实时日志打印,不做轮转,不到半个月就把100G的系统盘打满了,因为日志文件一直涨,他自己没注意,最后系统都没法正常启动。还有一种情况,很多开发者习惯在云服务器上开着IDE的网页版,一直不关机,也不退出闲置的会话,很多闲置的进程一直占着内存,慢慢就把内存耗尽了。其实只要养成习惯,每周整理一次,关掉不用的进程和会话,就能省出不少资源,这个操作花不了几分钟,效果却很明显。

还有一个容易出问题的点,就是编译大型项目的时候,很多人直接在云服务器上跑编译,不做资源限制,万一编译过程中内存爆了,会被系统直接杀掉进程,有时候还会连累其他正在运行的服务。其实云服务器的弹性能力本来就是用来解决这个问题的,开发的时候用基础配置,编译或者测试的时候临时升配,完了再降回来,既不浪费,也不会影响正常开发。这个习惯调整过来,能避开多半的资源耗尽问题。

开发环境也要做基本安全规则

第二个常见误区,就是觉得反正只是云服务器软件开发的测试环境,不是生产,不用在意安全和网络规则,为了方便,把所有入站端口都开放,还用弱密码,甚至直接开root远程登录。我之前帮一个开发者排查CPU占用过高的问题,查了半天发现不是自己写的代码有问题,是他开放了所有端口之后,测试接口一直被公网扫描,大量无效请求占满了进程池,CPU一直降不下来。他优化了快一周的代码性能,根本找错了方向。

还有更麻烦的情况,如果开发环境被入侵,攻击者改掉了系统依赖或者环境配置,你调试代码的时候,会碰到很多莫名其妙的问题,根本想不到是环境被改了。比如我之前听说过一个案例,开发者的云服务器开发环境被入侵,攻击者偷偷占用运算资源,占了超过一半的CPU,开发者一直以为是自己的代码复杂度太高,性能不够,直到要上线做性能压测才发现不对,浪费了差不多一个月的优化时间。

其实这个问题解决起来很简单,只要调整一下安全组规则,只开放你需要用的端口,比如只有自己远程连接,就把端口限制在自己常用的IP段里面,不用给整个公网开放。不用的服务直接关掉,不要默认开着。密码用复杂度够的,不要用纯数字的弱密码。还有一些开发者,为了方便远程连接,用了不安全的配置,允许密码登录还不限制IP,其实就算是开发环境,也可以用密钥登录,比密码安全很多,操作也不麻烦,只要生成密钥对之后把公钥传上去,以后登录就不用输密码,还更安全。这些操作花不了十分钟,但能避开绝大多数莫名其妙的问题,不至于把时间浪费在排查环境外部问题上。

协作开发要做好权限隔离

如果是多人一起做云服务器软件开发,最常见的问题就是不做权限和环境隔离,大家图方便,共用同一个root账号,所有项目都堆在同一个系统目录下面。今天你升级了系统依赖库,明天我改了全局环境变量,后天另一个人装了新版本的运行时,最后环境出了问题,没人能说清楚到底是谁改了什么,要重新搭环境,所有人的开发进度都要停。

我之前待过的一个小团队,刚开始做云服务器软件开发的时候就是这样,大家共用一个开发实例,所有人都用root登录,不到一个月,环境就乱到没法用。有一个开发者要调一个依赖问题,改了系统的基础库版本,结果整个系统的大部分命令都用不了,最后只能把整个实例重新初始化,所有人本地都没同步最新的代码,丢了不少东西。还有人习惯把所有项目的依赖都装在全局的运行环境里,不同项目要求的版本不一样,装来装去就版本冲突了,最后跑不起来,其实用虚拟环境或者容器把不同项目的依赖隔离开,这个问题就解决了,只是多一步操作,能省很多排查的时间。

其实不用搞特别复杂的权限管理体系,只要做最基础的隔离就能解决大部分问题。比如给每个开发者开一个独立的系统普通用户,各人的代码放在各人的目录下面,项目用到的依赖用容器跑,不同项目用不同的容器实例,不要都装在系统层面。这样就算一个人改坏了自己的项目环境,也不会影响到其他人,排查起来也容易很多。就算要重做环境,也只需要重做一个人的,不用动整个实例。

云服务器软件开发不是适合所有开发场景,但在不少情况下,它比本地开发方便很多。比如需要跨设备工作的开发者,有时候要换设备,不用同步整个开发环境,只要连上云服务器就能接着做,不会因为环境不一样出问题。还有需要大算力的工作,比如大型项目的全量编译,或者大量测试用例的执行,本地电脑性能不够,临时用云服务器升配来做,成本不高还能节省时间。团队联调的时候,大家共用一个云服务器上的联调环境,不用每个人都搭一遍依赖,也能省不少时间。

还有一个很多人都忽略的点,就是开发环境的备份。很多人觉得开发环境不用备份,改坏了大不了重新搭,但是很多时候,你本地没同步最新的修改,或者有一些临时的配置没存到代码仓库,重新搭就要花好几个小时,甚至大半天。我自己刚接触云服务器软件开发的时候也踩过这个坑,改了云服务器的网络配置,没注意改错了参数,结果远程连接连不上,没法改回去,只能重置系统,最后丢了三个没提交的功能模块,花了一整天才补回来。现在我习惯在改大的配置或者升级系统之前,先给云服务器打一个快照,就算改坏了,几分钟就能恢复回来,花不了多少时间,却能避免很大的麻烦。

其实总的来说,云服务器软件开发的核心优势,就是弹性和可共享,很多人用不好,大多是带着本地开发的旧习惯,没有利用好这些特性,反而踩了很多没必要的坑。只要调整几个基本的认知,做好资源管控、基础安全和权限隔离,就能把云服务器用得很顺手,比本地开发省不少麻烦。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐