学习网站发展历程九大阶段,看小白如何一招逆袭成大神!!!
suiw9 2024-11-13 14:45 24 浏览 0 评论
网站发展历程
用思维导图学习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数据存储,都会有分片的概念,需要了解其高可用以及备份等原理。
原创 吕一明
相关推荐
- 5款Syslog集中系统日志常用工具对比推荐
-
一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
-
简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
-
NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
-
一、什么场景使用MongoDB?...
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
-
作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
-
前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...
- solidworks使用心得,纯干货!建议大家收藏
-
SolidWorks常见问题...
- 统一规约-关乎数字化的真正实现(规范统一性)
-
尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...
- Elasticsearch节点角色配置详解(Node)
-
本篇文章将介绍如下内容:节点角色简介...
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
-
作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...
- 比任何人都光彩照人的假期!水润、紧致的肌肤护理程序
-
图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...
- Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型
-
中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...
- 柔性——面向大规模定制生产的数字化实现的基本特征
-
大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...
- 创建PLC内部标准——企业前进的道路
-
作者:FrankBurger...
- 标准化编程之 ----------- 西门子LPMLV30测试总结
-
PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 5款Syslog集中系统日志常用工具对比推荐
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
- solidworks使用心得,纯干货!建议大家收藏
- 统一规约-关乎数字化的真正实现(规范统一性)
- Elasticsearch节点角色配置详解(Node)
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)