录音面试题库

262 阅读28分钟

JavaSE

Java 的 Socket

Socket的是套接字。是计算机之间通信的一种约定、一种方式。

然后常见的协议有:TCP 和 UDP

TCP

是什么?TCP是一种面向连接的可靠协议
特征:三次握手建立连接,四次挥手断开连接,可进行大数据量传输,通信效率较低
应用场景:对信息安全要求较高的场景,比如文件下载,金融数据通信

三次握手

  • 客户端向服务端发起请求--等待确认
  • 服务端向客户端返回响应
  • 客户端向服务端确认建立连接

四次挥手

  • 客户端向服务端发起取消连接请求
  • 服务端向客户端返回响应表示收到请求
  • 服务端向客户端发起确认请求
  • 客户端发送确认信息连接取消

UDP

是什么:是一种无连接不可靠的传输协议
特征:之所以不可靠,是因为不需要建立连接,将IP端口信息封装为数据包并限制在64KB内
速度快,开销小无需释放资源。
应用场景:语音通话,视频通话

Java实现多线程的方式?

实现多线程的方式,有三种

  • 一种是:继承Thread类
    • 优点:编码简单
    • 缺点:不利于扩展
  • 另一种是:实现 Runnable 接口
    • 优点:扩展性强
    • 缺点:多一层包装,线程有返回结果,无法返回
  • 最后一种方式:实现Callable接口
    • 优点:扩展性强,可以拿到线程返回的结果
  • 还可以使用线程池的方式实现,ThreadPoolExecutor

程序优化?

对集合了解多少?

  1. 是什么?
    集合是存放对象数据的容器
  2. 特征?
    集合只能存放对象类型,是可变长度。提供了高性能的结构和算法,提高程序速度和质量
  3. 集合类型?
    集合有两个接口:Collection(单列集合接口) 和 Map(双列集合接口)
    Collection接口分为 List 集合和 Set 集合

List 集合

  • 分为:ArrayList 和 LinkedList(有序,有索引,可重复)
    ArrayList:底层数组,查询修改快,增加删除慢
    LinkedList: 底层双链表,查询修改慢,增加删除快

Set 集合

  • 分为 HashSet、LinkedHashSet 和 TreeSet
    HashSet:底层是一个HashMap,其实操作就是HashMap的key,特点(无序,不重复,无索引)
    LinkedHashSet:底层是一个HashMap,特点(有序,不重复,无索引),多了一个双链表机制来记录存储顺序
    TreeSet:底层是红黑树,特点(可排序,不重复,无索引)

Map 集合

  • 分为HashMap、LinkedHashMap 和 TreeMap
    HashMap:底层数组+链表+红黑树,特点(无序,不重复,无索引)
    LinkedHashMap:底层数组+链表+红黑树,特点(有序,不重复,无索引),每个键值对多了双链表机制记录存储顺序
    TreeMap:底层红黑树,特点(可排序,不重复,无索引)

哪些集合是线程安全的?

Vector、HashTable、Properties是线程安全的。

  • Vector:底层数组,不同系统扩容机制不同,几乎1.5倍,linux扩容两倍
  • HashTable: 跟HashMap一样,底层数组链表红黑树,单线程下效率极低。
  • Properties:底层就是Map,继承HashTable

红黑树怎么平衡?

红黑树是一个特殊的二叉查找树

  • 每一个节点可以是红色或者黑色
  • 红黑树不是高度平衡的,它的平衡是通过红黑规则实现的

红黑规则:

  1. 判断是否根节点,如果是根节点直接设置黑色。如果非根。
  2. 判断是父节点是黑色还是红色,如果是黑色不需要任何操作
  3. 如果是红色,判断叔叔节点是什么颜色
  4. 如果叔叔是红色
  • 将父节点和叔叔节点设置为黑色,将祖父设置为红色
  • 如果祖父为根节再设置为黑色,如果祖父非根设置为当前节点再次进行判断
  1. 叔叔是黑色节点,并且当前节点为父节点的右孩子
  • 把父节点作为当前节点并左旋,再进行判断
  1. 叔叔黑色,当前节点是父的左孩子
  • 将父节点设置为黑色,将祖父设置红色,以祖父作为支点进行右旋

