默默在看新机会的你,是不是面试的时候,偶尔被问起“能不能简单介绍一下项目的应用系统架构”?沉迷于业务开发的你们,有没有考虑过“用户访问到你开发的业务功能,到底经过了哪些环节”?
关注"一猿小讲"公众号的粉丝们今天有福了,因为今天我将结合这些年的一些认知理解,开坛设法给大家讲一讲应用系统架构的从 0 到 1。
01. 如何造一个大泥球?
产品汪:紧急需求,2 天时间完成 x 网站的上线,包含知识问答页面功能。
程序猿:时间短,任务紧。一切以上线为目标,那一切皆可是静态,一切皆是硬编码。花半天时间,让前端妹子写成静态 HTML,打成 x.war 包,放到Web服务器(Tomcat)就轻松搞定所有。
产品汪:上一版的需求功能实现不错,领导很满意。接下来要实现注册、登录功能。其中注册功能包含开通三方账户,开通三方账户会存在超时现象,超时后需要继续开通账户,前端页面提示开户处理中。
程序猿:注册成功需要用 MySQL 做存储;开通三方账户超时的需要继续处理,那这个只能加个定时任务系统来重新跑批支持了。
产品汪:没想到你们开发团队挺给力啊,上期的功能又得到了领导的大力认可,不过我们想看看开通失败的用户有哪些,顺带着能修改部分信息?另外我们还想通过页面添加知识问答的文章?
程序猿:没问题,产品汪只要需求,我们猿就开撸。不就是再开发个运营管理平台么,代码copy、粘贴,so easy!!
到此一个小而全的大泥球系统就产生了,或许你已经从事了 N 年的研发,也一直不停的再和这几个系统打交道。
02. 如何使大泥球跑的更好?
起初产品需求简单,开发的功能也简单,网站系统架构也简单。如上图所示:网站架构用一台Web服务器就轻松搞定。
随着业务推广,如上图所示:用户量逐日增长,单台Web服务器(Tomcat)肯定不能满足网站的需求。
面对这个问题,不得不提提尼古拉斯赵四说过的一句话:世界上没有什么事,是一顿烧烤不能解决的,如果有,那就两顿。这个问题不就是这种解决方案么,一台 Web 服务器不够,那就再加一台呗。但是用户却郁闷了,访问地址变成了两个,这用户、产品汪们肯定都不能接受。
程序猿再三思考一二。如上图所示:那就站在尼古拉斯赵四的肩膀上,再部署一个Nginx专门用来做分发,那问题不就解决了么。Web 应用服务器部署的问题是解决了,但是却引入了另外一个问题,如果做分发的Nginx挂了,咋办呢?
各位看官肯定也想到了尼古拉斯赵四的解决方案:那就再部署一份 Nginx。但是用户也会很郁闷,访问地址又变成了两个,这用户、产品汪们肯定都不能接受。
程序猿往往会出其不意、未雨绸缪。天上飘来五个字“那都不是事”,加个 LVS 支撑一下问题不就迎刃而解啦。结合前面的步骤,你肯定也会有疑问“如果 LVS 挂了怎么办?”,若有此疑问,说明你的思考没毛病。如上图所示:LVS 是主备,并且主备之间进行通讯,如果 master 主的挂掉,备的会成为主节点继续对外服务。
到目前为止你对应用架构集群的部署就了解差不多了,随着业务的逐日增多,其中Nginx集群可以横向扩展、Web服务器也是可以横向扩展,但是 MySQL 数据库势必会成为瓶颈,那该怎么办呢?
如上图所示:面对MySQL成为瓶颈时,想到的便是分工明确、各司其职、进行数据库读写分离。一般也会引入基于内存的数据库 Redis,把经常读的信息缓存一份。
如果数据量级特别大,那不得不用一下数据库分库分表,可用的技术有 MyCat、Sharding-Jdbc,今天就不再进行深入展开啦。
03. 带你装 B,带你飞
另外在微服务发展盛行的今天,上述的应用架构(单体架构)确实也存在有不足点,就送给大家一张图,大家自己搜一下微服务相关的知识,脑补一下空白吧。
再送给大家抛一个“Service Mesh”服务网格的概念,有时间也可以稍微了解一下,技多不压身。
04. 写在最后
今天主要结合个人的理解,简单聊了聊应用架构的部署演变历程,希望你能够有所收获。好了,码字不易,画图更不容易。如果感觉稍微有点意思,不用赞赏,就点击右下角的“在看”,或者多多分享给你的朋友就很感激。