互联网在变 ,架构也在变。架构的变迁亦是互联网的变迁 。
作甚 架构?往大了说,宇宙有架构,社会有架构;往小了说 ,构筑 要有架构,软件要有架构;说玄乎一点,它由分工而来,回归团体 而去;往实际 了说 ,架构的核心 就是为了办理 题目 ,包罗 业务的题目 、人的题目 。
驻足 互联网行业,架构通常指的是技能 架构 ,更具体 一点的说是体系 架构、软件架构,大概 是最常见的网站架构。
本文就来探究 一下互联网期间 ,技能 架构的演进过程及其优缺点 。
为了方便表述 ,我姑且把互联网的架构演进过程分为三个期间 :单机期间 、集群期间 和分布式期间 。三个期间 并非按照时间发展次序 分列 ,更多的是由团队或产物 所处的时期来决定。
单机期间
互联网早期,比如 某个产物 团队初创之时 ,资源有限,人力不敷 ,为了快速开辟 一个产物 ,或上线一个网站,单机每每 是一个不错的选择。此时会将应用程序 、文件服务、数据库服务等资源会合 在一台 Server 上 。此中 应用程序通常团体 打包和摆设 ,具体 格式依靠 于应用的语言和框架,比方 Java 的 WAR 文件、Rails 的目次 文件 ,此种架构通常称为单体架构。
单体架构
其体系 架构图每每 长这个样子:
图-1: 单机期间 -ALL IN ONE
○
长处 :如上文所述,简单 快速,易于开辟 ,易于测试,易于摆设
○
缺点:也非常明显 ,只得当 早期项目 ,变大后不易维护,且存在单点,升级必要 停服
分层架构
明眼人会发现 ,此时的应用程序架构显得紊乱 无章。在早期的 Web 开辟 中大概 存在,比如 利用 JSP+JDBC,ASP+ADO ,这显然不是一个友爱 的标准 架构,于是分层架构应运而生 。
分层架构如下图所示,一样平常 分为表现 层(presentation)、业务层(business) 、长期 层(persistence)和数据库(database)。这着实 也是最常见的 MVC 架构。
图-2: 单机期间 -软件架构-分层架构
改造之后的体系 架构图如下:
图-3: 单机期间 -分层架构
○
长处 :布局 简单 ,分工明白 ,分层测试,假如 你不知道用什么软件架构时,保举 用它
○
缺点:扩展性差 ,迭代开辟 服从 低,偶然 间 条理 过多导致流程复杂
数据分离
添加了分层架构,应用上悦目 点了 ,团队的开辟 服从 有了肯定 的提拔 。此时业务量进一步增大,而且 有了肯定 的用户规模,渐渐 发现一台主机上应用和数据资源夺取 的非常锋利 。由于 每种服务对硬件资源的要求是差别 的 ,应用服务器必要 更快的CPU,文件服务器必要 更大的硬盘,数据库服务器必要 更大的内存和硬盘 ,于是决定把应用和数据服务分离,形成了如下架构:
图-4: 单机期间 -数据分离
○
长处 :资源分散,进步 差别 服务对硬件的利用 率,方便维护
○
缺点:增长 了资源斲丧 和网络开销 ,同时还存在单点
缓存登场
产物 有了肯定 的口碑,用户量连续 增长,访问开始频仍 ,想提拔 访问速率 ,缓存必不可少,此时便闪亮登场。
图-5: 单机期间 -缓存登场
服务端缓存又可以分为本地 缓存和长途 缓存 ,各有优劣,本地 缓存访问速率 快,但数据量有限 ,而且后续集群化不方便共享;长途 缓存可以共享,可以集群,容量不受限定 ,但要留意 缓存更新的题目 。
○
长处 :简单 有效 ,镌汰 对 DB 的查询
○
缺点:增长 逻辑判定 ,不得当 存储大对象,此架构同样有单点
读写分离
市场反响不错 ,业务也在连续 增长,但性能又有所降落 ,分析整个架构 ,发现数据库读写非常频仍 ,乃至 有些业务,读大于写 ,单台数据库服务器又成了瓶颈,此时就可以实行 做读写分离和主从复制了。
图-6: 单机期间 -读写分离
○
长处 :低落 数据库单台压力,从机的数量 可以机动 变动
○
缺点:架构开始变得复杂 ,维护难度加大
自此,单机期间 的架构已然成型,“麻雀虽小五脏俱全 ” ,初期已经能很好地支持 业务的运转。
但随着业务的增长,各个模块还是 大概 出现瓶颈 。单机期间 最大的题目 ,就是整个架构都存在单点,这个题目 将在集群期间 逐一 办理 。
集群期间
单机期间 ,做了不少步伐 来缓解数据库层的压力,包罗 服务器分离、引入缓存、数据分离等,但随着访问量的猛增 ,对高可用的要求越来越高,减轻应用层压力 、办理 单点题目 成了当务之急,这就是集群期间 必要 做的事变 。
负载均衡
代码是架构的底子 ,但前期改造代码的工作量较大,假如 职员 变动 频仍 ,那风险就更高了 ,以是 进步 服务器性能,常用的本领 还是 先将应用集群化,做负载均衡 。
图-7: 集群期间 -负载均衡
○
长处 :去除应用层单点 ,可用性得到包管 ,性能有所进步
○
缺点:这时要留意 应用之间的同等 性题目 ,比如 对缓存的访问,对Session的存储
动静分离
盼望 进一步低落 应用服务器的压力 ,可以采取 动静分离技能 。
动静分离是让动态网站里的动态网页,根据肯定 规则把稳固 的资源和常常 变的资源区分开来,动静资源做好拆分以后 ,我们还可以根据静态资源的特点将其做缓存操纵 ,以加快 相应 速率 。
在网易杭研,常用做法还会将前后端分离 ,后端应用提供 API,根据前端的哀求 举行 处理 惩罚 ,并将处理 惩罚 结果 通过JSON格式返回至前端。
图-8: 集群期间 -动静分离
○
长处 :减轻应用服务器压力 ,缓存静态文件,加快 相应 速率 ,前后端分离 ,开辟 可以并行 。
○
缺点:静态文件缓存更新失效题目 ,前后端沟通本钱 进步
CDN 加快
内容分发网络(Content Delivery Network),简称 CDN),可以进一步加快 网站相应 。其原理是将源内容同步到天下 各边沿 节点 ,共同 精准的调治 体系 ,将用户哀求 分配至最得当 他的节点,利用 户可以以最快的速率 取得所需内容。
图-9: 集群期间 -CDN 加快
○
长处 :办理 网络带宽小、用户访问量大、网点分布不均等题目 ,进步 用户访问的相应 速率 ,减轻应用负载压力 。
○
缺点:显然本钱 上去了,CDN服务一样平常 是按流量计费 ,同时也存在静态文件缓存更新失效题目 。
冗余集群
以上一个中型网站架构根本 成型。当中型网站继承 向大型网站演进,终极 的目标 是要包管 “三高”:高并发 、高性能、高可用 。
以上架构根本 可以满意 性能需求,接下来更多地是关注“高可用” ,确保“无单点 ”。
此时,就要对关键的服务,做冗余集群负载。
抱负 环境 下 ,我们将以下服务/应用都集群化:
1. 数据库服务集群
2. 文件服务集群
3. 缓存服务集群
4. 应用服务集群
5. 负载均衡 调治 器集群
6. 静态内容服务集群
7. CDN服务器集群
图-10: 集群期间 -冗余集群
○
长处 :去单点,高可用
○
缺点:数据有状态题目 、数据同等 性题目 ,资源本钱 、人力维护本钱 都上去了
到此为止,一个大型网站的架构也根本 成型了 。能“加呆板 ”的地方都加完了 ,是不是就闭幕 了?固然 不是!陪伴 着 DT/分布式 期间 的到来,大流量和大数据的场景的出现,对应用提出了更高的要求 ,接下来就必要 对应用程序开刀了。
分布式期间
应用拆分
在前面,我们只是把应用程序做了分层架构,在创业初期或产物 前期还是 一个不错的选择。固然 应用也做了集群和负载均衡 ,但应用架构层面还是 “会合 式”的。随着业务越来越复杂,网站的功能越来越多,应用拆分势在必行了 。
○
长处 :应用解耦 ,分拆团队负责,分而治之
○
缺点:架构变复杂
应用拆分之后,还陪伴 着一个相互依靠 、公共模块的题目 ,特别 是依靠 于雷同 的逻辑或功能代码。这时就可以思量 将这些共用的服务提取出来,独立摆设 ,同一 管理 ,进步 重用度 ,这就是面向服务的架构(service-oriented architecture,缩写 SOA)了。
消息队列
应用拆分、服务独立摆设 之后,还是 会出现一些通讯 或依靠 题目 ,这时就可以引入消息队列,进步 吞吐量 。
○
长处 :异步 、解耦,进步 吞吐量
○
缺点:消息斲丧 耽误 等题目
数据分库
应用拆分之后 ,DB分库理所固然 ,否则多个应用毗连 在单个数据库上,毗连 数、QPS、TPS、I/O处理 惩罚 本领 都非常有限。
○
长处 :DB分压 ,低落 耦合
○
缺点:数据访问模块冗余 、复杂
提到分库,不少人会想到分表,这一块我并未实践过 ,不好 下笔。但想来会引入更复杂的数据架构和数据同等 性题目 ,而且市面上成熟开源的分库分表方案并没有,保禁绝 又是一个深坑 。拆或不拆,也是一个值得思考 的题目 。
微服务架构
微服务架构(microservices architecture)一度成为热门 ,在文章、博客、大会演讲上常常 被提及。
微服务并不是凭空出现,有人说,它是面向服务架构(SOA)的升级 ,在此之前,尚有 诸如会合 式架构 、分布式的架构等 。这里借用一副抽象的图来形貌 下常见的几种架构:
图-11: 分布式期间 -微服务架构-抽象对比
微服务架构由多个微小服务构成,每个服务就是一个独立的可摆设 单位 或组件 ,它们是分布式的,相互解耦的,通过轻量级长途 通讯 协议(比如 REST)来交互。每个服务可以利用 差别 的数据库 ,而且是语言无关性的。它的特性 是相互 独立、微小、轻量 、松耦合,又能方便地组合和重构,如同 《超能陆战队》中的微型呆板 人 ,个体简单 ,但组合起来威力强大 。
图-12: 分布式期间 -微服务架构
○
长处 :扩展性好,服务之间耦合性低,服务间相互独立 ,轻易 摆设 ,易于开辟 ,方便测试每一个服务
○
缺点:轻易 太过 关注服务的巨细 ,大概 拆分地很细,导致体系 依靠 于大量的微服务,而服务之间的相互通讯 也会变得复杂 ,体系 集成复杂度增长 ,很难实现原子性操纵
微服务之以是 这么火,另一个缘故起因 是由于 Docker 的出现 ,它让微服务有一个非常美满 的运行环境 。Docker 的独立性和细粒度非常匹配微服务的理念,Docker的良好 性能和丰富的管理工具,让各人 对微服务有了肯定 的信心 ,概括来说 Docker 有如下四点得当 微服务:
独立性:一个容器就是一个完备 的实行 环境 ,不依靠 外部的任何东西。
细粒度:一台物理呆板 可以同时运行成百上千个容器,其盘算 粒度充足 小。
快速创建和烧毁 :容器可以在秒级举行 创建和烧毁 ,非常得当 服务的快速构建和重组 。
美满 的管理工具:数量 浩繁 的容器编排管理工具 ,可以或许 快速地实现服务的组合和调治 。
固然 ,好的架构和技能 要应用于实践,必要 用户承认 才行 ,这就必要 在微服务架构和 Docker 技能 上有丰富的场景化应用。网易蜂巢也在积极探索微服务架构和容器云平台的场景化服务,欢迎 一起来实践落地 。
至此,架构变迁的三个期间 先容 完成。总的来说架构不是一成稳固 的 ,时间不绝 ,进步不止,人云云 ,架构依然。
跋文
对我来说,架构之路小有实践,但实属尚浅 ,想探究 下这个话题,一下不知从何下笔,沉思很久 ,想到之前读过不少业界先辈 对于架构的叙述 ,比如 王概凯老师执笔的《架构漫谈》,比如 O'Reilly 免费出书 的小册子《Software Architecture Patterns》,比如 前人对架构的探索总结 ,受益匪浅,搜集 成文 。
文章泉源 :网易实践者社区
原文作者:黄庆兵
-END-