# java面试题整理


springcloud alibaba的组件及其作用

1.nacos:注册中心

2.gateway:服务网关

是springcloud自己研制的微服务网关,是基于Spring5构建,能够实现响应式非阻塞式的Api,支持长连接

3.Ribbon:负载均衡

服务间发起请求的时候,基于Ribbon做负载均衡,从?个服务的多台机器中选择?台 (被调
用方的服务地址有多个),Ribbon也是通过发起http请求,来进行的调用,只不过是通过调用服务名的
地址来实现的。虽然说Ribbon不用去具体请求服务实例的ip地址或域名了,但是每调用一个接口都还要
手动去发起Http请求

4.Feign:服务调用

基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求 ,简化服务
间的调用,在Ribbon的基础上进行了进一步的封装。单独抽出了一个组件,就是Spring Cloud Feign。
在引入Spring Cloud Feign后,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提
供方的接口绑定。
调用远程就像调用本地服务一样

5.Hystix:熔断器

发起请求是通过Hystrix的线程池来?的,不同的服务?不同的线程池,实现了不同服务调?
的隔离,通过统计接口超时次数返回默认值,实现服务熔断和降级

mq的作用是什么,项目中 mq 的 应用场景

原链接https://cloud.tencent.com/developer/article/1447794?from=article.detail.1163705

mq一般用来解决应用解耦,异步处理,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。

异步处理

用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式

串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图

传统模式的缺点:

  • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败

  • 订单系统与库存系统耦合

如何解决以上问题呢?引入应用消息队列后的方案

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功

库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作

假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦

流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

可以控制活动的人数

可以缓解短时间内高流量压垮应用

用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面

秒杀业务根据消息队列中的请求信息,再做后续处理

redis的持久化方式,数据类型有哪些?

redis提供两种方式进行持久化,

? 一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),

? 另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)

二者的区别

RDB持久化

优点:使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
缺点:RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合 数据要求不严谨的时候

AOF持久化

优点:该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中

缺点:相比于AOF机制,如果数据集很大,RDB的启动效率会更高

二者选择的标准

就是看系统是愿意牺牲一些性能,换取安全性更高的缓存一致性(aof),

还是愿意牺牲安全性更高(会发生数据丢失), 保证了 redis 的高性能(rdb)。

① string
② list
③ set
④ sorted set
⑤ hash
使用场景参考如下:
string,用作计数器,统计在线人数等等,可以存储二进制数据如使用它来存储图片等。
hash,存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等
list,列表类型,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。
set,可以用作去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点

常用的集合及其特性

List集合

1、ArrayList(最常用)

底层是动态数组,故优缺点同数组:查询快,增删慢
线程不安全,效率高
2、LinkedList
底层是链表,(巧记:和数组优缺点互补)查询慢,增删快
线程不安全,效率高

Set 集合

1、LinkedHashSet
底层是:哈希表(元素不可重复)+链表(有序,因为链表记录每个元素都记录后一个元素的地址)
1、去掉重复元素
2、具备先进先出的特点

HashSet

底层是哈希表
向HashSet集合中放入新元素的执行顺序:
1、调用Hashcode()函数,看是否已经有相同的哈希值,如果没有则放入该新元素,如果有则调用equals()函数逐个比对,如果没有,则放入,如果有,则不执行添加元素操作。

springbean 的生命周期

1、解析类得到BeanDefinition

2、如果有多个构造方法,则要推断构造方法

3、确定好构造方法后,进行实例化得到一个对象

4、对对象中的加了@Autowired注解的属性进行属性填充

5、回调Aware方法,比如BeanNameAware,BeanFactoryAware

6、调用BeanPostProcessor的初始化前的方法

7、调用初始化方法

8、调用BeanPostProcessor的初始化后的方法,在这里会进行AOP

9、如果当前创建的bean是单例的则会把bean放入单例池 10、使用bean 11、Spring容器关闭时调用DisposableBean中destory()方法

相关