问题网址: https://blog.csdn.net/qq_37939251/article/details/83155576
一面:
1 微服务的架构介绍,微服务与SOA的区别
微服务就是一个轻量级的服务治理方案,代表技术:SpringCloud,dubbo等等;
SOA(Service oriented Architecture)面向服务架构
分层架构(MVC)
面向服务架构(SOA)
3.微服务特点
(1)系统是有多个服务构成(服务组件化)
(2)每个服务可以单独独立部署(去中心化)
(3)每个服务之间是松耦合的。服务内部是高内聚的,外部是低耦合的,也是比较符合软件设计原则的,高内聚就是每个服务内部的关系是非常密切的,每个服务之间只关注完成一个功能。(去中心化, 基础设施自动化:自动化部署等)
两者区别: https://blog.csdn.net/zpoison/article/details/80729052
SOA 以 mule 为例,架构如图:
2 分布式事务处理
网址:https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html
一、两阶段提交(2PC)
二、补偿事务(TCC)
三、本地消息表(异步确保)
四、MQ 事务消息
3 spring特性,ioc,aop原理及实现。
spring特性:ioc和aop;
ioc原理:https://www.cnblogs.com/superjt/p/4311577.html
工厂模式代码:https://blog.csdn.net/weixin_35985385/article/details/81430545
工厂模式与ioc区别: 完全解耦合,ioc服务之间的依赖通过容器控制,具体通过反射实现:https://blog.csdn.net/H12KJGJ/article/details/73614258
4 java concurrent包下的的东西,和其中的实现,concurrentHashMap原理和ThreadPoolExcutor原理。
java concurrent包下的的东西,前面的文章写过了;主要是JUC锁:包括独占锁,共享锁;公平锁,非公平锁的实现。
具体实现由 重入锁,读写锁;信号量,barrier(完整具体单词记不住,实现共享锁的几个具体实现)等
另外还有几个阻塞队列, fork/join任务分解框架; condition的signal,await; park,unpark 来替代线程的wait和sleep。
concurrentHashMap:前面写过:底层 数组+链表, 链表大于8,启用红黑树; 1.8前使用分段锁;1.8 使用volatile+CAS实现并发。
ThreadPoolExcutor原理:前面写过:主要是构造方法 以及 一个请求进来,核心线程,队列,普通线程以及饱和策略的处理。
5 linux常用命令,如何查看日志。
见 https://www.cnblogs.com/gaojun/p/3359355.html
6 项目用到了spring cloud什么组件,分别作用是什么,原理是什么。
7 java反射原理
https://www.cnblogs.com/hongxinlaoking/p/4684652.html
1 首先明确概念:一切皆对象--类也是对象
2 然后知道 类的内容: modifier,constructor, field,method
3 其次明白加载,Animal.class 在硬盘上 是一个文件; 加载到内存中,可以认为是一个对象,是java.lang.class对象。
运行实例时产生的对象 与 类的对象的区别是 : 有些构造函数的入参 在 类的对象中 是没有确定的。
8 hashmap原理
hashmap原理:前面介绍过
9 手写生产者消费者代码。
代码见:https://blog.csdn.net/qq_27603235/article/details/73744768
主要定义商品类, 然后再定义两个类: 生产者和消费者,都实现Runnable接口。 然后将阻塞队列BlockingQueue作为 生产者和消费者的成员变量,添加到 生产者和消费者 的构造函数中。 这样的话,如果阻塞队列BlockingQueue的长度为10,那么该队列如果达到10的长度,还有生产者想往里 加数据,就会一直阻塞等待;直到有消费者消费了队列数据, 队列数据的长度小于10之后,生产才能继续往 队列里生产数据。 消费者也一样,如果队列里没有数据可消费,消费线程就阻塞一直等待,直到有数据生产到队列中。
阻塞轮询队列比较消耗性能,此时可以定义两个condition状态 produceCondition,consumeCondition; 当生产者发现队列已满时,produceCondition.await;然后等待消费者消费了数据之后,使用produceCondition.signal 唤醒生产者。consumeCondition用法也一样。
10 使用concurrent包下的来实现生产者消费者。
二面:
1 memcached扩容/memcached原理/路由算法/为什么要分为多个slab
这个有点老的,不管。
2 ArrayList和LinkedList/一亿个int要用哪种
一个底层是数组,一个底层是链表。
3 长连接问题,连接过程网络断开怎么办,在客户端和服务端分别需要做什么处理(面试官提示心跳包,无奈还是不了解)
长连接的处理方式是:
Server端收到Client端发来的信息之后,开始心跳计时,在设定时间内如果收到Client发来的消息,则重置计时器,否则计时结束断开连接。
Client端,处理方式是:用time.NewTicker创建一个定时器,每间隔一秒发送下当前时间到服务器。
4 spring事务,spring事务实现原理。抛出异常之后回滚情况。启动的线程中出现异常会如何处理。
参考:https://www.cnblogs.com/yixianyixian/p/8372832.html
spring事务:acid ; 传播行为:propagation behavior ; 隔离级别:4个 ; 引起的问题:脏读, 幻读, 不可重复读。
抛出异常之后的回滚情况,可以指定回滚规则:哪些异常需要回滚;哪些异常不需要回滚。
事务超时 当做一种异常来处理:需要回滚事务。
在加有事务的类中启用线程,线程不会重新开启新的事务而是与当前类共用事务。事务的提交也是一起进行。
如果线程需要单独控制自己的事务,那么加上 propgation 的 REQUIRED_NEW 标记。
https://blog.csdn.net/kongkongyanan/article/details/81703415
5 分布式事务处理和实现。
前面已经说过
6 手写线程安全的单例模式
https://www.cnblogs.com/xudong-bupt/p/3433643.html
https://www.cnblogs.com/lixuwu/p/5676143.html
synchronized 在锁 实例 和 XXX.class 的区别:
- 一个锁的是类对象,一个锁的是实例对象。
- 若类对象被lock,则类对象的所有同步方法全被lock;
- 若实例对象被lock,则该实例对象的所有同步方法全被lock
参考: https://www.cnblogs.com/lixuwu/p/5676143.html
其实这两种锁机制都是实例锁,出现时间相差的原因是,
synchronized(this){}可以在方法内部部分加锁,同步机制更加灵活,可以设置不需要加锁的部分,故而效率会高些;
synchronized methods(){} 控制的是整个方法体,所以方法里面的所有内容都会参与加锁。
对比说明同步代码块比同步方法效率更高。
7 查看错误日志,怎么错误排查,顺序是怎样的。
常见设计模式代码:手写几个, 包括单例, 工厂等 。