毕业3年间我是怎么完善自己的单体服务器架构的

29次阅读

共计 4498 个字符,预计需要花费 12 分钟才能阅读完成。

毕业到现在,算了算也快 3 年了。我也不知道怎么突然,就玩了这么多技术,本来是.net 的却成为了一枚 PHP 全栈工程师,虽然也不算深入,可是一般的软件开发,还是可以应付的。有些时候对广州那边的面试或者深圳的面试,我会比较抗拒笔试,因为我就没有看过他们所说的术语,我一直都是直接去 GitHub 直接 review,并参考,不懂就谷歌。

至于我是怎么开始走上架构搭建这条路,要从毕业开始。

毕业的时候,由于信心和经历都不全面,去了一家广告公司,面向猪八戒接单,也就是外包公司,进去呆了两个月。感觉这不是我想要的发展方向,然后就不告而别了,因为年轻不懂事。然后去了一家卖茶叶的公司,他一开始把分享吹上天,然后去“微三云”企业参观,买了一套源码。然后教我维护,我一个刚毕业出来的人,业务都不懂怎么处理,你叫我维护一个上市公司的源码?,你这是逗我,然后一个月后我感觉不适应,我离职。然后去了一家还是没有任何人开发人员,想出来做金融行业的传统行业,这里就比较有趣了,我大学学到的东西,可以自己任由发挥,可是传统企业都有一个毛病,急于求成,两个月过去,它们发现没有任何收益,就解散了。

然后接下来是我人生的转折点,这也是我遇到我职业生涯的导师,前后两个人,一个是我的上司,一个是我的经理。再遇到经理之前,和上司在另一家企业工作,然后公司搬到一个很大型的卖场,在那个卖场里面公司可以说是唯一一家科技公司,那时候那个卖场经理就来参观了。后面认识之后我们才知道,经理他以前是百度出身的。后面老板和技术总监闹矛盾,还打起了公司。然后就没然后了,所在的企业再次面临解散,然后我和上司就投靠了我们经理,想跟他做一番“大事业”。就这样,我们三个人就组建了一个团队了。

因为上司年纪也上去了,又有家庭,所以很多时候,我要承担更多的事,前端是我,php,服务器搭建都是我,哈哈哈。那时候的业务和敏感业务处理,上司是不会给我处理的,所以 php 也就 crud 这样一个水平,上司在技术选行这个工作是交给我处理的,所以你们说的所有框架我都玩过,无论 angular.js , angluar , React , Vue , Omi ,ThinkPHP , Laravel , Yii2 , Mysql, Node.js, Egg.js,
Express.js …. 等等等,这可以说是初级架构师要做的事情吧。最后根据团队情况,我选择了 Laravel +(Vue Or React)作为自己技术栈,后端还是中规中举的 Layui,不用问我为什么,有什么是一个 Jquery 做不了?如果有那就两个!因为后端可是什么前端框架都不会,可他们肯定会 jQuery。

可以浏览一下我的简书,你会发现,我 2017 年一年下来,写得最多的博客是服务器搭建。是的我一年就开始搭建服务器架构了。还有就是搭建了一个 gogs

也就能运行 php 环境这个阶段,同时开始通过经理给的需求,进行需求分析和于上司经行业务梳理,然后制度方案,一开始的架构很简单,也加我们说的 dump,连 redis 缓存机制都没有,缓存用的是本地文件机制来处理。
第一版的时候:服务器环境是这样的

全部的代码都在一台主机上运行。因为当时业务并不算大。我并没有选择国内所说的 centos 做服务器系统,而是选择了 ubuntu 来做,因为 ubuntu 的软件库的支持,我距地是外来云计算会有很大的作用。

