前言
从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码、提交、合并等,更复杂的操作没有使用过,看过的教程也逐渐淡忘了,有些对不起 Linus 大神。
出来混总是要还的,前些天就遇到了 Git 里一种十分糟心的场景,并为之前没有深入理解 Git 命令付出了一下午时间的代价。
先介绍一下这种场景,我们一个项目从 N 版本升到 A 版本时引入了另一项目的 jar 包,又陆续发布了 B、C 版本,但在 C 版本后忽然发现了 A 版本引入的 jar 包有极大的性能问题,B、C 版本都是基于 A 版本发布的,要修复 jar 包性能问题,等 jar 包再发版还得几天,可此时线上又有紧急的 Bug 要修,于是就陷入了进退两难的境地。
最后决定先将代码回退到 A 版本之前,再基于旧版本修复 Bug,也就开始了五个小时的受苦之路。
一面
- 自我介绍
- 项目中的监控:那个监控指标常见的有哪些?
- 微服务涉及到的技术以及需要注意的问题有哪些?
- 注册中心你了解了哪些?
- consul 的可靠性你了解吗?
- consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过?
- 项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理
- Spring Boot除了自动配置,相比传统的 Spring 有什么其他的区别?
- Spring Cloud 有了解多少?
- Spring Bean 的生命周期
- HashMap 和 hashTable 区别?
- Object 的 hashcode 方法重写了,equals 方法要不要改?
- Hashmap 线程不安全的出现场景
- 线上服务 CPU 很高该怎么做?有哪些措施可以找到问题
- JDK 中有哪几个线程池?顺带把线程池讲了个遍
- 应尽量避免在 where 子句中使用!&#61;或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描
- SQL 索引的顺序&#xff0c;字段的顺序
- 查看 SQL 是不是使用了索引&#xff1f;&#xff08;有什么工具&#xff09;
- TCP 和 UDP 的区别&#xff1f;TCP 数据传输过程中怎么做到可靠的&#xff1f;
- 说下你知道的排序算法吧
- 查找一个数组的中位数&#xff1f;
二面
你有什么问题想问我的吗&#xff1f;&#xff08;常规问询&#xff09;
- 自我介绍、工作经历、技术栈
- 项目中你学到了什么技术&#xff1f;
- 微服务划分的粒度&#xff1f;
- 微服务的高可用怎么保证的&#xff1f;
- 负载均衡与反向代理&#xff0c;隔离&#xff0c;限流&#xff0c;降级&#xff0c;超时与重试&#xff0c;回滚&#xff0c;压力测试与应急预案
- 常用的负载均衡&#xff0c;该怎么用&#xff0c;你能说下吗&#xff1f;
&#xff08;技术问&#xff09;
- http重定向
- DNS负载均衡
- 反向代理负载均衡
- IP负载均衡(LVS-NAT)
- 直接路由(LVS-DR)
- IP隧道(LVS-TUN)
- 网关能够为后端服务带来哪些好处&#xff1f;
- Spring Bean 的生命周期
- xml 中配置的 init、destroy 方法怎么可以做到调用具体的方法&#xff1f;反射的机制
- Object 类中的方法
- 对象比较是否相同
- hashmap put 方法存放的时候怎么判断是否是重复的
- Object toString 方法常用的地方&#xff0c;为什么要重写该方法
- Set 和 List 区别&#xff1f;
- ArrayList 和 LinkedList 区别
- 如果存取相同的数据&#xff0c;ArrayList 和 LinkedList 谁占用空间更大&#xff1f;
- Set 存的顺序是有序的吗&#xff1f;
- 常见 Set 的实现有哪些&#xff1f;
- TreeSet 对存入对数据有什么要求呢&#xff1f;
- HashSet 的底层实现呢&#xff1f;
- TreeSet 底层源码有看过吗&#xff1f;
- HashSet 是不是线程安全的&#xff1f;为什么不是线程安全的&#xff1f;
- Java 中有哪些线程安全的 Map&#xff1f;
- HashTable 你了解过吗&#xff1f;
- 如何保证线程安全问题&#xff1f;
- synchronized、lock
- volatile 的原子性问题&#xff1f;为什么 i&#43;&#43; 这种不支持原子性&#xff1f;从计算机原理的设计来讲下不能保证原子性的原因happens before 原理
- cas 操作
- lock 和 synchronized 的区别&#xff1f;
- 公平锁和非公平锁
- Java 读写锁
- 读写锁设计主要解决什么问题&#xff1f;
- 你项目除了写 Java 代码&#xff0c;还有前端代码&#xff0c;那你知道前端有哪些框架吗&#xff1f;
- MySQL 分页查询语句
- MySQL 事务特性和隔离级别
二、事务的并发问题
- 不可重复读会出现在什么场景&#xff1f;
- sql having 的使用场景
- 前端浏览器地址的一个 http 请求到后端整个流程是怎么样&#xff1f;
- http 默认端口&#xff0c;https 默认端口
- DNS 你知道是干嘛的吗&#xff1f;
- 你们开发用的 ide 是啥&#xff1f;你能说下 idea 的常用几个快捷键吧&#xff1f;
- 代码版本管理你们用的是啥&#xff1f;
- git rebase 和 merge 有什么区别&#xff1f;
你们公司加班多吗&#xff1f;&#xff08;题外话&#xff09;
举例回答&#xff1a;
项目用 Spring 比较多&#xff0c;有没有了解 Spring 的原理&#xff1f;AOP 和 IOC 的原理
答&#xff1a;(1). IoC&#xff08;Inversion of Control&#xff09;是指容器控制程序对象之间的关系&#xff0c;而不是传统实现中&#xff0c;由程序代码直接操控。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。 对于Spring而言&#xff0c;就是由Spring来控制对象的生命周期和对象之间的关系&#xff1b;IoC还有另外一个名字——“依赖注入&#xff08;Dependency Injection&#xff09;”。从名字上理解&#xff0c;所谓依赖注入&#xff0c;即组件之间的依赖关系由容器在运行期决定&#xff0c;即由容器动态地将某种依赖关系注入到组件之中。
(2). 在Spring的工作方式中&#xff0c;所有的类都会在spring容器中登记&#xff0c;告诉spring这是个什么东西&#xff0c;你需要什么东西&#xff0c;然后spring会在系统运行到适当的时候&#xff0c;把你要的东西主动给你&#xff0c;同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制&#xff0c;也就是说控制对象生存周期的不再是引用它的对象&#xff0c;而是spring。对于某个具体的对象而言&#xff0c;以前是它控制其他对象&#xff0c;现在是所有对象都被spring控制&#xff0c;所以这叫控制反转。
(3). 在系统运行中&#xff0c;动态的向某个对象提供它所需要的其他对象。
(4). 依赖注入的思想是通过反射机制实现的&#xff0c;在实例化一个类时&#xff0c;它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之&#xff0c;在传统的对象创建方式中&#xff0c;通常由调用者来创建被调用者的实例&#xff0c;而在Spring中创建被调用者的工作由Spring来完成&#xff0c;然后注入调用者&#xff0c;即所谓的依赖注入or控制反转。 注入方式有两种&#xff1a;依赖注入和设置注入&#xff1b; IoC的优点&#xff1a;降低了组件之间的耦合&#xff0c;降低了业务对象之间替换的复杂性&#xff0c;使之能够灵活的管理对象。
AOP&#xff08;Aspect Oriented Programming&#xff09;
(1). AOP面向方面编程基于IoC&#xff0c;是对OOP的有益补充&#xff1b;
(2). AOP利用一种称为“横切”的技术&#xff0c;剖解开封装的对象内部&#xff0c;并将那些影响了 多个类的公共行为封装到一个可重用模块&#xff0c;并将其名为“Aspect”&#xff0c;即方面。所谓“方面”&#xff0c;简单地说&#xff0c;就是将那些与业务无关&#xff0c;却为业务模块所共同调用的 逻辑或责任封装起来&#xff0c;比如日志记录&#xff0c;便于减少系统的重复代码&#xff0c;降低模块间的耦合度&#xff0c;并有利于未来的可操作性和可维护性。
(3). AOP代表的是一个横向的关 系&#xff0c;将“对象”比作一个空心的圆柱体&#xff0c;其中封装的是对象的属性和行为&#xff1b;则面向方面编程的方法&#xff0c;就是将这个圆柱体以切面形式剖开&#xff0c;选择性的提供业务逻辑。而 剖开的切面&#xff0c;也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原&#xff0c;不留痕迹&#xff0c;但完成了效果。
(4). 实现AOP的技术&#xff0c;主要分为两大类&#xff1a;一是采用动态代理技术&#xff0c;利用截取消息的方式&#xff0c;对该消息进行装饰&#xff0c;以取代原有对象行为的执行&#xff1b;二是采用静态织入的方式&#xff0c;引入特定的语法创建“方面”&#xff0c;从而使得编译器可以在编译期间织入有关“方面”的代码。
(5). Spring实现AOP&#xff1a;JDK动态代理和CGLIB代理 JDK动态代理&#xff1a;其代理对象必须是某个接口的实现&#xff0c;它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理&#xff1b;其核心的两个类是InvocationHandler和Proxy。 CGLIB代理&#xff1a;实现原理类似于JDK动态代理&#xff0c;只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包&#xff0c;底层是依靠ASM&#xff08;开源的java字节码编辑类库&#xff09;操作字节码实现的&#xff0c;性能比JDK强&#xff1b;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和&#64;AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。
(6). AOP使用场景&#xff1a;
- Authentication 权限检查
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading延迟加载
- Debugging 调试
- logging, tracing, profiling and monitoring日志记录&#xff0c;跟踪&#xff0c;优化&#xff0c;校准
- Performance optimization性能优化&#xff0c;效率检查
- Persistence 持久化
- Resource pooling资源池
- Synchronization同步
- Transactions 事务管理
另外Filter的实现和struts2的拦截器的实现都是AOP思想的体现。
蚂蚁金服面试场景以及面试答案&#xff08;文档总结&#xff09;
最后
由于文案过于长&#xff0c;在此就不一一介绍了&#xff0c;这份Java后端架构进阶笔记内容包括&#xff1a;Java集合&#xff0c;JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
本知识体系适合于所有Java程序员学习&#xff0c;关于以上目录中的知识点都有详细的讲解及介绍&#xff0c;掌握该知识点的所有内容对你会有一个质的提升&#xff0c;其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
有需要的朋友可以点击这里免费获取
对你会有一个质的提升&#xff0c;其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
有需要的朋友可以点击这里免费获取
[外链图片转存中…(img-GauHyjo9-1621479640960)]