前言
什么?独立开发也需要考虑系统架构设计?
可能不同的人、不同的场景都会有不同的答案,但至少在和我相似的情况下,我认为架构设计是需要的。相较于企业,独立开发资源更加稀缺,更需要合理规划和协调资源,只不过,独立开发者考虑的角度应该和企业不同而已。
在企业中,因为客户量大,需求复杂,变化频繁,且人员协作、调任、去留无时无刻不在发生,通常不得不设计一套合理的系统架构,让不同人员,不同服务,不同组件之间能够协同作业,以适应各种变化,应对各种突发情况等,以确保时刻都能对外稳定的提供服务。
而作为个人,则更需要考虑省钱、省时、省力的问题,硬件资源都是需要花钱的,必须将每个硬件资源的利用率压榨到极致,至于可用性、性能,伸缩性什么的,则可以暂时忽略。不是不重要,而是,规模还远远达不到需要考虑的程度。
举个例子,假设我现在需要部署多个网站,每个网站都有单独的域名,承担不同的业务,这很合理吧?
很明显,作为个人网站,即使最低配的服务器,访问量也很难达到需要考虑高并发的程度,更谈不上需要考虑高可用(如果哪天真达到了,怕是做梦都会笑醒)。更可能的情况是,每天几百上千的流量就顶天了,停机一周或许都不会有人知道。在这种情况下,一台服务器上即使部署10个网站,服务器资源也绰绰有余,但奈何每台服务器只能绑定一个80
端口,总不能像本地开发一样,分别绑定8080
,8081
……吧?不专业不说,怕是没人愿意访问这样的网站。而买10台服务器,那成本就有点高得可怕了。如何在同一台服务器上共享80
端口,这就需要合理的架构设计,用技术手段解决了。
再举个例子,我之前在华为云上首次购买花45块钱买了一台弹性云服务器。
后来续费花了1000多,着实肉痛了一把。
去年年底又趁着双11买了一台腾讯云的轻量云服务器。
不难看出,和华为云相比,配置提升了,时间延长了,价格却降低了,还不止一星半点。现在华为云又快到期了,还要不要续费呢?续费吧,有点贵,不续费吧,需要迁移,着实头疼。如果通过合理的架构设计,使得网站可以快速部署且方便的在不同云厂商之间切换,是否会是一个美妙的体验?
这样的例子还有很多,这里不逐个列举。作为企业,大可不必如此麻烦,充钱就完了。事实上,在不少企业中,能通过充钱堆硬件解决的问题都是“保持现状,以后再说”。但作为个人,哪有这么豪横,只能通过设计来解决,好的设计不仅可以降低成本,还可以极大的提升效率,节省时间,以一当十并不是说说而已。
1. 架构设计
开篇先说架构设计,除了有上述提到的好处之外,还起到了提纲挈领的作用,初步展现后续的开发规划。以我自己为例,我计划开发一系列B/S应用,包括个人网站、小程序、APP、公众号等,有的自己独立开发,有的则直接通过开源项目搭建或者二次开发,然后尽可能地部署到同一台服务器上。虽然具体的项目还没有完全确定,但架构可以先行,初步设计图如下:
其中,
- 为了共享
80
(HTTP
协议默认端口)或443
(HTTPS
协议默认端口)端口,网关层的反向代理服务器必不可少,考虑到通用性和文档的丰富性,就Nginx了; - 而服务层则是一个个被代理的网站,
API
等,用来承载具体的业务,当然还会有一些后台默默运行的定时作业程序; - 为了节约资源,所有服务共享数据库实例,且尽可能关系型只使用MySql,其他全部使用MongoDb。不能像企业中开发那样,一个服务一个库,或者动不动就引入Redis,MQ等;
- 运行环境则是各大云服务器,并且谁便宜就用谁,毕竟可迁移性,本来就是我们需要考虑的重中之重。
2. 部署结构
光有上述架构图还不够,还需要具体的部署方案,否则将可能会无从下手,或者即使勉强部署完了,一个人维护也会是一件很头疼的事情,更别说迁移了。
这就需要引出一个重磅级工具---Docker,具体部署结构图如下:
从上图中可以看出,
- 云主机中只安装了Docker和Docker Compose,干净,简洁。其中,Docker用于通过容器部署服务,而Docker Compose用于轻松、高效的管理多个容器。有了它们,服务的所有管理都可以通过配置文件完成。无论多少服务,自动化部署、升级,快速迁移都不在话下。
- 理论上,虽然有些中间件(如Nginx,MySql,MongoDb等)直接安装在主机,性能会更好,但考虑到如果在主机安装,网络配置和中间件迁移都相对麻烦。前面说了,个人独立开发优先考虑省钱、省时、省力,因此,我这里会将所有的服务和中间件都通过容器部署,需要持久化时,通过逻辑卷映射到主机的
/data
目录下。如果云主机需要迁移,则直接将/data
目录拷贝到新的云主机,然后在新主机上重新一键部署即可。 - 为了可视化的管理容器,而不是每次都输入一堆命令,需要在本地虚拟机中部署Portainer。为什么是本地?一方面是因为Portainer并非必须安装在服务器上,安装在本地可以节省服务器资源;另一方面,如果要管理多个服务器上的Docker容器,显然安装在本地更为合适。那又为什么是虚拟机呢?因为虚拟机安装卸载无残留,并且快照,克隆都比较方便,可以随便折腾。
- 为了方便的管理多个不同的云主机,以及本地虚拟机,而不是每次都到不同的地方登录,XShell或类似的工具也必不可少。
- 为了让自动化达到极致,Jenkins必有一席之地。
通过上述部署,再辅以相应的自动化脚本,一个人维护100个项目又何妨?
结语
文中概要阐述了整体架构和部署要点,其中也涉及到了很多的技术和工具,实际落地时,可能还会引入更多,但所有的技术和工具都是为了解决问题,释放自己的双手,而不是为了技术而技术。因此,在后续文章中,我将会站在独立开发的角度,逐步展开介绍如何使用这些技术和工具来降本增效,但不会像教科书那样,详细讲解它们的原理与用法。
如果你希望详细学习某个技术,这里可能没有你想要的答案,但如果你和我一样,也在尝试独立开发,后续文章或许会有参考价值。
评论1
wdyo
似乎看懂一点,但是还感到迷糊,感觉对于个人网络爱好者来说太友好了,希望能够应用