微服务架构面试02


一、mybatis

1、什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
在这里插入图片描述

2、MyBatis加载mapper方式

4种方式 package、url、resource、class。其中package优先级最高
源码:
在这里插入图片描述
package优先级最高,只能有一种加载方式,不然会抛出最下面的异常

3、MyBatis缓存的作用?

提高性能、减少对数据库的依赖,可以通过jvm的内存,在硬件层面就是硬盘和内存的区别。

4、一级缓存默认开启还是关闭?生成原理是什么?什么是二级缓存?

一级缓存默认开启,源码里面cacheEnabled属性默认为true 一级缓存作用域Sqlsession 二级缓存跨作用域的。
原理: org.apache.ibatis.executor.CachingExecutor#createCacheKey
在这里插入图片描述
在这里插入图片描述

id会去访问mapper文件里面的select id,sql里面的offset,limit,和sql语句。组成了缓存。

在这里插入图片描述
第一次访问之后会有一个缓存,下一次如果sql语句一样就访问缓存,否则就去查询数据库

在这里插入图片描述

二、并发

1、什么是死锁?如何排查死锁?

多个线程持有相互资源,并且等待对方资源进行释放的前提下。

排查:idea中运行栏左侧有一个拍照,可以打印出堆栈信息,
在这里插入图片描述
cmd命令可以用java提供的命令,先用jps查看进程的进程号
在这里插入图片描述
再使用jstack8480也可以看到哪里发生了死锁。 Jstack pid

在这里插入图片描述

2、如何保证多线程执行顺序?

在这里插入图片描述

join底层被synchronized修饰,还调用了wait方法,一个native方法,让主线程进行等待

原理:除了thread1、2、3还有一个main线程,正常并发的不能保证顺序,如果加入了join代码,会让主线程等待第一个线程执行完再执行下一个线程的方法。

在这里插入图片描述在这里插入图片描述

三、 zookeeper

1、集群中的机器角色都有哪些?

3个  leader、 follwer、observer		集群角色

Leader:负责读和写、选举投票权
Follwer:负责读、选举投票权
Observer:负责读、没有任何的投票权

2、zookeeper有哪几种节点类型?

4种类型:持久(有序)、临时(有序)
持久节点:客户端断开,此节点不会自动删除
临时节点:客户端断开之后,此节点会自动删除(killSession)

org.apache.zookeeper.CreateMode
在这里插入图片描述

3、集群支持动态添加机器吗?

水平扩展机器 zk是支持的,但是他支持并不是很好。
Conf/Zoo.cfg server.1 server.2 server.3 相关服务的配置,这一个集群要有多少节点是先配置好的
配置不好的原因是需要停机器 加配置才可以
全部重启:集群最低要求配置(2n+1)大于半数以上
挨个重启:zab zookeeper原子广播协议

在这里插入图片描述

4、有哪几种集群方式:

单机(单机)、集群(多台机器)、伪集群(在一台机器)
高可用:集群(多台机器上)
容灾:在这里插入图片描述
假如一个一个机房挂掉了,还有4个大于1/2,不管哪个机房挂掉了都可以容灾。

下面这种容灾性就很差了,中间的5个挂掉了,就超过1/2了
在这里插入图片描述

四、Redis

1、单线程的Redis为什么这么快?

IO 复用、内存key value的nosql数据库

没有复用的话每一次请求都是一次IO操作

在这里插入图片描述
如果IO复用的话,就不用再新建一个IO,用原先的I别人用过的O去请求,放入队列中保证并发的问题,还有一个事件派发器
在这里插入图片描述
多个socket有一个很大的池一样的IO复用,里面每个socket都会有一个队列,通过类似于事件的方式去请求的,叫做文件事件分派器,命令请求处理,队列是有限的,可能多个请求拿到同一个socket。
在这里插入图片描述

2、Redis有哪些适合的场景?

1、分布式session (业务场景,分布式会话是短连接,无状态的,必须要在服务端存储session,tomcat支撑不了全局网站的session数据可以使用redis去做)
2、接口幂等性(第一次请求和第二次、第三次请求结果是一样的)、唯一性 (分布式的自增)
3、缓存
4、排行榜
5、队列、订阅

3、redis相比memcached有哪些优势?

1、memcached中全是字符串 redis有其他类型的
2、redis有持久化
3、redis速度比memcached快,redis是单线程单进程的,memcached是并发的

4、什么是缓存击穿、什么是缓存雪崩?如何避免

在这里插入图片描述
缓存雪崩:redis中存在的缓存不是持久的,失效时间。
缓存key在同一时间失效,(缓存挂掉、失效),并发同事请求到数据库。
1、失效时间随机、避免集体失效
2、多级缓存 多了一层保护
3、限流 降低并发数量。
在这里插入图片描述
缓存击穿:恶意请求
1、对缓存 null 的失效时间
2、布隆过滤器 guava
在这里插入图片描述

五、Rocketmq

1、为什么要用消息中间件?

解耦、异步、削峰
应用程序需要垂直拆分,依赖调用增多。

2、消息中间件的优缺点

缺点: 1、降低系统可用性
2、系统的复杂度提高
3、数据一致性
4、消息路由

3、如何保证rocketmq顺序消费?

生产消息是一个队列和我们消费消息是一个队列	
源码 rocketmq 取模 一个订单状态
创建订单、支付订单、完成订单、失败订单

六、sharding-sphere

1、说下proxy和jdbc优缺点?

在这里插入图片描述
jdbc支持跨数据库但是不支持跨语言
proxy支持跨语言但是不支持跨数据库

proxy:mycat
jdbc:sharding-phere

七、分布式唯一主键保证

雪花算法实现 snowflake

总结

面试题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值