有偿问答
面经分享
技术探讨
资料领取
登录
知乎:零基础应该从哪方面入手学习Java?
社长
1年前
⋅ 468 阅读
零基础学Java,首先得知道Java的学习的路线,盲目学习不可取!要知道自己学习到了哪个阶段,这样才知道什么时候去开始第一次Java面试,或者申请加薪跳槽等。 得明白到底Java的每个知识都是用来干嘛的,这样知道了所以知识点的作用之后,大概得明白自己能搭建一个什么样的Java系统,对自己的技术能力有个了解。 这里我介绍另外一种思路。因为我们学习Java,最终目的其实都是为了搭建一个高可用高并发的项目,可以随着流量的增大,然后调整技术架构。 所以我们才会学习到各种各样的技术内容。那么我们以一个网站从0开始搭建,到最后支持一个流量及大的平台,这过程中会涉及到多少次迭代呢?这里我梳理了网站演变的九大过程,以及知识知识体系,希望对你有帮助! 另外,为了没有基础的同学能了解通透一点,我录制了视频,可以去看看哈! > 标题:网站发展历程九大阶段,及知识体系梳理(Java) > > 视频讲解: [网站发展历程九大阶段,及知识体系梳理(Java) ](https://www.bilibili.com/video/av80313108) > 可以关注我的公众号:MarkerHub,给我留言提问哈。 网站发展历程 ------ 用思维导图学习 java 真的是一个不错的方式!今天,我们用导图的方式来梳理一下一个网站从 0 到 1 流量逐渐增加的过程中会涉及到的技术与知识体系。 讲讲一个网站在用户量越来越多,并发越来越高的情况下,它的架构是如何演变的呢?接下来,我们会用九个阶段来一一分析各个阶段发展的过程会涉及到的技术要点。 ### java 入门 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/ca0ca009724343559234999fdf1b545a.png?wx_fmt=png) 首先,不管怎么样,要搞一个网站,必须具备 Java 基础知识吧。在 java 基础里面,数据结构中的数组、链表、队列、栈的特点和使用场景要熟悉。线程、反射也是比较基础的东西,面试常问。在设计模式里面,我觉得还不用很特意去学习,很多容易忘记,很多时候我们的业务主要学会封装,那么代码管理起来就不叫简单的了,常用的模式:单例、工厂、代理、观察者、模板、策略这几个可以先熟悉一下。web 方面的知识,http/tcp 的四层需要了解,对于 servlet、filter、listener 都是 web 基础,session 与 cookie 关系一定要弄懂。 ### 框架基础 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/7da3011eeaf14f99abd4bc73d4cd6055.png?wx_fmt=png) spring、mybatis 是 java 程序员必备框架基础。spring 的 ioc、aop 是核心概念,要对 bean 容器,利用 aop 自定义注解要熟悉运用。springmvc 是现在使用最广泛的 mvc 框架。对应 mvc 的各大组件之间的关系和流程一定要熟悉,还有配置多数据源等。 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/c30054ef0f8348f49263e26f286771ab.png?wx_fmt=jpeg) **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,怎么做到自启动加载等。 ### 阶段一:单体项目 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/ee14686633f84015ae2489103f8dbde5.png?wx_fmt=png) 第一阶段,搭建单体项目。这阶段应该也算是 java 基础了,很多都是现在企业通用的框架组合,比如 spring+mybatis,接口文档 swagger2,实体验证 hibernate validator,搜索引擎 lucene 等等。然后部署环境 centos7、代码管理 git、持续部署 git。 emmm~ 不熟悉的同学要多学习一下啦,基本的东西~ ### 阶段二:物理分离应用和数据库 物理上将应用服务器与数据库进行分离,这样 cpu、内存等压力就没这么大。 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/eac314e473e64e1e8a255a4c2c32febe.png?wx_fmt=png) ### 阶段三:缓存化、静态化 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/dcd80f2acdd945ad8448b9e1cf1015e5.png?wx_fmt=png) 这里有一些通用的模板静态化基础,比如 freemaker 或者 velocity 等模板引擎的,现在很多代码生成的框架其实原理就是使用模板静态化的技术,定义好模板之后再传参渲染,就生成了想要的代码。 这里 nginx 适合作为我们的静态文件服务器,后面的动静分离就是使用了 nginx。 ### 阶段四:应用负载均衡,集群 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/1ec0af2c656040b7aa51243387f3ab85.png?wx_fmt=png) nginx 可以作为反向代理服务器,所以可以作为我们的负载均衡工具,这里还涉及到负载均衡的策略,比如轮询,权重等,需要弄懂。一般来说,nginx 是主流,其他 apache 用得都比较少了。nginx 还有一些上线技巧,比如蓝绿部署、灰度部署等。 * 蓝绿部署 一种可以保证系统在不间断提供服务的情况下上线的部署方式 * 灰度发布 指在黑与白之间,能够平滑过渡的一种发布方式 > 负载均衡(Load Balance) 其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器 、 FTP 服务器 、 企业 关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 应用服务器负载均衡之后需要解决的第一个问题就是会话同步(session),常用的框架就是 spring session、shiro-redis 等。以及缓存中间的选用上,一般不用 ehcache,选用 redis 较多。 当然,因为用到了 nginx 作为反向代理工具,所有 nginx 需要做高可用配置,常见是 keepalived+nginx 组合。 ### 阶段五:动静分离 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/b9428e613ac343f08339eeed5c10a877.png?wx_fmt=png) 常说的动静分离解决方案一般都是把静态文件部署到 nginx 等文件服务器中,减少应用服务器的请求压力,这里还有个 CDN 的概念,大家要了解一下流程是怎么样的,毕竟现在常说 cdn、cdn、cdn 啥的,不懂就插不上嘴呀~ 一般我们存储静态东西都喜欢使用云存储,所有七牛云,cos 等云存储我们就经常使用到了。当然了,nginx 也是动静分离的主要工具,因为一些 css、js 等文件一般放在 nginx 下。 ### 阶段六:分布式缓存、缓存集群 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/f712d01d114343b8bb06918b4b229cea.png?wx_fmt=png) 这一阶段主要还是把缓存用到极致,重复利用 redis 的五大数据结构的优势去调整我们的数据显示,另外设计到的缓存问题比如缓存穿透、缓存雪崩、缓存击穿等概念要熟悉,还有解决方案。以及搭建 redis 的主从集群、哨兵等机制保证 redis 的高可用。 当然了,运用了缓存之后,有个比较重点的问题也诞生了,就是如何保证缓存与数据库的数据保存一致! ### 阶段七:读写分离、分库分表 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/9a284b54332344e98b3245eedfd5a80b.png?wx_fmt=png) 阶段七中主要还是集中读写分离、分库分表,围绕着不同数据库之间的相互协调工作。 #### 读写分离 读写分离也可以有很多种方式,当然了,最常见的还是使用继承 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 定理 1. 一致性 (Consistency) :客户端知道一系列的操作都会同时发生 (生效) 2. 可用性 (Availability) :每个操作都必须以可预期的响应结束 3. 分区容错性 (Partition tolerance) :即使出现单个组件无法可用, 操作依然可以完成 * 分布式事务 BASE 定理 1. Basically Available(基本可用) 2. Soft state(软状态) 3. Eventually consistent(最终一致性) 无法做到强一致,但每个应用都可以根据自身的业务特点 采用适当的方式来使系统达到最终一致性 * 分布式锁 * redis 锁 * redis+lua * redisson * zookeeper 锁 * 分布式唯一主键 ID * UUID * redis 自增 ID ### 阶段八:微服务架构 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/4131c4762f4e4c54a8d57d0c16a79fd2.png?wx_fmt=png) 现在 rpc 的解决方案主要有两个体系 * 阿里体系 dubbo+zookeeper * spring 体系 springcloud 在 springcloud 中常用的组件之间的整合关系已经解决的对应的问题需要去熟悉和学会综合运用 * 注册中心 Eureka * 客户端负载均衡 Ribbon * 声明式 Rest 调用 Feign * 容错处理 Hystrix * 服务网关 Zuul * 统一管理配置 Config * 服务跟踪 Sleuth+zipkin 还有服务拆分之后带来的一系列问题,比如为了达到高可用而需要解决的降级、超时重试、限流等。为了高并发而引入的消息队列、缓存、异步并发等技术都需要了解。 ### 阶段九:NoSql 与分布式搜索引擎 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/92a3ae82d3b342189f56cd0b4ec47679.png?wx_fmt=png) 这里的一个重点就是我们的分布式搜索引擎了,在前面我们聊过 lucene,而 es、solr 的底层其实都是 lucene。所以我们对 lucene 的底层实现原理要熟悉(倒排索引),还要分词等概念。同时在 es 与数据库之间的数据同步问题,我们可以使用三种解决方案 * 基于 cannal 实现同步 * 基于消息队列实现同步 * 基于 logstash 实现同步 同时,不管 es,还是 mongo,这些 nosql 数据存储,都会有分片的概念,需要了解其高可用以及备份等原理。 B 站视频讲解 ------- 目前,已经录制了视频(共 **150 分钟**左右),讲解这九大阶段中会涉及到的内容,并做了一些较详细的分析,感兴趣的同学可以去去 B 站看下,来个**点赞、弹幕、收藏**三连发哈!感谢支持 ![](//image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/20200623/fccc86a881644a20b0cf84daa6e59093.png?wx_fmt=png) 链接:[https://www.bilibili.com/video/av80313108](https://www.bilibili.com/video/av80313108) 结束语 --- 好了,今天粗粗总结了一下内容,只需要有个概念,每个阶段涉及到的要点都是非常多的,大家可以针对某个点进入深入学习哈。我是吕一明,感谢阅读,欢迎来 B 站一起弹幕学习哈! ### ps: 另外,我还录制了两个SpringBoot综合项目,一个传统项目,一个前后端分离vue项目,可以去看看哈! [【实战】基于SpringBoot+Vue开发的前后端分离博客项目完整教学](https://www.bilibili.com/video/BV1PQ4y1P7hZ) [(2020最新)Java实战项目,使用SpringBoot+Mybatis Plus+shiro+Es+Rabbitmq开发一个博客系统](https://www.bilibili.com/video/BV1ri4y1x71A)
阅读全部
全部评论:
0
条
我有话说:
@
发送
-- 目录 --
关注官方公众号:
Java问答社
接收最新有赏问答推送!
最新发布
1.
SpringBoot 接口数据加解密技巧,so easy!
2.
一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
3.
Java8 Stream 极大简化了代码,它是如何实现的?
4.
马上大四了,秋招还是春招好?先找工作还是找实习?
5.
万字详解 Linux 常用指令(值得收藏)
6.
4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
最新评论
部署文档没有了,您能提供下吗
部署文档没有了,能提供下吗
我测你的🐎
源码从哪里获取请问
想学
那篇石墨文档 没有权限查看哇