早期的网站为了节省成本通常会设计成集中式系统,应用程序、数据库等都部署在一台服务器上。 但随着业务的快速度发展,逐渐出现瓶颈,按必定原则**(应用拆分、服务拆分、数据拆分、应用解耦)**,向分布式系统转型,涉及到如下环节改造。html
主要环节前端
业务拆分:将整个网站业务拆分红不一样的应用,每一个应用独立部署维护,应用之间经过RPC或消息队列通讯。java
集群化(应用服务器;基于RPC的微服务应用等)面试
LVS负载均衡,负责将请求转发给不一样业务集群算法
反向代理服务器,经常使用的如Nginx数据库
应用服务器,servlet容器,如tomcatjson
应用和数据服务分离,分别部署在不一样的服务器后端
后端应用合理分层,一般分为表现层或网关层、业务逻辑层、数据持久层浏览器
缓存。分为两种:本地缓存;分布式缓存缓存
CDN化。静态内容部署到CDN,就近获取,加速网站响应。
数据库读写分离。数据库采用主从热备,应用服务器在写数据时访问主数据库,主数据库经过主从复制机制将数据更新同步到从数据库。
分库分表,引入分布式数据框架
引入NoSQL,支持海量数据存储
借助elastics search等开源搜索引擎
异步化,系统解耦。
缩短业务流程,加快网站访问速度
消除并发访问高峰
架构五要素:
高性能
可用性(Availability)
伸缩性(Scalability)
扩展性(Extensibility)
安全性
一、高性能
性能的测试指标主要有:
响应时间:指应用执行一个操做须要的时间
并发数:指系统可以同时处理请求的数目
QPS:指单位时间内系统处理的请求量
系统性能计数器:描述服务器或者操做系统性能的一些数据指标
性能优化,根据网站分层架构,能够分为三大类:
Web 前端性能优化
减小 http 请求
使用浏览器缓存
启用压缩
CSS 放在页面最上面,JavaScript 放在页面最下面
减小 Cookie 传输
应用服务器性能优化:主要手段有 缓存、集群、异步
多线程(设计为无状态,使用局部对象,并发访问资源使用锁)
资源复用(单例,对象池)
数据结构
异步操做(消息队列,削峰做用)
多台应用服务器组成一个集群共同对外服务,提升总体处理能力。
使用 CDN,将网站静态内容分发至离用户最近的网络服务商机房,使用户经过最短访问路径获取数据。能够在网站机房部署反向代理服务器,缓存热点文件,加快请求响应速度,减轻应用服务器负载压力
应用服务器端,可使用服务器本地缓存和分布式缓存(网站性能优化第必定律:优化考虑使用缓存优化性能)
代码层面,也能够经过使用多线程、改善内存管理等手段优化性能。
数据库服务器端,索引、缓存、SQL 优化等性能优化手段
NoSQL 数据库经过优化数据模型、存储结构、伸缩特性等
存储服务器性能优化
机械硬盘 vs. 固态硬盘
B+ 树 vs. LSM 树
RAID vs. HDFS
二、高可用
高可用的网站架构:目的是保证服务器硬件故障时服务依然可用、数据依然保存并可以被访问,主要手段数据和服务的冗余备份及失效转移
高可用的应用:显著特色是应用的无状态性
经过负载均衡进行无状态服务的失效转移
应用服务器集群的 Session 管理
高可用的服务:无状态的服务,可以使用相似负载均衡的失效转移策略,此外还有以下策略
超时设置
异步调用
服务降级
限流
高可用的数据:主要手段是数据备份和失效转移机制
失效确认
访问转移
数据恢复
冷备:缺点是不能保证数据最终一致和数据可用性
热备:分为异步热备和同步热备
数据一致性(Consisitency)
数据可用性(Availibility)
分区耐受性(Partition Tolerance)
CAP 原理
数据备份
软件质量保证
自动化测试
预发布验证
灰度发布
网站实时监控
警报系统
自动优雅降级
用户行为日志采集(服务器端和客户端)
服务器性能监控
监控数据采集
监控管理
三、伸缩性
大型网站须要面对大量用户的高并发访问和存储海量数据,不可能只用一台服务器就处理所有用户请求,存储所有数据。网站经过集群的方式将多台服务器组成一个总体共同提供服务。所谓伸缩性是指经过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增加的数据存储需求。
衡量架构伸缩性的主要标准就是是否能够用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否能够提供和原来的服务器无差异的服务。集群中可容纳的总的服务器数量是否有限制。
对于应用服务器集群,只要服务器上不保存数据,全部服务器都是对等的,经过使用合适的负载均衡设备就能够向集群中不断加入服务器。
对于缓存服务器集群,加入新的服务器可能会致使缓存路由失效,进而致使集群中大部分缓存数据都没法访问。虽然缓存的数据能够经过数据库从新预热,可是若是应用已经严重依赖缓存,可能会致使整个网站崩溃。须要改进缓存路由算法保证缓存数据的可访问性。
关系数据库虽然支持数据复制,主从热备等机制,可是很难作到大规模集群的可伸缩性,所以关系数据库的集群伸缩性方案必须在数据库以外实现,经过路由分区等手段将部署有多个数据库的服务器组成一个集群。
至于大部分 NoSQL 数据库产品,因为其先天就是为海量数据而生,所以其对伸缩性的支持一般都很是好,能够作到在较少运维参与的状况下实现集群规模的线性伸缩。
归纳起来伸缩性的分为以下几个方面:
应用服务器集群的伸缩性设计
轮询(Round Robin, RR)
加权轮询(Weighted Round Robin, WRR)
随机(Random)
最少连接(Least Connections)
源地址散列(Source Hashing)
DNS 域名解析负载均衡
反向代理负载均衡(在 HTTP 协议层面,应用层负载均衡)
IP 负载均衡(在内核进程完成数据分发)
数据链路层负载均衡(数据链路层修改 mac 地址,三角传输模式,LVS)
分布式缓存集群的伸缩性设计
Memcached 客户端(包括 API,路由算法,服务器列表,通讯模块)
Memcached 服务器集群
分布式缓存的一致性 Hash 算法(一致性 Hash 环,虚拟层)
数据存储服务集群的伸缩性设计
关系数据库集群的伸缩性设计
NoSQL 数据库的伸缩性设计
四、可扩展
系统架构设计层面的“开闭原则”,构建可扩展的网站架构
利用分布式消息队列下降耦合性
分布式消息队列
事件驱动架构(Event Driven Architecture)
利用分布式服务打造可复用的业务平台
分布式服务框架设计(Thrift,Dubbo)
可扩展的数据结构(如 HBase的 ColumnFamily 设计)
利用开放平台建设网站生态圈
五、网站的安全架构
XSS 攻击和 SQL 注入攻击是构成网站应用攻击最主要的两种手段,此外还包括 CSRF,Session 劫持等手段。
攻击与防护
对js转义,使其失去执行功能,只做为纯字符串展现
防范:httpOnly;增长token校验;经过Referer识别。
网站安全漏洞扫描
CSRF 攻击:跨站点请求伪造(Cross Site Request Forgery)
Error Code
表单 Token
验证码
jsonp请求的,Referer 校验
SQL 注入
html 危险字符转义
XSS 攻击:跨站点脚本攻击(Cross Site Script)
一、具备1-5工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加群。
二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加群。
三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加群。
四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加群。
5.群号:651013434 高级开发
6.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知。