总结面试中基本会问到的问题(持续补充,非标准答案)

chan 作者
阅读 13206 喜欢 3

简单总结不足

每天在总结,但一直被吊打,主要原因以下几点:

  • 面试官偏好用消息队列和缓存技术解决高并发的业务亮点,多准备这种业务(我没准备好,所以经常被问道这方面的场景),可以是抢购、订单、热门等等。前提要深入研究分析,考虑要周全,负责的功能一定清晰,最好精确到类或者表,避免出现你负责的功能却答不出的尴尬。

  • 其次是权限认证方面要熟悉,因为假设你负责的接口是抢购,那肯定要做权限这些处理的(面试官说的)。

  • 最后上家公司情况也要熟悉,不然技术过了被总监问死了就很尴尬。

业务场景相关:

问的是最多的,也是最难的,只能临场发挥,一般都是围绕你简历写的项目展开来说,面试官会针对你写的点提出一些问题以及优化方案。或者直接提出一个虚构的业务场景让你想出解决方案。以下列出其中的部分问题

多数是根据你写的项目业务进行提问


项目

  • 做一个统计报表,数据量大怎么处理?
  • 你的项目中,房源数据库表数据量多大?有没有进行一些优化?
  • 图片量大的房源,有没有对图片加载优化?加载慢怎么办?
  • 上传图片有没有做裁剪压缩优化?如果有这个需求要怎么处理?
  • A 服务调用 B 服务,B 服务调用 C 服务,其中一个服务业务处理超时,怎么做超时处理?
  • 项目中的熔断业务场景,如何配置?
  • 秒杀场景有什么设计的思路?
  • 前后端分离,接口数据如何进行约束?
  • 有没有参与架构设计?需求是怎么下发给你的?
  • 你目前项目用户量多少?用户表有多少人?最高并发多少?
  • 系统日志怎么记录?业务日志怎么记录?比如订单状态从 1 改成 2,你怎么记录这个过程的日志?
  • 你的应用一定很多图片?这么大量图片怎么处理?有设置过期时间吗?
  • 有没有用过线程池?怎么应对高并发?
  • ES 怎么配置?怎么调用?哪些业务需要调用?
  • 会不会 JVM 调优?
  • 使用过 Docker 部署项目吗?使用过 k8s 吗?

MySQL

  • 大量用户访问数据库,有索引情况下,慢查询怎么办?
  • 慢查询怎么优化?索引不命中怎么办?你会怎么优化?
  • 数据库有没有分库分表?具体怎么分?

AOP

  • 你项目中哪里用到 AOP 切面技术?
  • 它是怎么切入的?怎么定义要切人的方法?

权限

  • 项目的权限怎么处理?接口有配置权限吗?
  • 系统权限方面怎么设计?菜单权限怎么操作?菜单字符串怎么处理?
  • SpringSecurity 数据库表怎么设计的?
  • 权限角色之间的表关系?
  • Spring Security 如何集成第三方登录以及用户密码登录?

https://segmentfault.com/a/1190000014371789

常用组件

  • 必问 RabbitMQ 消息队列在你项目中的使用场景?如何配置?
  • 必问 Reids 在你项目中的使用场景?如何配置?
  • Zuul 在你的项目中的使用场景?可以作哪些配置?
  • 必问 SpringCloud 五大组件在项目中的使用场景?怎么配置?

分布式

  • 必问 项目中哪里用到分布式锁?分布式锁的业务使用场景。
  • 必问 项目中哪里用到分布式事务?分布式事务的业务使用场景。
  • 使用分布式锁效率低怎么办?

架构

  • 说说你项目架构大概是怎样的?
  • 说说这个你项目中的架构存在什么问题?如果你来搭建你会怎么优化?
  • 你写完代码后,怎么测试代码是否存在漏洞或者线程安全等问题?

职业相关:

一般问下工作之余新技术的学习途径等等。


  • 三年中写了这么多项目,有没有从中学习到什么?
  • 工作中有没了解过某些框架的底层?
  • 说说线上环境中遇到问题怎么查看 jvm 栈堆内存以及线程
  • 线上出问题一般怎么处理?解决思路。
  • 看过什么 JAVA 的书?
  • 有没有去关注最近时间的新技术?
  • 平时通过什么方式学习?获取知识的途径?
  • 平时有没有写博客的习惯?有没有看下 demo 之类的。

