什么是模式?
常见的架构模式(9种)
分层(水平分割)
分层架构
常见架构模式,将系统在横向维度上切分为几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统。【横向分切,尽早分层,小项目的时候就应该这样做】
常见的分层架构
- 表示层:视图控制及展示,比如页面展示
- 业务逻辑层:业务逻辑处理,比如购物车业务
- 数据访问层:数据存储访问,比如数据库、文件、缓存、搜索引擎等
分层架构的好处
- 大系统切分成不同组成部分,便于分工合作开发与维护
- 各层存在独立性,只要接口不变,层的演化不需要其它层同时演化
分层架构的挑战
必须合理划分层次边界和接口:
- 严格遵循分层架构的约束
- 禁止跨层调用和逆向调用
分层架构带来的部署问题
分层架构是逻辑上的,有如下部署方式:
- 方式1:三层结构部署在一台服务器上
- 方式2:按层结构部署 - 一层一个服务器
分割(纵向分割)
分割的定义
纵向软件分割,大系统分割成多个模块。不同模块可以独立部署,可以由不同团队负责。
比如:拆分为购物车、论坛、搜索等
分布式
分布式的概念
分层和分割的主要目的:便于切分后的模块进行分布式部署,即将不同模块部署在不同的服务器上,不同的模块通过远程调用协同工作【这就是分布式的概念】。
分布式的好处
- -> 更多的服务器,更多的CPU、内存、存储等
- -> 更高的并发数和数据量
- -> 支持更多的用户
分布式带来的问题
【莫要为了分布式而分布式】
- 必须通过网络,存在性能影响
- 服务器越多,服务器宕机的就越多
- 一台宕机,可能引发多个应用不可用,会降低可用性
- 数据一致性难以保证
- 网站依赖更加复杂,开发维护困难
常用的分布式方案
- 分布式服务:模块独立部署,改善性能、加速发布、复用服务减少业务功能扩展
- 分布式静态资源:即动静分离,静态资源独立部署。减少应用服务器压力、CDN加速访问、专业团队维护
- 分布式数据存储:包括分布式关系型数据库和分布式NoSQL
- 分布式计算:比如Hadoop和MapReduce分布式计算框架
- 分布式配置:实时刷新服务配置
- 分布式锁:分布式环境下实现并发与协同
- 分布式文件系统:比如FastDFS
- 分布式事务:比如Seata
集群
集群的定义
多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务。集群的目的:提高系统可用性。
集群与分布式的区别
分布式是指将不同功能或不同地点或拥有不同数据的多台计算机通过网络连接起来,由控制系统统一管理,完成大规模信息处理的计算机系统。
集群是指将多台服务器集中在一起提供同一服务,在逻辑上可以看做是一台服务器对外进行服务,这些服务器组合就是集群。
二者的区别:建议总结一句,分布式是并联工作的,集群是串联工作的。
- 从概念上来讲,分布式是将一种业务拆分成多个子业务部署在多台服务器上,进而对外提供服务;而集群是将多台服务器组合在一起提供同一服务。
- 集群强调在多台服务器位置集中,并且容易统一管理;而分布式没有具体要求,不论放在哪一个位置,只要通过网络连接起来就行。
- 集群是一种物理形态,即多台服务器在一起提供同一服务;而分布式是一种工作方式,即一个程序或业务分解到多台服务器分别完成。
总之,二者最明显的区别就是集群是多台服务器做相同类型的任务,分布式是多台服务器协同做一种任务。
知乎上给的图:
- 全栈老实人的工作就是干活。
- 一个全栈老实人干活就是单机模式。
- 两个全栈老师干活就可以组成集群。
- 把全栈老师人拆分成前端工程师和后端工程师,这就是分布式协同工作。
- 针对后端工程师和前端工程师,也可以进行集群操作。
参考
1.[分布式与集群的区别是什么?知乎](https://www.zhihu.com/question/20004877)
2.[分布式与集群的区别是什么?](http://www.360doc.com/content/18/0509/10/40060546_752383974.shtml)
缓存
缓存的定义
缓存就是将数据存放在距离计算最近的位置以加快处理速度。
现在的CPU为什么越来越快?
因为有了缓存且缓存容量越来越大,比如L1 Chache、L2 Cache
常用的缓存设计方案
CDN:内容分发网络
部署在距离终端用户最近的网络服务商,用户的网络请求总是先到达网络服务商那里,在这里缓存网站的一些静态资源(较少变化的数据),可以就近以最快速度返回给用户。比如视频网站和门户网站会把热点数据缓存在CDN。
反向代理
用户请求数据时,先到达反向代理服务器,这里缓存网站静态资源,无需将请求转发给应用服务器就能直接返回给用户。比如Nginx作为反向代理服务器。
本地缓存
应用服务器本地缓存热点数据,应用程序可以直接从内存中直接访问数据,而无需访问数据库。
分布式缓存
解决单机缓存内存限制问题,将数据缓存在一个专门的分布式缓存集群中,应用程序通过网络通信访问缓存数据。比如Redis分布式缓存。
异步
异步的定义
业务之间的消息传递不是同步调用,而是将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作。
异步架构的典型:生产者消费者模式
两者不存在直接调用,只要保持数据结构不变,彼此功能可以实现随意变化而不互相影响。
异步消息队列的特性
提高系统可用性
消费端故障,数据会在消息队列中,生产者可以继续处理业务请求,系统整体表现无故障。消费端恢复正常后,会继续处理消息队列中的数据。
加快网站响应速度
相当于提前返回,不用等处理完数据再返回。
消除并发访问高峰
并发访问高峰的请求放到消息队列中,等待消费端依次处理,就不会对整个网站负载造成太大压力。
冗余
为了保障网站7 x 24小时工作,就需要在网站服务器宕机时可以继续服务,有服务器可以冗余运行,有数据冗余备份。
服务冗余
部署至少两台服务器组成服务集群,即通过服务冗余提高可用性。
数据冗余
数据库备份:定期备份、冷备份、热备份(主从复制)。
灾备数据中心:程序和数据实时同步到多个灾备中心。
自动化
发布过程自动化
自动化代码管理:开发提交产品代号,自动创建开发分支,完成开发后自动代码合并
自动化测试:提测后,自动部署到测试环境,启动自动化测试,并自动发送测试报告,反馈测试结果
自动化安全检测:自动对提交的代码进行静态安全扫描,及部署到安全测试环境进行安全攻击测试,评估其安全性
自动化部署:待各项测试完成后,自动部署到线上生产环境
线上自动化
自动化监控:监控心跳、性能指标和关键数据指标
自动化报警:如果指标出现异常,则自动化报警
自动化失效转移:如果检测到故障,则自动将故障服务进行剔除,不再接受用户请求
自动化失效恢复:如果故障解除,则自动重新加入集群,恢复使用
自动化降级:通过拒绝部分请求及关闭部分不重要的服务将系统负载降低到一个安全的水平
自动化分配资源:将空闲资源分为给重要的服务器,扩大其部署规模
安全
密码+图形验证码+动态验证码(比如手机验证码)进行身份认证;
对敏感数据加密传输;
XSS攻击、CSRF攻击处理;
敏感信息过滤、敏感信息脱敏;