转载

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

毕业到现在,算了算也快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缓存机制都没有,缓存用的是本地文件机制来处理。

第一版的时候:服务器环境是这样的

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

image.png

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

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

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

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

image.png

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

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

image.png

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

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

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

image.png

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

你就看到了如下情况。

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

image.png

为什么需要用到 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 的高性能,所以之前的负载均衡就可以剩下来了。

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

image.png

随着ui层 和 swoole 每次迭代更新代码,都需要做一个繁琐的操作,打包编译。

所以这个时候就有了jenkins这个角色。

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

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

image.png

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

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

如果没有接触过nignx 日志的码农一般都会给出两个方案:

第一,使用站长工具

第二,利用 ajax + 建立数据库模型。然后使用程序+mysql做统计分析。

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

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

所以又得到以下日志架构

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

image.png

等等一些nginx的用户行为。

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

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

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

所以又改了一下

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

image.png

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

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

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

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

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

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

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

最后不知道什么原因,我遇到一家创业公司的邀约。

就这样我又回到以前的工作内容

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

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

申请重构代码,并把一些不合理的业务重新梳理一遍

然后架构也变为一下状态

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

image.png

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

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

原文  https://studygolang.com/articles/24358
正文到此结束
Loading...