基础相关:

基础题,纯问技术,网上面试题说什么,就可以答什么,有一套标准答案。


  • 必问 说说 Spring IOC 和 AOP,底层结构,实现的原理。
  • AOP 的生命周期。
  • 为什么要用微服务?微服务的优点和缺点?
  • 集群和分布式的区别?两者有关系吗?
  • 常见的关系型数据库和非关系型数据及其区别

一、关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
二、非关系型数据库
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。

  • 必问 HashMap 数据结构,扩容机制。
  • Spring Security oAuth2 的认证流程

  • Spring Security 提供了多少种认证方式?

客户端模式,简单模式,密码模式,授权码模式

  • 必问 说说微服务(SpringCloud)的常用组件(Eureka、zuul、config、ribbon、hystrix)

Eureka:https://www.zqskate.com/article/92
Ribbon:https://www.zqskate.com/article/91
Hystrix:https://www.zqskate.com/article/94

  • 如何解决线程安全问题?

对方法加锁。

  • 如何保证消息投递可靠性?
  • RabbitMQ 有多少种工作模型?TTL 跟死信队列怎么交互?死信队列应用场景?

工作模型:https://www.zqskate.com/article/85
Confirm、Return 机制以及 TTL、死信队列:https://www.zqskate.com/article/86

  • JAVA 锁相关,锁的升级过程,CAS 锁的过程。

https://www.zqskate.com/article/111

  • JVM 内存布局,垃圾回收算法,垃圾回收机制。
  • 布隆过滤器原理。

https://www.zqskate.com/article/106

  • 说说 == 和 equals 的区别?String 重写的 equals 方法执行过程。

== 与 equals 的主要区别是:== 常用于比较原生类型,而 equals() 方法用于检查对象的相等性。
另一个不同的点是:如果 == 和 equals() 用于比较对象,当两个引用地址相同,== 返回 true。而 equals() 可以返回 true 或者 false 主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况 == 和 equals() 返回不同的结果。

  • 说说 SpringBoot 加载过程。
  • 类加载器以及类的加载过程。
  • 分布式锁原理,分布式事务原理。

https://www.zqskate.com/article/91

  • Linux 常用命令,怎么看日志或者进程等等。
命令 说明
stat 显示指定文件的相关信息,比 ls 命令显示内容更多
who 显示在线登录用户
hostname 显示主机名称
uname 显示系统信息
top 显示当前系统中耗费资源最多的进程
ps 显示瞬间的进程状态
du 显示指定的文件(目录)已使用的磁盘空间的总量
df 显示文件系统磁盘空间的使用情况
free 显示当前内存和交换空间的使用情况
ifconfig 显示网络接口信息
ping 测试网络的连通性
netstat 显示网络状态信息
clear 清屏
kill 杀死一个进程
  • MySQL 索引类型,描述每个索引的作用。

普通索引:字面意思,普通索引,只为了加快检索速度。
唯一性索引:唯一不允许重复,允许 null。
全文索引:分词搜索,生成全文索引速度非常慢,而且非常占用磁盘空间。
主键索引:唯一不允许重复,一个表中只允许一个主键索引。
还有单列索引、多列索引、空间索引等较少使用。

  • MySQL 索引结构(HASH,平衡树/红黑树,B树,B+树),之间的优缺点?为什么会选B树作为默认。

https://www.zqskate.com/article/108

  • MySQL 存储引擎,各个之间的优缺点,存储数据的区别。

https://www.zqskate.com/article/108

  • 什么情况下用 InnerDB,什么情况下用 MyISAM?