后面我们需要用到缓存机制,那么我们的环境架构也需要更新支持,在 windows 上会出现各种奇葩的问题,比如 php 扩展的安装就是 windows 的头疼问题,现在的 windows10 已经有解决方案,可是当时的我们没有这种条件,php 的图片处理需要扩展,什么都需要。那时候我开始提出使用虚拟机作为我们的开发环境,使用的 vm 虚拟机,利用的是 vm 虚拟共享文件机制,加上 hosts 的映射到虚拟机中。这样处理后,我们企业的 php 环境保证一至。

这时候的开发环境就变成了

随着自己对 linux 的熟悉,和环境搭建的逐渐深入。16 年可以说是 vue 爆发的一年,我在 14 年就已经接触 vue 这个框架,可是当时的人向往的是 angluar.js,我知道国人的尿性,vue 迟早是一个趋势,16 年 vue 爆发,生态完善,同时小程序的出现,了解了一下,发现小程序有点像 vue,后面也有类 vue 框架的出现,那是我意识到前后分离的重要性。这个时候才算真正入门架构搭建。

这时候的属于中规中矩的一种软件开发中的处理手段,到了后面,mysql 的数据库需要做读写分离,一般的人是怎么处理呢?还就真的是处理配置读写分离,在程序上做一些判断!!!就是写的时候 catenation 读数据库,catenation 写数据库,这样做也不是不行,只是后面的时候,你的系统解藕会非常痛苦,可能你有时候都忘了那个地方写个 catenation 别名。我选择的是使用中间件链接池来管理我的数据库读写分离。

这个时候我已经开始认识 Swoole 了,我无意间在开源中国发现 SMProxy 这个基于 Swoole 的数据库链接池。所以后面也就开始出现以下情况。

随着后面的访问量上来之后,mysql 读的速度跟不上了,因为用的是 laravel,laravel 运行速度你们都懂,我就不多说了,那时候知道 laravel+swoole 可以提高性能,可是每次都要去服务器重启服务,而且那时候的 swoole 还停留在 1.9 的版本,估计坑也不少,所以为了保守,就在 mysql 和 api 层都做了负载均衡。
你就看到了如下情况。

为什么需要用到 keepalived 去监听写入的 mysql?如果 mysql 写入挂了,keepalived 一旦检查到,会把某台读 mysql 换左写入数据库。保证你的系统还可以继续进行。

到了这里,就算你的电脑是 16G 运行这么台虚拟机后难免也会有点卡的啦,虽然以前有用过 docker,可是那时候对 linux 并不熟悉,搭建环境的时候,会遇到各种问题,Dockerfile 写都写不出来,直到今年 19 年 4 月,我开始意识到我需要 docker 了,而 19 年的 docker 已经很完善了,docker-compose 的出现,可以让你模拟的环境一键部署。我一开始去 github 找了好几个 docker-compose 版本的来看看,并吸收他们的精华,并现在自己的 docker-composer 项目环境部署。

ui 层一直是我来维护的,我选择的是 React 做为我的技术栈,不为别的,就因为他支持 Ts,写代码跟舒服,而且有 antd 这个叼东西支持。可是我们的 ui 层分为 小程序 / express.js(PC 端渲染层 SEO)/ 手机端 React。小程序 和 React 还好说,是静态资源,express 就有点麻烦了,需要重启服务,所以这个时候就需要 pm2 的接入。同时 Swoole 的完善进入 Swoole4。

由于 swoole 的高性能,所以之前的负载均衡就可以剩下来了。

随着 ui 层 和 swoole 每次迭代更新代码,都需要做一个繁琐的操作,打包编译。
所以这个时候就有了 jenkins 这个角色。

jenkins 简单点就是自动化部署工具,现在有了 docker 安装简单的要死。。

到了这里,几乎一般软件开发都可以应付。当然这里这是环境搭建而已,还有一些业务梳理架构没有详细说明,如果你能搭建到以上服务器环境的话,那么你的项目就不可能,只停留在写代码这么简单了,因为现在是数据驱动行业的年代,我们需要对用户行为进行分析!!!

往往我们市场说得最多得就是 pv uv,如果是你,你会怎么处理?

