知识点总结
这段时间,对日常开发中用到的技术做了体系化的总结,包括Java基础、并发、JVM、集合,常用的开发框架Spring、Spring MVC、Mybatis、Dubbo、MySql、ElasticSearch、Kafka、Redis、Netty、Zookeeper,也大概梳理了一些Spring Cloud,但由于Spring Cloud以及很久没在实际项目中应用,所以只是对各个组件的作用和使用方式进行了梳理,下一步主要梳理做过的项目、数据结构和算法以及曾经在项目中用到的一些大数据处理框架。
在这一阶段的梳理中,主要对日常用到的开发框架从使用和原理两方面进行总结,一部分还再次阅读了源码,比如Spring、Mybatis、Dubbo,Netty的源码也看了一些,对于面试的知识点,以往多数时候都是在面试前进行突击,很多东西都没有很好的理解,这一次,核心目标就是通过大量的练习来尽量洞见这些技术框架的本质,那种知其然不知其所以然的感觉实在是太糟糕了。
在Java基础中,比较基础的内容包括集合和IO,比较难的是Jvm和并发这两块的内容(jdk8的新特性也蛮重要的,但是一直没有细看),jvm中主要包括了
- 类加载机制
- jvm内存区域的划分
- 一些对象分配策略
- 垃圾收集算法
- 垃圾对象标记算法
- 常用的垃圾收集器及其特点
- 常见的jvm参数以及jvm监控与分析工具
- jvm常见的优化策略
在java并发这部分中,主要包含了
- 多线程带来的好处和问题
- Java内存模型;
- synchronized原理;
- AQS 原理;
- AQS的阻塞模式、超时模式、共享模式的实现原理;
- 一些常见的JUC组件,如ReentrantLock,ReadWriteLock、CountdownLatch、CyclicBarrier、Semaphore等的实现原理;
- Fork/Join框架,Future、FutureTask等异步工机;
- 线程池原理;
对于集合主要是要掌握几种常见的集合类型的原理和区别,以及使用场景,集合主要分为三类,分别是Map、Set和List
常见的List实现,ArrayList、LinkedList、Vector;
常见的Set实现,HashSet、TreeSet、LinkedHashSet;
常见的Map实现,HashMap、LinkedHashMap、TreeMap;
ArrayList和LinkedList的区别及各自的使用场景;
ArrayList和Vector的区别;
各种Map和Set的原理;
HashMap中的初始容量、加载因子、存储结构、扩容、并发造成死循环、jdk1.8以后的优化以及容量为何为2的整数次幂等等问题,都是面试互怼的点;
Spring这块的知识主要涉及应用以及原理,在应用上,由于目前SpringBoot以及称为了主流,所以个人感觉并没有那么重要,但对于理解原理还是挺有帮助的,在原理层面主要了解IoC容器的几个核心原理的实现就行:
- IoC容器的启动流程;
- 默认的IoC容器;
- 依赖注入的过程;
- 如何用三级缓存解决循环依赖问题;
- Bean对象的生命周期;
- Aop的实现原理;
- 声明式事务的实现原理;
掌握了上面这些内容,可以说spring的最核心原理也就算掌握了,至于其他的,我个人认为等到用的时候再去看吧,因为Java相关的知识点实在太多了,如果不抓住重点,很容易迷失,这阶段我也一直在提醒自己把握好方向不要迷失。
Spring MVC是基于Spring 构建的一个web层框架,相比于传统的Servlet,它提供了更丰富的功能,相比于struts,它更轻量级而且能够与spring无缝整合,了解springmvc,我觉得可以从以下几个方便去看:
- spring mvc中的核心组件及运转流程;
- spring mvc如何与server进行整合的;
- spring 3.0的几个新特性;
- 其他的就是一些使用上的问题了,比如拦截器、异常处理器、对静态资源的处理、场景的注解的使用,父子容器等问题;
对于Mybatis,我个人觉得是一个非常好的用于学习设计模式的框架,Mybatis本身是一个非常轻量级的orm框架,比Spring要轻很多,但是它内部大量的应用了设计模式,例如工厂模式、建造者模式、责任链模式、装饰模式、代理模式等等,同时,它的模块与模式之间的耦合也很低,每个模块都有各自的职责,分工明确,在了解mybatis的时候,可以从两个方面入手,一个是他的基础支持层,一个是sql的执行流程:
- 数据源模块的实现原理;
- 事务管理模块的实现原理;
- 缓存模块的实现原理;
- 日志模块的实现原理;
- SqlSessionFactory/SqlSession/Configuration
- Executor/ParameterHandler/ResultHandler/TypeHandler/Interceptor/SqlBound等组件的作用
- 与Spring的集成原理;
了解了这些mybatis也就差不多了,下面再来说说netty,本人对netty并没有开发经验,了解netty的原因主要有两个,一个是大家都说netty非常优秀,第二是因为看到很多分布式服务底层的通信模块都使用了netty,比如dubbo、hadoop等,所以想看看netty到底好在哪里,就目前我对netty的了解,可以从以下几个方面来看:
- 常见的IO模型;
- Java NIO的一些基本概念和原理;
- epoll和零拷贝是啥东西;
- reactor模型及其与netty的关系;
- netty的特点,到底好在哪里;
- 半包/粘包问题是如何产生的以及如何解决;
- 什么是序列化以及场景的序列化框架有哪些;
- Netty中的核心组件以及核心运行原理;
如果不是做二次开发,了解其核心原理就足够了吧。
对于Dubbo,由于近期在项目中使用的比较多,所以对于他的使用比较熟悉,另外对于核心模块的原理也需要了解一下,一方面面试经常会问,另外就是了解了原理以后对于应用和排查问题都很用帮助,同时还能从中学习它的设计方式,我觉得dubbo主要需要了解以下内容:
- 系统架构的演进流程,单体架构、SOA架构、微服务架构等;
- dubbo的整体架构,横向微内核架构,纵向封层架构;
- dubbo中设计到的觉得,consumer、producer、monitor和注册中心;
- 关闭启动时依赖检车、服务分组、多版本控制;
- 声明式缓存、隐式参数传递、繁华调用、异步调用的使用方式;
- mock服务降级机制的使用;
- Java SPI与Dubbo SPI的对比;
- Dubbo SPI中IoC和Aop的原理,以及dubbo SPI基于URL的自适应机制的实现原理;
- 服务导出和服务应用的原理;
- 关于优雅停机的原理;
- 远程调用的过程;
- 与集群容错相关的比如容错策略、负载均衡策略、重试策略、限流等等;
- dubbo中过滤器的作用,以及原理(dubbo的很多功能都是用过滤器实现的);
了解到这里也就差不多了,没必要把自己逼死,😝
下面再来说说mysql,对于我们开发同学来说,mysql是一定要懂的,而且要懂一些原理,因为这对sql优化及排查问题都很有帮助,在了解mysql的时候,可以从以下几个方面去了解:
- mysql的逻辑架构;
- sql语句的执行流程;
- mysql中涉及到的锁;
- 常见的存储引擎及特点;
- 索引的存储结构;
- 主键索引和二级索引,回表,索引覆盖;
- 索引的最左前缀匹配及索引下推;
- 事务的特性及并发下事务存在的问题;
- mysql中事务的隔离级别;
- MVCC机制与事务隔离级别的实现原理;
- 常见的sql优化方式;
- explain中设计的关键字段的含义及如何根据执行计划优化sql语句;
- mysql中涉及到的log机器作用;
- 两阶段提交;
以上都是在单体应用架构下设计到的框架和服务,下面就来带了分布式模块,分布式,听起来牛逼轰轰,但是所有的分布式服务和分布式服务开发框架的一个主线就是分而治之,再次基础上衍生出了主从、分片、CAP/Base理论,细细想来,都是大同小异而已。
首先说redis,redis是目前最流程的分布式nosql缓存数据库,了解redis可以从以下几个方面入手:
- redis的特点;
- redis提供的数据类型及这些数据类型的常见使用场景;
- redis的集群策略;
- redis的持久化策略;
- redis在使用中需要注意的问题,这个可以参考阿里云的redis开发规范。
- redis的一些高级特性,例如事务、pub/sub、整合lua脚本等等;
了解了这些,基本上就可以满足日常的开发和排查任务了。
再来说kafka,首先kafka是消息队列的一种,它天生的存在丢消息的特点和高吞吐了决定了它只能被用在一些对数据可靠性要求不高的场景,最常见大数据日志处理中,在日常应用中,kafka集群通常都是由运维同学管理,为开发通信提供高可用服务,所以我觉得如果没有深度定制的需求,那么了解kafka的基本使用方式和原理就可以了,可以从以下几个方面入手
- 消息队列的作用;
- kafka中设计的核心概念;
- kafka的分区和副本机制;
- kafka的存储原理;
- kafka的HW截断机制(会导致丢消息);
- kafka的Java api的使用(其实到用的时候百度就行了,真心记不住);
了解了以上几个方面也就差不多了,与kafka相比,RocketMQ也是一个经常被用到的消息队列,它提供了事务支持和零消息丢失的保证,在对消息可靠性要求高的场景以及分布式事务中被广泛的应用。
最后来说说ElasticSearch,ES应该是目前在全文检索领域应用最广泛的搜索框架了,本人对ES也没有过比较深入的使用经验,主要以查询数据为主,从我的角度看,了解ES的话可以从以下几个方面入手:
- es与其他搜索框架(lucen、solr)相比的优势有哪些
- es的特点
- es中提供的数据类型
- setting和mapping的作用
- 分词及倒排索引原理;
- 索引库中索引的存储结构;
- 分片和副本机制,主分片和副本分片的一些特点;
- es集群中的节点类型及作用;
- es对于在集群环境下的数据写一致性问题的处理策略;
- 在部署es集群时如何进行分片树和副本数的设置
- 如何根据实际场景来评估锁需要的es集群的规模
在来看看zookeeper,对于一名业务开发来说,真的是没有太多的时间去看zookeeper的源码,对于zookeeper来说,日常开发都很少涉及,主要是在学习一些分布式服务的时候回涉及到,对于zk,我个人的了解包含一下几个方面:
- zookeeper的应用场景;
- paxos算法与zab原子广播协议;
- zookeeper中的节点类型;
- zookeeper中的watcher机制;
- leader选举的大致流程;
- znode的状态和类型;
- 数据读取流程;
- 数据写入流程;
也就这这些了,我累了,我不想再继续了解了,对我来说那没什么用。。。
还有设计模式,对设计模式的学习最好的方法就是阅读源码,因为很多优秀的开源框架中都大量使用了设计模式来优化代码结构:
- 面向对象设计的六大原则;
- 创建型设计模式有哪些,分别解决了什么问题,实际应用场景有哪些
- 结构型设计模式有哪些,分别解决了什么问题,实际应用场景有哪些
- 行为型设计模式有哪些,分别解决了什么问题,实际应用场景有哪些