①如果是读多写少的项目,可以考虑使用MyISAM,MYISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。
②如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎
③如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

  • 必问 Redis 数据结构?Redis 优缺点?与其他 NoSQL 相比优势?
  • 必问 你了解过什么设计模式?列举 JAVA 中有什么设计模式。
  • 必问 说以下你了解的设计模式详情。
  • 必问 IOC是单例模式还是多例模式,单例和多例有什么区别?
  • 对象的反序列化和序列化,有什么关键字?
  • HashCode 和 equals 的区别?
  • 数组和链表的区别?
  • Collection 里面的原生方法有哪些?

add():一次添加一个元素。
addAll():将一个参数容器中的元素添加到当前容器中。
remove():删除一个指定对象。
removeAll():删除指定的 Collection 中和本 Collection 中相同的元素。
clear():直接将集合中的元素清空。
contains():是否包含指定元素。
containsAll():是否包含指定容器中的元素。
isEmpty():判断是否有元素。
size():元素的个数。
retainAll():保留指定 collection 集合中相同的元素,不相同的元素会被删除。

  • Collection 有什么派生类?

List:
有序可重复,允许存储单个或多个 null 元素,提供了特殊迭代器(ListIterator),保证了每个元素的插入顺序。
实现类:ArrayList,LinkedList,Vector,Stark
Set:
无序不可重复,只允许单个 null 元素,TreeSet 可排序。
实现类:HashSet,LinkedHashSet,TreeSet。

  • ArrayList 和 LinkedList 的区别?优缺点?
  • HashMap 和 HashTable 的区别?

HashMap 是线程不安全的,HashTable 是线程安全的(synchronized )。
HashMap 允许键值为 null,而 HashTable 则不允许。
HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。

  • HashMap 和 HashSet 的区别?
HashMap HashSet
HashMap 实现了 Map 接口 HashSet 实现了 Set 接口
HashMap 储存键值对 HashSet 仅仅存储对象
使用 put() 方法将元素放入 map 中 使用 add() 方法将元素放入 set 中
HashMap 中使用键对象来计算 hashcode 值 HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说 hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false
HashMap 比较快,因为是使用唯一的键来获取对象 HashSet 较 HashMap 来说比较慢
  • Set 无序,怎么排序?

使用 TreeSet,自然排序以及选择器排序。
自然排序:

/**
 * 实现 Comparable 接口,重写 compareTo 方法。
 */
public class Student implements Comparable<Student> {
    private int age;

    @Override
    public int compareTo(Student o) {
        //按年龄排序
        return this.age-o.age;
    }
}

选择器排序:

//创建集合对象
TreeSet<Student> tree = new TreeSet<Student>(
    // 匿名内部类定义匿名对象
    new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            //按年龄排序
            return o1.getAge()-o2.getAge();
        }
});

人事相关:

主要了解前公司,薪酬方面,个人学习能力方面以及离职原因等。基本每家公司的 HR 都会问到。


  • 前公司薪酬结构(底薪、奖金、提成、绩效)。
  • 人员结构(前端多少人,后端多少人,公司多少人)?
  • 技术栈,项目亮点,项目难点,怎么解决?怎么处理?
  • 个人优缺点,性格,问题处理方式等等。
  • 离职原因

模拟总结:

  • 项目中用到了 Ngnix ,说说是怎么配置的?

配置 ngnix.conf 配置文件,要使用 Ngnix 反向代理服务器集群,需要在 http {} 节点下加入 upstream 配置服务器组以及负载均衡策略,然后在 server {} 节点下配置监听的端口和主机名,配置 location 将指定路径代理使用 proxy_pass 的方式代理到指定的服务组,结构如下:

http {

    upstream 服务组名称{
        ip_hash; #当前负载均衡算法指定为一致性HASH,解决分布式 session 问题
        server xxx.xxx.xxx.xxx:8080
        server yyy.yyy.yyy.yyy:8080
    }

    server {

        #监听端口
        listen  8080;

        #主机名
        server_name  localhost;

        location / {
            #通过proxy_pass方法进行代理至tomcat_server的服务器组,其中http://不能省略
            proxy_pass: http://服务组名称;
        }

    }

}

补充:Ngnix 的负载均衡策略

# 默认使用轮询,缺点:负载分配不均衡。
upstream 服务组名称{
    server xxx.xxx.xxx.xxx:8080
    server yyy.yyy.yyy.yyy:8080
}

