大型网站的特点
并不是网站访问量大就是大型网站,例如门户网站,只是一个静态页面,网站和用户的交互是单向的。像京东,淘宝这种就属于典型的大型网站。
大型网站的特点:
- 高并发,流量大
- 高可用
- 大数据
- 敏捷开发,迭代快
- 用户体系庞大
- 可持续升级
- 安全防范
- 弹性扩展
- 吞吐量高,响应速度快
大型网站的设计宗旨
- 合久必分
- 集群
- CDN
- 分布式系统
- 异步
- 业务分离
- 数据备份
大型网站架构的演变历程
1. 初始阶段的网站架构
大型网站都是从小型网站发展起来的,网站架构也是一样,网站刚开始搭建处于雏形阶段,访问量小,一台服务器完全够用,也是大部分企业级应用的选择。
应用程序,数据库,文件都部署在一台服务器的,通常服务器选用Linux,应用程序选用PHP,然后部署在Apache 上,数据库使用MySQL,汇集各种开源软件以及一架廉价的服务器就可以进行开发
2. 应用服务和数据分离
随着业务的发展,一台服务器不能满足业务需求:越来越多的用户访问导致性能越来越差,越来越多的数据导致服务器存储空间不足,这就需要将应用和数据分离。应用和数据分离后整个网站使用三台服务器,应用服务器,文件服务器,数据库服务器

应用和数据分离后,不同特性的服务器承担不同的服务角色,网站的并发处理能力和数据存储都得到了很大的改善,支持业务的进一步发展。但是随着业务的增多,访问量增大,网站又一次面临挑战,数据库压力太多导致访问延迟,进而影响整个网站的性能,用户体验收到影响
3. 使用缓存改善网站性能
网站访问特点和现实世界的财富分配通常符合二八定律: 80%的业务访问集中在20% 的数据上,淘宝买家浏览的商品集中在少部分成交数多、评价良好的商品上;百度搜索的关键词集中在少部分热门词汇上,搜索出来的词条你也会浏览前两页的内容。
既然大部分的浏览都只会放在一小部分数据上,那么是否能把这些数据缓存起来放在内存中,是不是就可以减少数据库的压力,从而提高整个网站的数据访问速度,改善数据库的写入性能了呢?
网站的缓存分为两种: 缓存在本地服务器上的本地缓存,缓存在远程服务器上的远程缓存,本地缓存的访问速度要比远程缓存的更快。但是受应用服务器的内存限制,往往会存在本地缓存和应用程序竞争内存的情况,这种情况在远程服务器上就不会存在,远程分布式缓存可以使用集群的方式,部署大内存的服务器使用专门的缓存服务器,理论上可以做到不受内存限制的缓存服务

使用缓存后,有效的改善了数据库访问的压力,但是单一应用程序的服务器能够处理的连接有限,在网站访问的高峰期间,应用服务器会成为网站的瓶颈
4. 使用应用服务器集群改善网站的并发处理能力
使用集群是解决高并发,海量数据问题的关键手段,当一台服务器的处理能力、存储空间不足的时候,不要尝试去更换一台存储量更大的服务器,而是考虑集群部署,因为对于大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务。

应用服务器集群部署,使用负载均衡服务器做负载控制,能够改善流量峰值对应用服务器的压力,避免单一服务器承担更多的请求压力。如果还有更多的请求,那么就在现有的基础上增加更多的应用服务器。
5. 数据库读写分离
使用缓存后,能够改善一部分的数据库访问压力,使绝大多数数据读操作访问不用通过数据库就能完成,但是仍有一部分读(缓存访问不命中,缓存过期)和全部的写操作都会直接访问数据库,在网站到达一定的规模后,也会增大数据库的压力
目前大部分主流数据库都提供主从热备功能,通过配置两台数据库搭建主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上,网站可以利用这一特性,实现数据库的读写分离的功能,从而改善数据库的压力。

应用在写数据的时候,访问主服务器,在读数据的时候,访问从服务器,主数据库通过主从复制的功能将数据同步更新到从服务器,这样当有读操作的时候,就会直接访问从服务器,当有写操作的时候,会直接访问主服务器,为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离对应用透明
6. 使用反向代理和CDN加速网站响应
随着网站规模不断扩大,用户规模越来越大,由于国内网络情况复杂,不同地区的用户访问网站时,速度差别也极大。有研究表明,网站访问延迟和用户流失率正相关,网站访问越慢,用户的流失率越快,所以为了更好的用户体验,留住用户,网站需要更快的访问速度,主要手段有使用CDN和反向代理
CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的机房获取数据;而CDN则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器缓存着资源,就会直接返回给用户

