1.核心思想

演化
大型网站是由小网站逐渐演化而来(不是一蹴而就)
驱动
业务是技术的驱动力,不断增长的业务推动了网站技术的发展

2.大型网站架构的发展历程

单服务器
应用、文件、数据库集中在一台服务器上
应用、数据分离
应用服务器 + 文件服务器 + 数据库服务器
分布式数据缓存
80%的业务集中在20%的数据,将这部分数据缓存(数据提速)
应用服务器集群
通过负载均衡,提高可接收请求的上限(应用提速)
数据库读写分离
主从热备,主数据库负责写,从数据库负责读(数据提速)
使用CDN和反向代理
CDN缓存静态资源,反向代理缓存业务数据(数据提速)
分布式数据库
单表数据规模非常庞大时使用(数据提量提速)
NoSql数据库
天生就是用来解决大数据量和高性能问题的(数据提量提速)
业务纵向拆分
将大网站拆分为多个松耦合的小网站,通过超链接、消息队列、数据库通信(应用提速)
分布式服务
先横向拆分出服务层,再纵向拆分服务,分别发布在不同的服务器集群中(应用提速)

3.大型网站的特点

大数据
用户多,因此产生的业务数据和用户数据多
高并发、大流量
用户多,因此单位时间请求量大
必须高可用
用户多,一旦宕机,波及范围广、损失大
网络情况复杂
用户多,且分属在不同的网络环境中
安全环境恶劣
树大招风,成为众多黑客攻击或炫耀的对象
渐进式发展
市场变化快,不可能一开始就捕获所有 功能性和非功能性 需求
发布频繁
为快速响应用户需求,频繁增量迭代

4.大型网站解决问题的思路

分层
横向切分,定义层次边界和接口(合理的分配职责)
分割
纵向切分,根据“高内聚、低耦合”定义模块(使模块独立)
分布式
切分后的模块,部署在不同的服务器上(分工协作)
集群
多台服务器干同一件事情(人多力量大,并可相互替代)
缓存
将经常访问的数据,暂存到可以快速读取的地方(访问提速)
异步
将一个业务操作分成多个步骤,通过消息队列联系相邻的步骤(使步骤独立)
冗余
服务器和数据多做几个备份(增加后备力量,应付突发情况)
自动化流程
开发、维护过程中的固定步骤,用程序描述出来,交给计算机来做
安全
漏洞扫描 + 加密技术 + 信息过滤 + 风险控制

5.大型网站架构的核心要素

性能
(现在)响应迅速
伸缩性
通过增加硬件,使性能(在未来)提升
扩展性
容易(在未来)增加功能
可用性
(一直)稳定,不报错
安全性
(一直)抵御恶意攻击

1.性能:及时响应

改善交互
先反馈信息,再慢慢干活(快慢是一种主观感受)
减少响应时间
改进算法 || 缩短通信时间
增加硬件
用硬件资源换性能(人多力量大)

2.伸缩性:充分发挥硬件的能力

分布式
以功能为单位,分别部署到不同服务器上
集群
一项功能,部署到服务器集群上
负载均衡
作为代理服务器,感知集群中各个服务器的负载情况,并将请求转发到负载最低的服务器
NoSQL数据库
非关系的、分布式数据库设计模式(分布式增强伸缩性)

3.扩展性:对扩展开放,对修改关闭

低耦合
定义接口、切分模块(单一职责),职责越简单,耦合性就越小
消息队列
用事件机制耦合接口,调用方生产消息存入队列,被调用方读取队列消费消息
分布式部署
各个模块独立运行(修改一个,不影响其它模块正常运行)
NoSQL数据库
数据结构可扩展

4.可用性:少出故障,快速恢复

度量方法
可用性 = ( 1 - 故障时间 / 年度总时间 ) × 100%
资源冗余
备份服务器和数据(坏了可以恢复)
失效转移
通过负载均衡,将请求转移给能够处理它的服务器(找到可替代的人)
幂等性设计
服务可重复执行(不因执行次数,影响处理结果)
自动化流程
通过持续集成、自动化监测,使用固定步骤尽早发现故障,尽早解决(提前预防,快速响应)

5.安全性:提高攻击门槛

拒绝请求
拒绝包含js或SQl的请求(不让逻辑执行)
对输入消毒
将js和Sql转化为普通文本(使注入逻辑失效)
SQL语句参数化
不通过拼接的方式构造SQL语句(使注入逻辑失效)
HttpOnly
给存储session的cookie加HttpOnly标记(使cookie不能被js操作)
表单Token
把信物放到表单中,确保post请求来自本网站(拒绝伪造的表单请求)
过滤上传文件
服务器拒绝可执行文件(不让逻辑注入)
加密
保护敏感信息(无法解密,拿到也没用)
信息过滤
处理敏感词汇(不传播非法信息)
黑名单
对于黑名单中的用户,关注或限制其操作(针对人进行防范)
Web应用防火墙
根据内置的安全规则,对请求进行分析处理(针对可疑请求)
Web安全漏洞扫描
根据内置的安全规则,模拟黑客攻击,测试网站的安全性(全面检查,增强信心)

1.高手的养成:遇到了常人难以遇到的问题,并解决了(积累经验的机会多)
2.业务问题可以由技术手段和业务手段来解决(不要禁锢解决问题的方式)