# 权重,指定轮询几率,如下设置 y 比 x 的访问几率要大一倍,解决后端服务器性能不均匀的情况。
upstream 服务组名称{
    server xxx.xxx.xxx.xxx:8080 weight=5;
    server yyy.yyy.yyy.yyy:8080 weight=10;
}

# 一致性HASH,按照访问请求的 IP 分配服务器,这样每一个请求都会命中同一个服务器,解决 session 问题。
upstream 服务组名称{
    ip_hash;
    server xxx.xxx.xxx.xxx:8080
    server yyy.yyy.yyy.yyy:8080
}

参考文档:
Nginx - nginx服务的基本配置(nginx.conf文件的详解)
Nginx 反向代理实现负载均衡 web 集群
Nginx 配置 upstream 实现负载均衡

  • 说说你们项目中 Zuul 网关做了什么配置?

1、统一入口:
为所有的微服务提供唯一入口,网关起到内部与外部进行了隔离,保障了后台服务的安全性。

2、ZuulFilter 拦截请求参数:
通过网关层对请求做一个过滤拦截,拦截没有携带 access_token 的恶意请求。
创建过滤器类继承 ZuulFilter 类,重写其方法:

/**
 * @author CHAN
 * @date 2020/05/12
 */
@Component
public class MyFilter extends ZuulFilter {

    /**
     * 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。
     * pre:请求在被路由之前执行
     * routing:在路由请求时调用
     * post:在 routing 和 error 过滤器之后调用
     * error:处理请求时发生错误调用
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * filter执行顺序,通过数字指定。 数字越大,优先级越低。
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 判断该过滤器是否需要被执行。这里我们直接返回了 true,因此该过滤器对所有请求都会生效。 实际运用中我们可以利用该函数来指定过滤器的有效范围。
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器的具体逻辑
     */
    @Override
    public Object run() {
        // 登录校验逻辑。
        // 1)获取Zuul提供的请求上下文对象
        RequestContext ctx = RequestContext.getCurrentContext();
        // 2) 从上下文中获取request对象
        HttpServletRequest req = ctx.getRequest();
        // 3) 从请求中获取token
        String token = req.getParameter("access-token");
        // 4) 判断
        if(token == null || "".equals(token.trim())){
            // 没有token,登录校验失败,拦截
            ctx.setSendZuulResponse(false);
            // 返回401状态码。也可以考虑重定向到登录页。
            ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
        }
        // 校验通过,可以考虑把用户信息放入上下文,继续向后执行
        return null;
    }
}
  • Feign 是什么?为什么要用它?你能自己实现一个 Feign 吗?

A 服务注册到注册中心,服务名为 A
B 服务注册到注册中心,拉取服务列表,通过 restTemplate 对服务进行通讯。

@Resource
private DiscoveryClient client;

@RequestMapping(value = "test")
public RespResult getUsers() {
    // 获取服务列表
    List<String> services = client.getServices();
    services.forEach(service -> System.out.println(service));
    // 获取服务链接,因为只有一个服务,所有直接 get(0) 获取
    List<ServiceInstance> instances = client.getInstances("A");
    ServiceInstance instance = instances.get(0);
    // 获取 ip 以及端口信息
    String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/user/list";
    return restTemplate.getForObject(url, RespResult.class);
}
  • Hystrix 在项目中怎么配置?

1、方法 fallback,对单个方法进行 fallback
@EnableCircuitBreaker 开启 Hystrix 熔断
@HystrixCommand(fallbackMethod = "fallback") 对方法进行熔断

/**
 * fallback 方法
 */
public Product fallback(@PathVariable Integer id) {
    Product product = new Product();
    product.setPremark("no this database in mysql !!");
    return product;
}

2、Feign 集成 Hystrix
实现 FallbackFactory 重写 create,并返回 feign 服务端接口。
feign 注解添加参数 fallbackFactory = xxxImpl.class
或者直接实现 Feign 接口,重写所有方法
feign 注解添加参数 fallback = xxxImpl.class
详情:SpringCloud 微服务架构五大核心组件(三):Hystrix 断路器

全部评论1