遍历map集合的几种方式?

  1. entrySet
  2. keySet
  3. 迭代器
  4. lambda表达式

了解HashMap的扩容机制吗?

默认加载因子是0.75,初始化第一个数组为16,第一次扩容也就是添加12个。等于数组*0.75

如何实现复制一个文件

使用 apache 的工具类,IOUtils下的copy方法,参数一是复制那个文件,参数二是复制到哪里。 运行完,直接关闭流即可

还可以用原生方式,先定义一个try-catch块,try后面括号里面进行定义流,然后在花括号里面进行定义复制内容,read读,write写。无需关闭流

线程分为IO密集和CPU密集,线程使用多少合适?

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

  1. CPU密集:
    1. 指的是系统的硬盘、内存性能相对CPU要好很多,简单来说IO等CPU
  2. IO密集
    1. 指的是系统的CPU性能相对硬盘、内存要好很多,简单来说CPU等IO

static 静态变量和静态方法和静态代码块执行顺序

根据编写顺序,先执行,静态方法在最后

String equals 底层是怎么判断的?

首先调用 equals

  1. 进入equals,参数是Object,也就是传入的字符串
  2. 首先进行地址比较,那this,这时候this就是调用者。
  3. 如果地址相同,返回true
  4. 如果不相同,用instanceof进行判断是否是string类型
  5. 如果是转为String,然后调用value属性,也就是将字符串转为了字符数组,调用者为value,这个是在初始化就有数据了。就是调用者。
  6. 传递给StringLatin1的equals方法,进行循环遍历,如果比较失败返回false,全部为true,返回true

什么是死锁?

死锁就是两个线程在竞争资源,你等我,我等你的情况下,产生了阻塞,称之为死锁。

一般死锁分为三个情况

  1. 占用且等待:就是说线程1等待y的时候,不释放X资源
    • 解决方案:一次性申请所有的资源,就不会存在等待
  2. 其他线程不能去抢占t1线程占有的资源
    • 解决方案:占用部分资源的线程,可以进一步申请其他的资源,如果申请不到,可以释放它占有的资源。
  3. 循环等待:线程t1等待t2占用的资源,线程t2等待t1占用的资源
    • 按照顺序申请资源,资源是有线性顺序的。先申请资源序号小的,再申请序号大的。这样线性循环就不存在

单例模式的优点?

单例模式是指一个类只有一个实例。

  • 饿汉模式:类加载的时候就初始化,线程安全。缺点:大量单例存在,浪费资源
  • 懒汉模式:解决了内存浪费问题。 缺点:多线程场景会有线程安全问题。可能创建多次对象。
    • 解决方案:增加synchronize同步锁,或者双重检查锁,缺点:对性能有影响

Spring

介绍一下SpringCloud有哪些组件?

  • Nacos、Eureka 注册中心
  • Ribbon 负载均衡
  • Feign 声明式服务调用
  • Hystrix 熔断器
  • GateWay 网关
  • Sentinel 熔断降级
  • Seata 分布式事务

redis 有哪些类型?

  • String 类型,底层是字节数组,根据编码方式不同,最大空间不能超过512MB

  • Hash 类型,底层是Hash表,结构就跟对象一样,都是key-value结构

  • List 类型 底层可以看作是双向链表,支持正向检索也可以反向检索
    • 特点有序,插入删除快,查询速度一般,元素可以重复。

  • Set 类型 无序,元素不可重复,查询快,支持交集并集差集等功能,底层Hash表

  • SortedSet 底层跳表 + Hash表,是个可排序的集合

    • 为每个元素加个score属性,基于score属性进行排序。可排序、不重复、查询快

SQL优化的几个方面?

  • 数据量特别大的话,优先考虑分库分区分表
  • 使用explain查看执行计划
  • 减少索引数量,减少全名中
  • 尽量不要使用in not in这些进行判断,因为会全盘扫描,like的百分号尽量写后面的,用exists

左连接和右连接有什么区别?

左连接是把左表全部保留下来,on之后的表是判断是否满足条件,满足保留,否则为空
右连接是相反,把on之后的全部保留,把左表判断是否满足条件,满足保留,否则为空

数据库分页查询在数据量大的情况下,该怎么优化?

  • count不必要每次都查询
  • 如果数据不需要那么精准,可以修改Mysql引擎