如果没有接触过 nignx 日志的码农一般都会给出两个方案:
第一,使用站长工具
第二,利用 ajax + 建立数据库模型。然后使用程序 +mysql 做统计分析。

第二种是,属于高级版本,往往需要用到 Redis + 定时任务来写入数据库,如果不是这样,你的写入数据库不做集群?等着呵呵吧。

如果接触过 nginx 日志的同学来说,php 面对这一个海量数据的时候,很多 PHP 或者 Node 的开发人员第一时间都会蒙蔽,是的如果你听到海量数据,你第一反应的就是 hadopp,这个时候我们需要跳出自己生活许久的圈子(PHP + Node),为什么要选择 Hadoop 而不是采用第二种方式呢?因为 Hadoop 提供了很多面对海量数据的算法,还有之前写爬虫的时候利用的是 python,python+Hadoop 数据分析,你还用愁你分析不出东西吗?

所以又得到以下日志架构

等等一些 nginx 的用户行为。

有了以上的日志分析,我们会发现有时候会有同行或者某些人,是恶意扫描我们的服务器,我这个时候就应该需要 Api 网关了。

我选择的是 kong,其实你用 nginx 也可以,不过嘛,你也懂 php / node 出生的,哪里懂那些底层的东西 …,除非你会 golang。

Kong 是通过 Admin API 管理,不像 Nginx 那样在配置中完成。有管理工具你不用你傻呀?而且 Kong 支持 Lua 插件机制、支持 OAuth2.0、黑白名单、ACL、JWT、SSL 等、限量的 Rate Limiting 还有 可管理性 Rest API 交互 性能也比较高。

所以又改了一下

到了后面你的数据量也会越来越大,这个时候你还在用 mysql 的全文搜索索引,是很不现实的一建事情。

这个时候你不得不考虑使用 搜索引擎。外国人用的比较多的是 Elastic Search 当然 laravel 也对 Elastic Search 的支持。可惜嘛这个东西消耗的资源太大了。我们最后还是使用了 xunsearch,虽然这个东西有时候搜索的东西不准,但是至少能用 …., 就是配置起来嘛没有 Elastic Search 方便。

这里搜索引擎用在搜索产品上,你需要用 队列 或者 定时任务 来同步 xunsearch 和 mysql 之间的关系。

2019 9 月,这是一个尴尬的时候,由于实体经济的下滑,系统也过于稳定。大老板不想在开发系统了。技术部面临解散,我和上司,经理告白之后。重新踏上招工作的路程。

我并不知道自己能不能胜任架构师这个岗位,因为看了看描述,几乎都在本科学历。我想想我可以做前端 /php/ 全栈这个些岗位。

也开始投,可是嘛,怎么说呢。带人我也带过,虽然说技术不是很精,可是业务处理能力我也是有的,你也不能因为我学历还有年轻压我工资嘛。

9 月底,决定跳出中山这个环境。去了广州二家企业面试,感觉做不会以前的事了,要当回码农,可玩的事情就变得越来越少了。

最后不知道什么原因,我遇到一家创业公司的邀约。
就这样我又回到以前的工作内容

需求分析 业务梳理 架构搭建,现在老板算是比较成功的啦,可以把平台做到 300wpv 的巅峰时期。

我看来看现在的 pv 还是可以的 每天也有 10v,不过之前的那个系统 bug 较多,系统也没有利用设计模式开发,全是堆代码,技术总监的离职,我感觉这个坑我是接不了。

申请重构代码,并把一些不合理的业务重新梳理一遍
然后架构也变为一下状态

又从零开始了,来着可怜的程序员傻梦傻,现在面临的问题是 docker 在不同机子部署的时候,都要麻烦的去 开启端口映射,所以未来需要做得是 学习 k8s,还有 mysql 以前用的是 orm 较多,可是现在为了提高这方便的知识,偶尔会写 sql api 层减少 查询次数。

SQL 我现在用的是基于小米的 soar-web。

正文完
 0