3. 集群
有一个单体应用,当访问流量很大无法支撑,那么可以集群部署,也叫单体应用水平扩容,原来通过部署一台服务器提供服务,现在就多部署几台,那么服务的能力就会提升。
部署了多台服务器,但是用户访问入口只能是一个,比如www.web.com,所以就需要负载均衡,负载均衡是应用集群扩容后的必须步骤,集群部署后,用户的会话session状态要保持的话,就需要实现session共享。
4. 拆分
⑴ 应用拆分
应用的拆分:分布式 (微服务)
单体应用,随着业务的发展,应用功能的增加,单体应用就逐步变得非常庞大,很多人维护这么一个系统,开发、测试、上线都会造成很大问题,比如代码冲突,代码重复,逻辑错综混乱,代码逻辑复杂度增加,响应新需求的速度降低,隐藏的风险增大,所以需要按照业务维度进行应用拆分,采用分布式开发;
应用拆分之后,就将原来在同一进程里的调用变成了远程方法调用,此时就需要使用到一些远程调用技术:httpClient、hessian、dubbo、webservice等;
随着业务复杂度增加,我们需要采用一些开源方案进行开发,提升开发和维护效率,比如Dubbo、SpringCloud;
通过应用拆分之后,扩容就变得容易,如果此时系统处理能力跟不上,只需要增加服务器即可(把拆分后的每一个服务再多做几个集群)。
⑵ 数据库拆分
数据库拆分分为:垂直拆分和水平拆分 (分库分表);
按照业务维度把相同类型的表放在一个数据库,另一些表放在另一个数据库,这种方式的拆分叫垂直拆分,也就是在不同库建不同表,把表分散到各个数据库;
比如产品、订单、用户三类数据以前在一个数据库中,现在可以用三个数据库,分别为 产品数据库、订单数据库、用户数据库;
这样可以将不同的数据库部署在不同的服务器上,提升单机容量和性能问题,也解决多个表之间的IO竞争问题;
根据数据行的特点和规则,将表中的某些行切分到一个数据库,而另外的某些行又切分到另一个数据库,这种方式的拆分叫水平拆分;
单库单表在数据量和流量增大的过程中,大表往往会成为性能瓶颈,所以数据库要进行水平拆分;
数据库拆分,采用一些开源方案,降低开发难度,比如:MyCat、Sharding-Sphere。
5. 静态化
对于一些访问量大,更新频率较低的数据,可直接定时生成静态html页面,供前端访问,而不是访问jsp;
常用静态化的技术:freemaker、velocity;
定时任务,每隔2分钟生成一次首页的静态化页面;
页面静态化首先可以大大提升访问速度,不需要去访问数据库或者缓存来获取数据,浏览器直接加载html页即可;
页面静态化可以提升网站稳定性,如果程序或数据库出了问题,静态页面依然可以正常访问。
6. 动静分离
采用比如Nginx实现动静分离,Nginx负责代理静态资源,Tomcat负责处理动态资源;
Nginx的效率极高,利用它处理静态资源,可以为后端服务器分担压力;
动静分离架构示意图
redis和nginx并发量5w左右,tomcat和mysql700左右,当然可以通过一些方式调整。