SpringMvc 了解多少?

先说下,MVC是Model,View,Control的缩写,它是一种软件设计规范,它将业务逻辑,数据,显示分离的方法来组织代码,降低视图与业务逻辑之间双向耦合。

  • Model(模型):业务逻辑操作,包含Dao层和Service层,包含数据和行为
  • View(视图):负责进行模型展示,一般是客户想看到的东西,用户界面等。
  • Controller(控制层):接收用户请求,委托给模型进行处理,处理完毕后返回模型数据给视图,由视图进行展示。

SpringMvc 的执行流程?

  1. 当用户通过浏览器发起一个Http请求,请求直接到前端控制器DispatcherServlet
  2. 前端控制器调用HandlerMapping处理器映射器
  3. 处理器映射器根据请求的URL找到具体的Handler,并将他返回给前端控制器
  4. 前端控制器调用HandlerAdapter处理器适配器
  5. HandlerAdapter经过适配调用具体的处理器(Handler,也叫后端控制器)
  6. Handler执行完毕返回ModelAndView
  7. HandlerAdapter将ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给viewResolver视图解析器进行解析
  9. ViewResolver解析后返回具体View
  10. DispatcherServlet对view进行渲染视图,即将模型数据填充至视图中,最后响应用户

怎么集成Mybatis

直接引入依赖,SpringBoot,就可以使用

介绍下SpringCloud

我觉得SpringCloud是一个分布式微服务架构的一站式解决方案,他提供了很多组件用来解决分布式架构所带来的问题。比如:

  • Nacos:支持服务的发现,配置和管理。
  • Ribbon:实现客户端的负载均衡,它提供了轮询,轮询权重,随机等负载均衡策略。
  • Feign:实现声明式服务调用。
  • gateway:实现拦截所有请求,分发到服务上去。
  • sentinel:实现流量控制,实时监控,熔断降级,资源隔离。保护我们的服务避免雪崩。
  • seata:分布式事务,解决当前服务出现问题其他服务不会回滚问题。

接受传统开发的模式吗?

也就是前后端不分离的模式?能接受吗?

  • 可以接收

mysql?

  • 删除数据表:drop table 表名;
  • 删除数据库所有信息:truncate table 表名;
  • 删除数据库信息:delete from 表名 where 条件
  • 去重方式
    • distinct 去重
  • union:合两表的数据,根据检索字段合并,去重
  • union all:合并两表的数据,不去重

简单介绍一下项目

我这个项目是OA办公系统,里面有学习会系统,学习会系统包含了活动管理,任务组管理,任务管理。根据每个人分配一些任务,然后就是预警,如果判断任务已经快到了开始时间,就回去发送一条消息给这个任务负责人。还有就是模板管理,模板管理为了快速复用以前的活动。这个用到了SpringCloud,Nacos,redis,mybatis

这项目有什么亮点?

应该就是定时器和模板了,模板采用分表操作,跟学习会没有关系,存入的数据也不会被学习会的信息影响。 定时器会定时判断,判断成功修改状态。

SQL 判断时间

判断sql时间

select * from user where birthday >= '2014'

若依组成部分

ruoyi-ui // 前端框架 [80]
ruoyi-gateway // 网关模块 [8080]
ruoyi-auth // 认证中心--里面有登录注册退出登录等 [9200]
ruoyi-api // 接口模块--存放一些公共的东西,客户端啊实体类啊,也包含系统接口
├── ruoyi-common // 通用模块
│ └── ruoyi-common-core // 核心模块
│ └── ruoyi-common-datascope // 权限范围
│ └── ruoyi-common-datasource // 多数据源
│ └── ruoyi-common-log // 日志记录
│ └── ruoyi-common-redis // 缓存服务
│ └── ruoyi-common-seata // 分布式事务
│ └── ruoyi-common-security // 安全模块
│ └── ruoyi-common-swagger // 系统接口
├── ruoyi-modules // 业务模块
│ └── ruoyi-system // 系统模块 [9201]
│ └── ruoyi-gen // 代码生成 [9202]
│ └── ruoyi-job // 定时任务 [9203]
│ └── ruoyi-file // 文件服务 [9300]
├── ruoyi-visual // 图形化管理模块
│ └── ruoyi-visual-monitor // 监控中心 [9100]