使用CDN的目的都是尽早返回数据给用户,一方面能够加快访问速度,一方面都能减轻服务器的压力
7. 使用分布式文件系统和分布式数据库系统
任何强大的单一服务器都满足不了大型网站持续增长的业务需求。数据库经过读写分离后,从一台服务器拆分成两台服务器,但是随着网站业务的发展不能满足业务的需求,需要使用分布式的存储服务器,文件系统能够也是一样,需要使用分布式文件系统。
分布式数据库是网站数据库拆分的重要手段,只有在单表数据非常庞大的时候才使用。不到不得已时,网站最常用的数据库拆分手段是业务分库。将不同业务的数据部署在不同的服务器上。

8. 使用NoSQL和搜索引擎
随着网站业务的扩大,对数据存储和检索的要求也越来越高,网站需要采用一些非关系型数据库技术如NoSQL和非数据库查询技术和搜索引擎

NoSQL和搜索引擎都是源自互联网的技术手段,对可伸缩的分布式特性具有更好的支持。应用服务器则通过一个统一数据访问模块访问各种数据。减轻应用程序管理诸多数据源的麻烦
9. 业务拆分
大型网站为了应对日益繁杂的业务场景,通过使用分而治之的方式将整个网站的业务拆分成不同的产品线,如大型购物交易网站就会将首页、商铺、订单、买家、卖家等拆分成不同的产品线,分归不同的业务部门负责管理。
具体到技术上,也会根据产品线划分产品,将一个产品拆分成不同的应用。每个应用独立部署和维护,应用之间可以通过超链接简历关系,也可以通过消息队列进行数据分发,当然最多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。

10. 分布式服务
随着业务拆分越来越小,存储系统越来越大,应用系统的整体复杂度呈指数增长,部署越来越困难。由于所有的应用都要和数据库系统连接。在数万台服务器规模的网站中,这些连接的数目是服务器规模的平方。导致存数据库连接资源不足。拒绝服务。
既然每一个应用系统都需要执行许多相同的业务操作,可以把相同的业务提取出来。由这些可服用的业务连接数据库。提供公用业务服务。

大型网站演化到这里,基本上大多数的技术问题都可以解决,诸如跨数据中心的实时数据同步和具体网站业务相关的问题都可以通过组合改进现有的技术架构来解决。
架构师所需具备的技术栈与能力
- 技术全面,有广度
- 关注前沿技术
- 全局观、预判
- 把控团队、忙而不乱
- 系统分解与模块拆分(业务分离,代码解耦)
- 指导与培训
- 沟通和协调能力
- 抽象、举例和画图
- 软技能,偏向于项目管理
单体项目
项目演示
项目地址:https://github.com/liuurick/foodie-dev
前后端技术选型
后端技术选型 SpirngBoot vs SpringMVC
- SpringMVC是框架,SpringBoot是工具
- 从配置繁琐(xml)到零配置(yml)
- SpringBoot集成了多样化中间件(*starter)
- 从外置tomcat到内置tomcat
前端技术选型
- MVVM开发模式
- JQuery,Vue.js,前端三大件
技术选型所需考虑的地方
- 切合业务
- 社区活跃度
- 团队技术水平
- 版本更新迭代周期
- 试错精神
- 安全性
- 成功案例
- 开源精神
前后端分离开发模式

前后端分离开发可以极大提高团队开发效率
项目分层设计与聚合项目
项目拆分与聚合
Maven聚合项目
构建聚合工程
1.聚合工程里可以分为顶级项目(顶级工程、父工程)与子工程,这两者的关系其实就是父子继承的关系
子工程在maven里称之为模块(module),模块之间是平级,是可以相互依赖的。
2.子模块可以使用顶级工程里所有的资源(依赖),子模块之间如果要使用资源,必须构建依赖(构建关系)
3. 一个顶级工程是可以由多个不同的子工程共同组合而成。
整合springboot
数据库设计
数据库外键
数据库外键移除原因
数据库物理外键移除不是在表设计时候对表中外键进行删除,实际表之间键的关联还是存在的,例如:user表中userId对userId关联表中地址。
- 性能影响:数据完整性执行,增删改都需要对物理外键进行操作,数据库性能是受影响的。
- 热更新:存在物理外键时候,比如有新增脚本要进行外键地匹配,需要重启服务器,不适合现在微服务部署。对于传统项目中数据库表设计是否有外键不影响。
- 降低耦合度:减少表与表之间的重复逻辑处理。
- 数据库分库分表:由于物理外键存在,在数据库表数据达到百万甚至千万级别时候,就会涉及到分库分表,此时物理外键存在就会影响数据拆分
项目整合
mybatis逆向工具
restful web service
事务传播
核心功能
- 用户注册与登录
- Cookie与Session
- Cookie:以键值对的形式存储信息在游览器
- cookie不能跨域,以前及其父级域名可以取值
- cookie可以设置有效期
- Session:基于服务器内存的缓存(非持久和),可保存请求会话
- 每个session通过sessionid来区分不同请求
- session可设置过期时间
- session也是以键值对形式存在的
- 集成Swagger2 api
- 分类设计与实现
- 首页商品推荐
- 商品搜索与分页
- 商品详情与评论渲染
- 购物车与订单
- 微信与支付宝支付


