说到模式到处可见,生活中穷人模式、富人模式,工作中的996模式,Java中设计模式,武打模式,恋爱模式等等。当然网站的架构也不例外,也有他自己的模式。当然模式不是一成不变的,模式仅供我们借鉴和参考,到底哪种模式适合自己适合自己的网站需要因地制宜。
网站的模式是以高效、易扩展、易维护、安全性高为目标。
1、分层
说到分层我们很容易想到网络七层物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。一般大型网站分为
应用层:负责具体业务和视图展示
服务层:为应用层提供服务支持,例如用户服务、订单服务、商品服务等(可以是一个dubbo服务)
数据层:提供数据存储访问服务,数据库、缓存、文件、搜索引擎等
通过分层把一个庞大的软件系统切分成不同的部分,这样可以各司其职,方便以后的扩展和维护。
2、分割
网站越大功能越复杂,服务和数据的种类越多,可以将不同的服务和功能分割开来,包装成高内聚低耦合的模块单元,一方面有助于软件的开发和维护,另一方面便于将不同的模块分布式部署,提高了网站的并发能力和功能扩展能力。
例如将一个大型网站的购物、论坛、搜索、广告分割成不同的应用,有独立的团队负责,部署在不同服务器上。
3、分布式
上面我们说的分层和分割其实都是为了分布式部署做准备,分布式的调用必然依赖网络传输,这可能对性能造成影响;其次服务器越多宕机的概率的越大,一台服务器的宕机怎么保证整个服务不受影响都是我们需要考虑和解决的;另外分布式环境中保持数据的一致性也比较困难,分布式事务难以保证;分布式也会导致网站依赖错综复杂,开发管理维护困难,因此分布式设计一定要谨慎,切勿为了分布式而分布式。
网站应用中分布式服务有:
分布式应用和服务:将分层和分割后的应用和服务模块分布式部署,除了可以改善网站性能和并发性还可以加速开发和发布速度,减少数据库连接资源消耗,还可以使不同服务复用功能服务,便于业务功能的扩展。
分布式静态资源:网站静态资源例如CSS、JS、图片单独部署,用独立的域名,这样可以减轻应用服务器的访问压力
分布式数据和存储:数据库集群、nosql集群、分布式文件等
**分布式计算:**Hadoop、MapReduce等分布式计算框架
4、集群
使用分布式虽然已经将分层和分割后的模块独立部署,但是对于用户集中反访问的模块(例如:首页)还需要独立部署的服务集群化,即多台服务器部署相同的应用构成一个集群,通过负载均衡对外提供服务。
5、缓存
缓存就是将数据放在距离计算机最近的位置以加快处理速度。通过缓存可以大大减轻数据的压力,提高网站的性能和访问速度。
CDN:内容分发网络,部署在距离用户最近的机房,用户访问总是先请求到距离他最近的网络服务商,很多静态资源也可以缓存在CDN
反向代理:反向代理属于网络前端架构的一部分,当用户请求到达网站数据中心时,最先访问的就是反向代理服务器(例如Nginx),这里缓存网站的静态资源,无需将请求继续转发给应用服务器就返回给用户
本地缓存:最高效,但不宜多
分布式缓存:可以实现大数据量的缓存,并且缓存数据可以分布式部署,减轻单台缓存服务器的压力,可以无限水平扩展
6、异步
大型网站的解耦除了分层、分割、分布式之外还有异步。在单一服务器内部可以通过多线程共享内存队列方式实现异步,处在业务操作前面的线程将输出写入队列,后面的线程从队列中读取数据进行处理;分布式系统中,多个服务器集群通过分布式消息队列实现异步。
使用异步消息队列可以提高系统的可用性、加快网站响应速度、提高了网站的吞吐量,消除并发访问高峰。
7、冗余
要保证网站服务的HA,我们需要提供备机和数据备份,来防止由于服务器宕机对用户造成的影响
8、自动化
发布自动化、代码自动化管理、自动化测试、自动化安全监测、自动化部署、自动化监控、自动化报警、自动化失效转移、自动化失效恢复、自动化降级、自动化分配资源
9、安全
数据传输加密、登录验证码、XSS攻击、SQL注入攻击预防、限流控制、IP黑名单等