linux 常用命令

  1. tail 查看文件尾部
  2. ls 列出当前目录
  3. cd 切换工作目录
  4. pwd 打印当前工作目录
  5. mkdir 创建文件夹
  6. touch 创建文件
  7. cp 拷贝文件
  8. mv 移动命令
  9. rm 删除命令
  10. find 查找文件

linux 复制一个文件夹

cp -r 要复制的文件夹 复制到哪里

mybatis中#号和$有什么区别?一对多怎么写?

$是占位符,容易sql注入,#号是预编译的,不会发生sql注入
一对多是在resultMap中写collection

图片上传怎么上传?

前端有个组件upload,可以规定上传的格式,大小会到一个路径,到指定文件夹里,向后端发送,后端new 一个upload进行接收,会直接拿到地址,存放到数据库里。

mysql事务

mysql 四大特性ACID:

  • 原子性:指事务是一组操作,要么全部成功,要么全部失败!
  • 一致性:指事务执行完毕后,结果符合预期,保持一致。
  • 隔离性:指A事务和B事务同时操作一个数据库,互不影响。
  • 持久性:一旦提交或者回滚,就是永久性操作。

四个隔离机制

  • 读未提交:都没解决
  • 读已提交:解决脏读
  • 可重复读:解决脏读和不可重复读
  • 串行:解决了脏读、不可重复读、幻读

脏读:指一个事务读到另一个事务没有提交的数据

不可重复读:指一个事务先后两次读取到的数据不一致

幻读:就是当一个事务插入数据时,没有发现这个数据,但是执行插入时却报数据已存在。

redis 为什么适合做缓存?

首先redis基于内存提供了高性能的数据存取功能。

  1. redis拥有淘汰规则,当数据超过缓存容量之后,根据规则淘汰一定的数据。
  2. 业务在访问数据时,会先去redis中查看是否有响应数据,如果有直接读取缓存。没有则去数据库查询,再缓存到redis缓存中,叫缓存更新。
  3. 只读缓存和读写缓存?
    • 只读缓存:应用要读取数据会先查询数据是否存在,存在则读取,而写请求是直接操作数据库,然后清空掉redis缓存的数据,下次读取数据一定是缺失。这样就是只读缓存。
    • 读写缓存:读请求和只读缓存一样,写请求也会被缓存到redis中,在缓存中对数据进行增删改操作。但是,因为读写缓存是在内存中,一旦出现宕机或掉电,内存的数据就会丢失。

根据业务对数据可靠性的不同要求,会有同步直写和异步写回策略

  • 同步直写:优先保证数据可靠性,就是发给缓存的同时也会写给后端进行处理,都完成才返给客户端
  • 异步写回:先提供快速响应,所有的请求都在缓存中处理,等到这些增改的数据被淘汰时才会写给数据库,注意:宕机会导致数据丢失

reids读写缓存只能采用同步直写策略。修改缓存也要写入后端数据库,可能会导致数据库和缓存的不一致,需要配合分布式锁使用

Spring常用注解?

  • @component:被sprign管理
  • @Controller:被spring管理,并可以返回页面
  • @Service:表示业务层
  • @Repository:表示数据层
  • @Configuration:表示这是配置类
  • @Scope:可以标注单例还是非单例
  • @Autowired:依赖注入(singleton 单例,prototype 非单例)

IOC 和 AOP 的理解?

  • IOC:控制反转:强调原来在程序中创建Bean的权利交给第三方
  • DI:依赖注入:强调Bean与Bean之间的关系,由第三方负责
  • AOP:面向切面:功能是横向抽取,主要实现是Proxy(代理)
    • 可以在不修改源码的情况下,对程序进行增强

简单举个 AOP 的例子?

这个我举个例子吧。

  1. 先给每一个方法加自定义注解,并有个value值,作为权限码
  2. 在访问一些模块的时候,可以使用AOP切面进行权限判断。
  3. 当访问模块的时候,先拦截,拦截条件呢就是刚刚的自定义注解。
  4. 通过AOP获取方法上的权限值,判断这个用户是否具有这个权限,有则通过,没有就抛出异常。

