第一篇 网站基础知识
本篇主要内容主要包括网站架构的演变、web中涉及的协议、协议的实现方法、java中的Servlet以及Tomcat的分析。
第一章 网站架构及其演变过程
1.1 软件的三大类型
软件的三大类型包括:单机类型、CS类型和BS类型,其中现在使用最广的是BS,因为它开发简单、使用方便而且功能强大。但BS结构在灵活性和处理效率上都不如CS结构,所以想QQ等软件使用的还是CS结构。
如图
1.2 基础的结构并不简单
前面说的BS的结构是最简单的结构,但它的底层实现也并不简单。因为它需要通过互联网传输数据,而互联网是一个错综复杂的网络。BS结构网络传输有两种参考模型:一种是标准的OSI参考模型,另外一种是TCP/IP参考模型。
如图
OSI参考模型共分为7层,主要用于教学,实际中更多使用的是TCP/IP的4层模型,分别为网络接入层、网际互连层、传输层和应用层。
网站架构要解决的两个最核心的问题:海量数据操作问题和高并发问题。
1.3 架构演变的起点
从一台服务器到数据和应用的分离。
1.4海量数据的解决方案
1.4.1 缓存和页面静态化
数据量大直接的解决方案就是使用缓存。使用缓存的方式可以分为通过程序直接保存到内存中和使用缓存框架两种。程序直接操作主要使用Map,尤其是ConcurrentHashMap(参见:http://www.importnew.com/22007.html);常用的缓存框架有Ehcache、Memcache和Redis等。缓存使用过程中最重要的问题是什么时候创建缓存和缓存的失效机制。
缓存不适用的场景:数据变化频繁、数据实时性要求高。
页面静态化,也可以理解为另外一种形式的缓存,缓存是将从数据库获取到的数据保存起来,而页面静态化是将程序最后生成的页面保存起来,不但不需要查询数据库,而且连应用程序处理都省了,所以页面静态化同时对数据量大河并发量高两大问题都有好处。
1.4.2 数据库优化
常用的有表结构优化、SQL语句优化、分区和分表、索引优化、使用存储过程代替直接操作,另外有时也可以使用冗余。
表结构优化
没有不变的准则,需要根据实际情况具体处理
SQL语句优化
基础优化是语法层面的优化,更重要的是处理逻辑的优化,也需要根据具体情况进行处理。
分区
分区是将一张表中的数据按照一定的规则分到不同的区来保存,这样在查询时如果数据范围在同一个区内那么可以只对一个区的数据进行操作,这样操作的数据量更少,速度更快。
分表
如果一张表中的数据可以分为几种固定不变的类型,而且如果同时对多种类型共同操作的情况不多,那么都可以通过分表来处理。
索引优化
索引是一把双刃剑,它咋提高查询速度的同时也降低了增删改的速度,因为每次数据变化都需要更新相应的索引。所以对哪些字段使用索引、使用什么类型的索引都需要仔细琢磨。
使用存储过程代替直接操作
存储过程只编译一次,所以当有操作过程复杂而且调用频率高的业务,可以使用存储过程代替直接操作。
1.4.3 分离活跃数据
通过将不活跃数据分离,减小活跃数据的数据量,可以明显提高查询效率。
1.4.4 批量读取和延迟修改
批量读取和延迟修改都是通过减少操作次数来提高效率。
批量读取是将多次查询合并到一次中进行。可以将一个请求的多次查询进行合并,也可以将一定时间范围内的多个请求的多次查询合并到一起统一查询一次数据库。
延迟修改主要是针对高并发而且频繁修改的数据。可能引起缓存和数据库的数据不一致,所以重要的数据需要做特殊处理。
1.4.5 读写分离
读写分离本质上是对数据库进行集群,将写入库作为主库,读库作为从库,关键问题是数据同步问题。
1.4.6 分布式数据库
分布式是对一个请求的并行处理,将不同表放到不同的数据库服务器上,如果需要则可以让多台服务器同时处理,从而提高处理速度。
1.4.7 NoSQL和Hadoop
NoSQL通过多个块存储数据的特点,其操作大数据的速度也非常快。
Hadoop是将同一个表中的数据分成多块保存到多个节点(分布式),而且每一块数据都有多个节点保存(集群),保证了效率和数据完整性。
1.5 高并发的解决方案
1.5.1 应用和静态资源分离
静态资源因为没有状态,所以分离简单,一般会使用专门的域名去访问。
1.5.2 页面缓存
页面缓存是将应用生成的页面缓存起来,这样就不需要每次都重新生成页面,节省CPU资源。页面缓存的默认失效机制一般是按缓存时间处理的,也可以手动让相应的缓存失效。
使用页面缓存和AJAX可以兼顾效率和动态数据实时刷新。
1.5.3 集群与分布式
集群式每台服务器都有相同的功能,处理请求时调用哪台服务器都可以,主要起分流的作用;分布式是将不同的业务放到不同的服务器中,处理一个请求需要用到多台服务器,这样可以提高一个请求的处理速度。
集群两中类型:静态资源集群和应用程序集群。问题主要是session共享。
1.5.4 反向代理
反向代理是指客户直接访问的服务器并不真正提供服务,它从其他服务器获取资源后将结果返回给用户。
三个作用:
1、可以作为前端服务器跟实际处理请求的服务器集成
2、可以用作负载均衡
3、转发请求。
1.5.5 CDN
CDN的服务器是分布在全国各地的,当接收到请求后会将请求分配到最合适的CDN服务器节点获取数据。
CDN分配请求的方式比较特殊,使用专门的CDN域名解析服务器在解析的是候就分配好的,一般是在IPS那里使用CNAME将域名解析到一个特定域名,然后再将解析到的那个域名用专门的CDN服务器解析到相应的CDN节点。
1.6 底层的优化
优化网络传输i协议,比如Google的quic、Spdy等,还有HTTP/2。