上海回合肥年初面试第一天😐

65 阅读6分钟

合肥找工作不容易哇 面试机会少 工资低 呜呜~

下午六点半视频面试
Java开发工程师(银行) 10-15K
1、大学本科及以上学历,计算机、通讯、数学相关专业,至少3年JAVA开发经验;
2、有熟练的JAVA开发经验,熟悉多线程,数据库,网络通讯协议程序开发;
3、掌握springmvc、spring、springboot、springcloud、mybatis等后台开源框架;
4、具有银行项目经验优先,掌握银行渠道典型交易流程、交易一致性方案和差错处理方案;
5、具备良好的工作态度及沟通表达能力,工作认真负责,执行力及责任心强。

1.介绍一下最近的业务,以及最近用到的技术栈

2.项目里springcloud基础架构

springcloud-gateway 网关  
springcloud-hytrix 熔断器  
openfeign

3.项目是微服务的吗

分布式的

4.哪个服务部署几个实例

用户、医生相关服务 不常用 各两个
主业务服务  三个

5.gateway的路由策略

gateway路由策略
路径URL匹配
主机IP匹配
请求头匹配
HTTP方法匹配
按权重比例匹配(用于灰度发布)
??

gateway功能
1.反向代理(请求的转发)
2.路由和负载均衡
3.身份认证和权限控制
4.对请求限流

6.介绍一下限流算法

固定窗口计数器
滑动窗口计数器
漏桶算法
令牌桶算法

7.介绍一些分布式锁解决方案

基于数据库实现分布式锁;
基于缓存(Redis等)实现分布式锁;
基于Zookeeper实现分布式锁;

8.分布式锁失效优化方法\

redission

看门狗机制(Watchdog)
如果一个节点持有锁的时间过长,可能会导致其他节点无法获取锁。为了解决这个问题,可以使用看门狗机制(也叫锁续期机制)。这个机制的核心思想是:当锁被一个节点持有时,它会周期性地延长锁的有效期,以防止锁在节点执行超时后被释放。

在 Redis 中,可以使用 Redis的EXPIRE命令 来定期更新锁的过期时间。例如,节点在持有锁时,每隔一定时间(比如 10 秒)就发送一个命令延长锁的有效期。

但需要注意,续期操作必须是原子操作,防止在锁过期后继续进行续期,导致死锁。

9.分布式环境下高可用解决方案

健康检查
熔断
降级
重试
超时机制
冷备热备(备份一个节点 故障时触发使用)
数据库主从复制、分布式数据库
缓存高可用、Redis哨兵模式集群模式或降级为本地缓存(Caffeine)
消息队列集群部署
灰度发布
全链路追踪
自动化部署

10.熔断和降级区别

特性熔断(Circuit Breaker)降级(Fallback)
功能监控系统服务的健康状态,防止继续向失败的服务发送请求。当服务不可用时,提供备选的响应,保持系统可用。
目的保护系统免受故障蔓延,避免更多的资源消耗。保证系统在服务失败时能够提供合理的响应。
触发条件服务失败率或错误率达到一定阈值,或请求超时过长。服务调用失败或超时时,使用预定义的备用方案。
实现方式通过打开、关闭和半开状态管理服务的健康状况。通过定义备用方案或返回默认值来处理失败情况。
常用工具Resilience4j、Hystrix(已弃用)Resilience4j、Hystrix
侧重点提高系统的稳定性,防止故障的扩散。提高系统的可用性,防止因服务不可用导致的用户体验差。

11.sql执行比较慢排查思路

explain 索引、涉及行数

12.哪些情况会索引失效

1、全值匹配(最好的)
2、最佳左前缀法则
从索引最左列开始,并且不跳过索引中的列
跳过第一个,会索引失效
跳过中间一个,只有第一个生效
语句中索引列顺序可以颠倒,不影响从左到右的判断

3、索引列上使用函数会索引失效
不使用计算、类型转换等函数,会导致索引失效

4、>和<范围条件右边的索引失效
组合索引中
a=0,b=0,c=0条件正常使用索引
a=0,b>0,c=0会导致c索引失效

5、!=和<>会索引失效
6、or会
7、like以%开头;
8、需要类型转换;
9.where中索引列有运算;
10、is not null

13.jvm内存结构

image.png

14.线程池原理

15.线程池里提交了一个任务执行流程

image.png

当线程池无法接受新任务时,会触发拒绝策略,内置的拒绝策略有四种:

  1. 默认策略,直接抛出 RejectedExecutionException 异常。
  2. CallerRunsPolicy:由调用者线程执行任务。
  3. DiscardPolicy:默默地丢弃任务,没有任何异常抛出。
  4. DiscardOldestPolicy:尝试抛弃队列中最旧的任务,然后重新尝试提交当前任务。
  5. 自定义拒绝策略

16.springboot自动装配

SpringBoot项目中 @SpringBootApplication组合注解,这个注解是对三个注解进行了封装: @SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@EnableAutoConfiguration 主要负责自动装配功能

1.这个注解引入了@Import
2.项目启动加载IOC容器时,会解析@Import注解
3.@Import导入了一个deferredImportSelector导入器
4.然后读取所有的 META-INF/spring.factories文件
5.过滤出所有AutoConfigurtionClass类型(符合自动装配条件)的类
6.通过@Condition排除无效自动配置类
7.最后将过滤出的类导入spring容器中

@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些加载到IoC容器中。

17.spring事务传播行为

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)


@Transactional(propagation = Propagation.REQUIRED)
如果当前方法已经在一个事务中运行,则加入这个事务;如果没有事务,则新建一个事务。

@Transactional(propagation = Propagation.REQUIRES_NEW)
总是启动一个新的事务,如果当前已经有事务存在,则将当前事务挂起,直到新事务完成后再恢复。

@Transactional(propagation = Propagation.NESTED)
如果当前有事务,则在当前事务内启动一个嵌套事务。如果当前没有事务,则行为类似于 `PROPAGATION_REQUIRED`,即新建一个事务。
嵌套事务可以回滚,但父事务不受影响

@Transactional(propagation = Propagation.SUPPORTS)
如果当前方法已经在事务中运行,则参与该事务;如果没有事务,则以非事务方式执行。