Eureka 和 Naocs 的区别?

  • Nacos 会把服务的提供者,划分为临时实例和非临时实例,默认都是临时实例。
  • 临时实例:用心跳检测,每隔一段时间发一次心跳,宕机直接踢掉,和Eureka一样
  • 非临时实例:由Naocs主动发信息询问是否宕机,如果宕机了,会等它恢复健康。

拉取不一样,会每隔一段时间pull和push,Eureka只有pull,如果有服务挂掉了,会主动push服务。

Naocs与Eureka的区别

共同点:

  1. 都支持服务注册和服务拉取
  2. 都支持心跳方式做健康检测

不同点:

  1. Naocs支持服务端主动检测提供者的状态
  • 临时实例采用心跳模式
  • 非临时实例采用主动检测模式
  • 临时实例心跳不正常会剔除,非临时实例不会剔除
  1. Naocs支持服务列表变更的消息推送模式,服务列表更新更及时
  2. Naocs集群默认采用AP方式,当集群中存在非临时实例,采用CP模式,Eureka采用AP模式

说到AP模式:AP就是最终一致,也就是事务分别提交,允许出现不一致,出现会采取弥补措施恢复数据。

CP模式:CP模式就是事务执行完毕后会互相等待,同时提交,同时回滚,弱可用,强一致

做项目中遇到了哪些问题?

  1. feign 远程调用的时候,参数需要加@requestParm或者PathVariable,如果传入对象或者集合需要加requestBody在对应的控制层也要添加

Sentinel 解决了什么问题?

解决了雪崩问题:某个服务故障导致整个微服务都出现故障。

  1. 超时处理:设置一定的时间,超过这个时间就返回错误异常!
  2. 舱壁模式:限定某个业务能使用的线程数,避免消耗整个tomcat,线程隔离
  3. 熔断降级:由断路器统计业务的异常比例,超过阈值直接拦截该业务的所有请求。
  4. 流量控制:限制每秒钟处理请求的数量,限制访问OPS(访问量),避免因为流量徒增而故障。

Feign使用的是什么协议?

Feign使用的是Http协议。

如何设计高并发系统?

  1. 页面静态化

    比如活动页面大多数内容都是固定的,减少不必要服务端请求。对指定内容进行访问服务端。

  2. 使用CDN

    因为用户分布到全国各地,地域相差很远,网速各不相同,使用CDN,内容分发网路

  3. 如何控制页面按钮准时亮起呢?

    因为有时候高并发的请求并不多,比如秒杀,有个按钮准时亮起。
    前面说过静态资源缓存到了CDN上,用户无论怎么刷新,都是静态的,减少请求。
    按钮的改变也是由JS控制的,秒杀之前JS标志为false。
    秒杀开始系统生成一个新的JS,标志为True,并生成一个新值。同步给CDN,根据新值,CDN不会缓存数据,每次获取最新的JS代码。这样就可以去请求。

  4. 缓存
  5. mq异步处理
  6. 限流
  7. 分布式锁

跨域问题产生的原因以及解决方案?

跨域就是指:域名不一致就是跨域,主要包括

  1. 域名后缀不同
  2. 端口不同(协议不同)
  3. 浏览器禁止发生跨域的Ajax请求。

解决方式:gateway网关配置允许发生跨域

  1. 解决请求被拦截,设置为true
  2. 设置允许哪些网站可以跨域,配置网址
  3. 设置允许跨域的请求方式
  4. 设置是否允许带头信息
  5. 设置是否允许携带COOKIE
  6. 设置跨域有效期

在教育研究院项目主要负责哪些内容呢?

咱这个项目主要是给教育研究院做的,是自动化办公的,里面分为学习会模块和餐饮模块,我是主要做学习会的,学习会模块,是活动管理,任务管理,模块管理。像任务管理,管理员把任务下发给负责人,负责人要在指定的时间内完成。也可以设置闹钟,提醒自己任务要完成的时间。

教育研究院这个有什么亮点吗?

教育研究院遇到问题怎么解决呢?

遇到问题,一般的网上都有解决方案,先去尝试网络搜索,如果搜很长时间都没有解决应该去向同事请教,避免浪费太多的时间。

教育研究院能说下工作流程?

