软件-互联网的发展史
大型主机优点:
集中式的计算机系统,高的稳定性和安全性。
大型主机缺点:
- 非常贵,一般的小企业用不起。
- 比较复杂,培养人才的成本比较高。
- 单点一旦故障,整个系统停转,损失非常大。
- 个人PC电脑的性能越来越高,成本也越来越低。
Web时代
c/s时代:
富客户端方案。卖软件可赚钱。qq、影音、游戏。早期流行。
Web 1. 0
特色
主要是单向信息的发布,即信息门户---> 广大浏览器客户端互联网内容是由少数编辑人员(或站长)定制的。
代表:三大门户,新浪/网易/搜狐
。新浪以新闻+广告为主,网易拓展游戏为主,搜狐延伸门户矩阵。
一般的雏型如下图,用户通过浏览器输入网址进行域名解析,然后从CDN上获得静态资源,从后台服务器获得HTML文件,这些信息拼装组成显示的网页。
Web 2.0
特色
注重用户的
交互
。每个人都是内容的供稿者。 RSS订阅扮演一个很重要的作用。
代表:博客、播客、维基、P2P下载、社区、分享服务
集群跟分布式
横向复制的集群跟纵向切分的分布式环境。
架构演进史
1. 早期雏形
特征:
应用程序主要做
静态文件读取
,返回内容给浏览器。
浏览器加载本地的若干资源 跟 浏览器解析从服务器获取到的资源是一样的!
2. 数据库开发(LAMP特长)
Linux + Apache + MySQL + PHP
特征:
应用程序主要主要读取数据表值,填充html模块。业务逻辑简单,写sql处理。
3. JavaWeb雏型
特征:
tomcat
+servlet
+jsp
+mysql
。一个war
包打天下
项目结构:ssh/ssm三层结构。
4. JavaWeb的集群发展
特征:
在3的基础上进行多个war包的复制启动 。
硬件机器的横向复制,对整个项目结构无影响。
5. JavaWeb分布式
特征:
将Service层单独分离出去,成为一个单独的项目jar。单独运行。
Web服务器通过rpc
框架,对分离出去的service进行调用。分布式是按照组件拆分
。
6. JavaWeb微服务
特征:
从业务角度,细分业务为微服务,每一个微服务是一个
完整的服务
(从http请求到返回)。在微服务内部,将需要对外提供的接口,包装成rpc接口,对外部开放。微服务按照 业务拆分
。
后端问题
后端的不断演进就会导致出现服务治理需求的出现。
- 跨系统的RPC: RMI、webservice、Http请求,
- dubbo的引入, SpringCloud
- 服务器集群的负载路由,服务的注册跟发现 ZooKeeper
- 数据量超级大时引发的
- 分库/分表,需要修改业务sql语句,有侵入型,MyCat的引入。
- 分区,对sql语句是没有侵入性的,但是对库是没办法减轻压力的。
- 单库的MySQL承载容量一般在
700W
左右。
前端发展史
1. 整页提交
特征:
浏览器请求皆为
页面级
请求,每次请求都是一次页面跳转/刷新。
2. 页面+ ajax
特征:
浏览器请求主要为页面级请求,有
局部刷新
使用ajax
刷新,页面体验更好。
3. mvvm模式
MVVM是Model-View-ViewModel
的简写。它本质上就是MVC 的改进版
特征:
- 首次请求返回页面html,后续请求皆为restful返回
json
。- 前端人员将js/css/img 资源开发完毕后 打包到apache或者nginx上,供浏览器访问
3 浏览器 访问静态资源服务器,获得HTML资源。- HTML页面JS发起·ajax·请求后台服务器,得到业务数据 然后进行渲染整个页面。跨域问题可用nginx解决。
架构思路及常见解决方案
1、缓存(list/redis/memached)
2、横向拓展(集群负载)
3、拆分高负载服务,独立为一模块
4、大表数据切片( mysql分库分区分表)
5、使用搜索中间件: solr/elasticsearch
6、全局性网站搜索跟mysql指定型搜索不一样,只能用上面的中间件搞定 like 搜索。
7、tomcat一般在500以下为好。
8、mysql单表一般700万以内。
session跨域共享
cookie、session、token 形象说,
跨域问题:
方案1:负载使用 hash(ip)
方案2:使用redis共享session
方案3: tomcat 插件实现共享
方案4: spring session 实现共享
常见解决方案
1. 缓冲方案
Redis 的引入。
一般缓存方案
1、先到缓存中查,有值直接返回
2、无值(缓存穿透
、击穿
)则调用接口或者查库,并将值补入缓存区
3、缓存区数据与db中可能不一致,使用过期时间调节
4、若缓存区数据集中在某一短时刻失效,将导致大量的缓存击穿(雪崩
)
永不过期方案
1、不设置过期时间,数据永久有效,避免雪崩
2、需要额外机制来实现数据的同步更新(参照数据同步)
2. 消息中间件
Kafka,RocketMQ,RabbitMQ,ActiveMQ
1、每个应用启动时,主动注册队列
2、后续收/发信息,只管收/发队列中数据
3、队列中数据的路由策略,
由mq管理者来配置,跟应用程序无关。类似传话筒
3. 同步异步
同步调度:
1、调度期间,主调和被调线程被同时占用。
2、被调执行完成前,主调等待。
3、程序内部的调度,则为一单线程。
异步调度:
1、主调与被调只是一次消息发送,信息到达即返回。
2、被调执行完成后,回调
一次主调方,发送结果回来。
3、程序内部的调度,则回调函数是由被调线程执行。
4. 同步转异步
同步转异步:空间换时间,JDK Future Task模式
5. 数据切片
实现集群的动态扩容,Redis/es/fastdfs,将数据按片切分:
1、切成6个片,每个片存储总量1/6数据
2、则两个库每个库分担三个片
3、若三个库,则每个库只需要承担两个片
4、路由管理,只记录数据与片柱的关系
本文使用 mdnice 排版
近期评论