# 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()方法