传统的办公方式无法满足于教育研究院对于快速,高效,方便,及时的处理事务需求,为了提高这些需求,所开发的系统。 首先,当要开办一个活动的时候,管理员会先去在系统中创建一个活动,如果是每年都创建的活动,可以保存为模板,方便以后快速创建,然后设置任务给负责人,负责人收到通知,可以选择设置闹钟方便即时完成。管理员可以去待办任务中及时看到所有任务的完成情况。

Naocs 的配置怎么注入进来?

Nacos 先启动,然后服务里面填写配置信息,可以在Naocs配置中查看服务

配置管理,需要先创建一个bootstrap.yaml文件,先读取yaml文件知道Naocs的地址,再去读取application.yaml文件。在bootstrap文件中配置文件后缀名,服务名,naocs地址,等信息。在nacos中也要定义文件。实现热更新。

什么是CAP理论?

就是在单体架构,事务都必须满足ACID,但是到了微服务上面,因为服务都是独立的,所以事务抛出了异常,其他事务并不会知道,所以也就不会产生回滚。就无法满足ACID了。

为了解决这个事情,产生了CAP(一致性,可用性,分区容错性)理论。

  1. 一致性:用户访问分布式的任意节点,得到的数据必须一致,用户修改任意节点的数据,就必须实现数据同步。
  2. 可用性:用户访问任意健康的节点,必须得到回应,不能超时不能拒绝。
  3. 分区:因为网络故障或者其他原因,导致分布式系统部分节点与其他节点失去联系,形成独立分区。
  4. 容错:在集群出现分区时,整个系统也要持续对外提供服务。

Eric Brewer 提出分布式系统无法同时满足这三个指标。这个结论就叫做CAP理论。

介绍一下定时器?

  1. Spring 定时器

主类加 @EnableScheduling 开启Spring定时器
在一个被spring管理的类中方法上标注Scheduled参数是cron 每多长时间运行

如何解决依赖冲突?

可以安装maven helper插件查看有哪些依赖冲突。

也可以选中项目,查看依赖图,有红色提示的是冲突的

最好的方式,就是在父项目中,使用dependencyManagement声明依赖,父项目引入解决依赖冲突。

geteway 主要是用来做什么的?

因为外部访问是不安全的,需要网关来做保护。

为什么不安全?

  1. 如果这个系统是公司的,不是公司的员工不能进入。以防止公司内容泄密。
  2. 再比如,只能接收500请求量,不能一下子进入两千请求,拦截这些多余请求,对微服务保护。
  1. 可以实现身份认证和权限校验。
  2. 服务路由,负载均衡
  3. 请求限流。

还可以实现路由断言工程,判断是否满足条件,还可以过滤请求,和实现跨域问题。

IO 字节流怎么转换字符流

  • InputStreamReader 字节转换流
  • OutputStreamWriter 字符转换流
  1. 先创建一个字节流和一个字符转换流
  2. 将字节流放进转换流中,并返回就转换成功了

谈一谈多线程?应该注意什么?

多线程就是指新开了一条执行路径,比如main方法它就是一条路径,如果只有一个路径,是单线程,多个路径就是多线程。

  1. java中一共有三个,继承thread,runnable,callable。

应该注意线程安全。避免同时对资源进行修改。实现加锁防护。

谈谈mybatis的一级缓存和二级缓存?

一级缓存是默认的,操作数据库时需要构造sqlsession对象,对象里面有个map集合记录缓存数据,多个sqlsession互不影响。

当执行增删改并提交的时候会删除缓存,避免脏读。

二级缓存需要手动开启,每个mapper文件都有一个二级缓存区域,是按照namespace命名空间分划的。如果相同则是在一个缓存区域,有一个执行了提交操作则清空二级缓存。

每一个列表有一个useCache,设置为false,禁止这个操作使用二级缓存。

redis 常用命令

  1. expire key 20 ,给key设置有效期 20秒

redis 淘汰机制

  1. noeviction:当内存使用达到阈值时,所有引起申请内存的命令会报错
  2. allkeys-lru:在键空间中,优先移除最近未使用的
  3. keyvolatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的
  4. keyallkeys-random:在键空间中,随机移除某个
  5. keyvolatile-random:在设置了过期时间的键中,随机移除某个
  6. keyvolatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除

