小Hub领读:
这是小Hub之前录制的视频,在这里还没发过,想看的同学可以去看看哈。
希望对你们有帮助。
前后端分离博客项目已经录制了一大半了,还差一点点,应该明后天就可以和大家见面了哈。
关注我的B站:MarkerHub,一起学习技术。
目录
网站发展历程
用思维导图学习java真的是一个不错的方式!今天,我们用导图的方式来梳理一下一个网站从0到1流量逐渐增加的过程中会涉及到的技术与知识体系。
讲讲一个网站在用户量越来越多,并发越来越高的情况下,它的架构是如何演变的呢?接下来,我们会用九个阶段来一一分析各个阶段发展的过程会涉及到的技术要点。
java入门
首先,不管怎么样,要搞一个网站,必须具备Java基础知识吧。在java基础里面,数据结构中的数组、链表、队列、栈的特点和使用场景要熟悉。线程、反射也是比较基础的东西,面试常问。在设计模式里面,我觉得还不用很特意去学习,很多容易忘记,很多时候我们的业务主要学会封装,那么代码管理起来就不叫简单的了,常用的模式:单例、工厂、代理、观察者、模板、策略这几个可以先熟悉一下。web方面的知识,http/tcp的四层需要了解,对于servlet、filter、listener都是web基础,session与cookie关系一定要弄懂。
框架基础
spring、mybatis是java程序员必备框架基础。spring的ioc、aop是核心概念,要对bean容器,利用aop自定义注解要熟悉运用。springmvc是现在使用最广泛的mvc框架。对应mvc的各大组件之间的关系和流程一定要熟悉,还有配置多数据源等。
SpringMVC流程
-
1、用户发送请求至前端控制器DispatcherServlet。
-
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
-
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
-
4、DispatcherServlet调用HandlerAdapter处理器适配器。
-
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
-
6、Controller执行完成返回ModelAndView。
-
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
-
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
-
9、ViewReslover解析后返回具体View。
-
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
-
11、DispatcherServlet响应用户。
mybatis是现在主流的数据层框架,当然现在spring data jpa也有崛起的趋势,mybatis源码相对比较简单,可以去通读一遍。
springboot更是现在热门的框架,spring给我们整合一整套行业解决方案,很多都是基于springboot,比如springcloud等。集成起来特别方便。对于springboot,我们要了解和熟悉怎么去装配第三方模块的,怎么去自定义一个模块starter,怎么做到自启动加载等。
阶段一:单体项目
第一阶段,搭建单体项目。这阶段应该也算是java基础了,很多都是现在企业通用的框架组合,比如spring+mybatis,接口文档swagger2,实体验证hibernate validator,搜索引擎lucene等等。然后部署环境centos7、代码管理git、持续部署git。
emmm~不熟悉的同学要多学习一下啦,基本的东西~
阶段二:物理分离应用和数据库
物理上将应用服务器与数据库进行分离,这样cpu、内存等压力就没这么大。
阶段三:缓存化、静态化
这里有一些通用的模板静态化基础,比如freemaker或者velocity等模板引擎的,现在很多代码生成的框架其实原理就是使用模板静态化的技术,定义好模板之后再传参渲染,就生成了想要的代码。
这里nginx适合作为我们的静态文件服务器,后面的动静分离就是使用了nginx。
阶段四:应用负载均衡,集群
nginx可以作为反向代理服务器,所以可以作为我们的负载均衡工具,这里还涉及到负载均衡的策略,比如轮询,权重等,需要弄懂。一般来说,nginx是主流,其他apache用得都比较少了。nginx还有一些上线技巧,比如蓝绿部署、灰度部署等。
-
蓝绿部署
一种可以保证系统在不间断提供服务的情况下上线的部署方式
-
灰度发布
指在黑与白之间,能够平滑过渡的一种发布方式
负载均衡(Load Balance) 其意思就是分摊到多个操作单元上进行执行,例如Web 服务器 、 FTP服务器 、 企业 关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
应用服务器负载均衡之后需要解决的第一个问题就是会话同步(session),常用的框架就是spring session、shiro-redis等。以及缓存中间的选用上,一般不用ehcache,选用redis较多。
当然,因为用到了nginx作为反向代理工具,所有nginx需要做高可用配置,常见是keepalived+nginx组合。
阶段五:动静分离
常说的动静分离解决方案一般都是把静态文件部署到nginx等文件服务器中,减少应用服务器的请求压力,这里还有个CDN的概念,大家要了解一下流程是怎么样的,毕竟现在常说cdn、cdn、cdn啥的,不懂就插不上嘴呀~
一般我们存储静态东西都喜欢使用云存储,所有七牛云,cos等云存储我们就经常使用到了。当然了,nginx也是动静分离的主要工具,因为一些css、js等文件一般放在nginx下。
阶段六:分布式缓存、缓存集群
这一阶段主要还是把缓存用到极致,重复利用redis的五大数据结构的优势去调整我们的数据显示,另外设计到的缓存问题比如缓存穿透、缓存雪崩、缓存击穿等概念要熟悉,还有解决方案。以及搭建redis的主从集群、哨兵等机制保证redis的高可用。
当然了,运用了缓存之后,有个比较重点的问题也诞生了,就是如何保证缓存与数据库的数据保存一致!
阶段七:读写分离、分库分表
阶段七中主要还是集中读写分离、分库分表,围绕着不同数据库之间的相互协调工作。
读写分离
读写分离也可以有很多种方式,当然了,最常见的还是使用继承AbstractRoutingDataSource,重写determineTargetDataSource()方法。还有其他方式吗?给大家科普一下,可以针对spring、mybatis展开:
spring
1、通过扫描包区分不同数据源
@MapperScan注解扫描不同的包,该包下的所有mapper使用同一数据源,主要是sqlSessionTemplateRef属性 可以看下这篇文章:https://www.cnblogs.com/kangoroo/p/7133543.html
2、通过注解区分
通过继承AbstractRoutingDataSource,重写determineTargetDataSource()指定数据源的方法。最常用手段,必须懂!实例:renren-fast开源项目
mybatis
1、拦截发起操作的方法名
需要自己约定增删改查的前缀,然后根据前缀选择数据源!
2、拦截发起操作的sql
通过拦截mysql的执行方法获取sql,通过sql来判断读写 实例:https://github.com/shawntime/shawn-rwdb
分库分表
mycat: 基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 伪装成一个 MySQL 数据库
shareding-jdbc: 基于 JDBC 接口的扩展,是以 jar 包的形式提供轻量级服务的
这里面就衍生处理很多问题,同时也诞生了很多解决方案,比如分布式事务,分布式锁等
-
分布式事务CAP定理
-
一致性(Consistency) :客户端知道一系列的操作都会同时发生(生效)
-
可用性(Availability) :每个操作都必须以可预期的响应结束
-
分区容错性(Partition tolerance) :即使出现单个组件无法可用,操作依然可以完成
-
分布式事务BASE定理
-
Basically Available(基本可用)
-
Soft state(软状态)
-
Eventually consistent(最终一致性)
无法做到强一致,但每个应用都可以根据自身的业务特点
采用适当的方式来使系统达到最终一致性
-
分布式锁
-
redis锁
-
redis+lua
-
redisson
-
-
zookeeper锁
-
-
分布式唯一主键ID
-
UUID
-
redis自增ID
-
阶段八:微服务架构
现在rpc的解决方案主要有两个体系
-
阿里体系dubbo+zookeeper
-
spring体系springcloud
在springcloud中常用的组件之间的整合关系已经解决的对应的问题需要去熟悉和学会综合运用
-
注册中心Eureka
-
客户端负载均衡Ribbon
-
声明式Rest调用Feign
-
容错处理Hystrix
-
服务网关Zuul
-
统一管理配置Config
-
服务跟踪Sleuth+zipkin
还有服务拆分之后带来的一系列问题,比如为了达到高可用而需要解决的降级、超时重试、限流等。为了高并发而引入的消息队列、缓存、异步并发等技术都需要了解。
阶段九:NoSql与分布式搜索引擎
这里的一个重点就是我们的分布式搜索引擎了,在前面我们聊过lucene,而es、solr的底层其实都是lucene。所以我们对lucene的底层实现原理要熟悉(倒排索引),还要分词等概念。同时在es与数据库之间的数据同步问题,我们可以使用三种解决方案
-
基于cannal实现同步
-
基于消息队列实现同步
-
基于logstash实现同步
同时,不管es,还是mongo,这些nosql数据存储,都会有分片的概念,需要了解其高可用以及备份等原理。
B站视频讲解
目前,已经录制了视频(共150分钟左右),讲解这九大阶段中会涉及到的内容,并做了一些较详细的分析,感兴趣的同学可以去去B站看下,来个点赞、弹幕、收藏三连发哈!感谢支持
链接:https://www.bilibili.com/video/av80313108
(用app或者pc端打开才高清!)
结束语
好了,今天粗粗总结了一下内容,只需要有个概念,每个阶段涉及到的要点都是非常多的,大家可以针对某个点进入深入学习哈。我是吕一明,感谢阅读,欢迎来B站一起弹幕学习哈!
⚠️注意 ~
💯本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问❓可以在评论区留言💬或私信留言💬,尽我最大能力🏃♀️帮大家解决👨🏫!
如果我的文章有帮助到您,欢迎打赏✔️鼓励博主🏃,您的鼓励是我分享的动力🏃🏃🏃~