单体架构和微服务架构的区别?

  1. 单体架构代码复杂,耦合性高,不易维护,微服务架构每个服务相当于一个单体架构,代码简单。
  2. 单体架构都用一个数据库,而微服务架构每个服务可以用不同的数据库,比如可以用redis,每个服务都对应自己的数据库。
  3. 单体架构的技术都是一样的,微服务架构都可以使用不同的技术,开发更加灵活。

怎么实现服务与服务之间负载均衡的呢?

  1. 启动nacos,给User服务设置不同的集群,给order服务设置一个集群和User其中一个一样。
  2. 给调用者order添加负载均衡策略。实现负载均衡。

乐观锁和悲观锁?

乐观锁:就是比较乐观,只有当修改的时候才会判断是否已经被修改。
悲观锁:是比较悲观,总是假设最坏的情况下,所以每次拿数据都会上锁。

应用场景:乐观锁用在并发量不会超过2000的情况下并且写比较少的情况下,而悲观锁用在写比较多的情况下,保证数据安全。

linux权限系统是?

对数据库连接池怎么理解?

为了节约资源,当用户访问时会从容器中申请连接对象,访问后会将连接对象归还容器。 目的,节约资源,用户访问高效。

SpringBoot配置文件优先级怎么理解的?

  • 如果properties 和 yam 和 yaml同时存在,优先级是propertiers其次是yam最后yaml
  • 在打包下面放的配置文件优先级是比之前高的
  • 再然后打包下面的config目录是最高的

mysql引擎都有哪些?

mysql 什么场景下应该使用索引,什么场景不应该使用?

雪花ID的特点?

  • 优点:有序,唯一
  • 缺点:如果机器上时钟回拨,可能导致ID重复

MQ用过吗?

MQ能实现异步消息处理,有所了解,我相信我可以在1-2周完全胜任这方面的技术的。

static了解多少?

static,可以修饰变量,修饰方法,修饰内部类,修饰内部代码块。

特点:不用实例化对象,就可以使用静态的变量或者方法,用来提高程序性能。
静态只能访问静态的(如果想访问非静态需要实例化对象),非静态可以访问静态也可以访问非静态。

为什么list集合遍历的时候添加删除元素会报错啊?

list在for循环中,因为for底层是迭代器,这个时候不能修改集合长度。修改会报错。

对future的理解?

他是结果的接口,多线程执行完毕后,把结果封装到这个里面,进行返回。

  • get:可以得到结果,是阻塞的,没有拿到结果会一直等待。有个参数可以设置等待时长。
  • isCancelled: 判断这个任务有没有取消
  • isDone: 判断这个任务有没有执行结束
  • cancel: 有个方法可以取消异步任务的执行。

什么是可重入锁?

某个线程已经获取某个锁,可以再次获得锁,并且不会产生死锁。

  • synchronized
  • ReentrantLock

threadlocal锁

可以提供线程内的局部变量

了解ApplicationContext了解多少?

BeanFactory相当于Spring的心脏,ApplicationContext相当于身躯了,ApplicationContext由Factory派生而来,提供了面向实际应用的功能。

Spring事务默认对哪些异常进行回滚?

是Error虚拟机异常,和RuntimeException及其子类进行回滚。

tryCatch进入Catch会回滚吗?

这种情况看是否抛出异常,抛出异常会回滚。

http协议是udp还是tcp?

http1.1,http2版本是tcp协议,http3是udp协议

http的请求类型有哪些?

  • get:用来查询
  • post:用来新增
    • put:用来修改
  • delete:用来删除

通过Spring管理的实例,作用域是什么?

需要在类上面加注解,表示注入这个类不再是单例

  • 默认是单例,也就是只会创建一个实例对象,每次得到的都是相同的实例对象
  • 修改为prototype原型,就不会创建单例的了

如果一个接口两个实例,如何注入?

在注入的时候,可以用Qualifier进行指定,如果是resource,可以使用name属性进行指定

面试技巧

和领导存在争议怎么办?

首先尽量避免和领导存在争议,如果这个真的很重要,首先进行自我反思,要先自己考虑周全,从立场不同进行考虑,再根据岗位经验方面考虑是不是存在信息认知,领导是以全局进行看的。再者就是沟通能力,最重要的是争议不可怕,可怕的是被情绪带偏了,忘记了解决问题本身这个事情。