哎呀呀 不喜欢视频面试 感觉线下面容易点
岗位职责:
1.负责Java平台的开发工作,包括但不限于设计、编码、测试、维护;
2.参与系统架构设计,优化系统性能,保证系统稳定运行;
3.根据项目需求,协同团队完成软件项目的开发与实施。
任职要求:
1.具备扎实的Java编程技能,熟悉Java相关框架;
2.具有良好的分析和问题解决能力,能独立完成模块的设计和开发;
3.良好的团队合作精神和沟通能力,能够高效配合团队完成开发任务;
4.具有持续学习的意愿,能够跟踪和学习新技术。
笔试题目
1.请说说用过springcloud哪些组件,这些组件分别有什么作用
gateway、zuul 网关
eureka 注册中心
nacos 注册中心、配置中心
Ribbon 负载均衡
Hystrix 服务容错
springcloudSecurity 安全机制
openfeign 服务间调用
2.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容器中。
3.请说一下Netty中Reactor模式的理解
Netty 是基于 Java NIO 的异步事件驱动的网络应用框架
在Netty中,Reactor模式是高并发、高效能的网络通信模型的基础,它通过事件循环的方式,将I/O事件的监听和处理解耦,提高了系统的并发处理能力和响应性能。Netty通过灵活的 EventLoop、ChannelPipeline 和 ChannelHandler 等机制,使得Reactor模式在实际应用中更加高效、灵活和可定制化。
4.nacos是怎么推送配置到本地的?新增和修改有区别吗?
Nacos 通过 长轮询(Long Polling) + 事件监听 实现配置实时推送,核心流程如下:
-
客户端注册监听
启动时,客户端向 Nacos 服务端订阅特定配置(通过Data ID + Group标识),服务端记录监听关系。- 新增配置:服务端插入新配置记录,触发监听器推送。
- 修改配置:更新配置内容后,立即通知所有订阅该配置的客户端。
-
长轮询推送
客户端发起长轮询请求,服务端保持连接直至配置变更或超时(默认 30 秒)。一旦有变更,服务端返回新配置数据。 收到推送后,客户端校验配置完整性(如 MD5 哈希值),若一致则更新本地缓存,并触发业务监听回调。
- 一致性:客户端校验配置哈希,避免脏更新。
- 高效性:仅传输增量内容,减少网络开销。
通过这一机制,Nacos 确保配置变更快速、可靠地同步到客户端。
新增配置:如果是新增配置项,客户端会接收到一个全新的配置,不会与任何旧的配置进行对比。
修改配置:如果是修改配置项,客户端会收到配置内容的更新,通常会比对新旧配置,如果是值的更新,客户端会更新本地的值。
5.如何提升RocketMQ顺序消费性能?
6.线上问题排查MQ消息队列消息堆积问题排查和解决思路?
消息堆积问题的解决需从 生产端、消费端、MQ服务端 三方面综合排查,重点关注 速率匹配、资源瓶颈、异常处理。
核心原则:
快速止损:通过扩容、限流、隔离恢复业务。
根因分析:结合监控与日志定位性能或逻辑缺陷。
架构优化:通过异步化、批处理、弹性设计预防复发。
生产者
生产者限流:通过令牌桶算法控制发送速率。
MQ
设置消息过期时间(TTL),防止无效消息长期堆积。
清除不重要消息
消费者
扩容消费者
7.分布式锁的几种实现方式
数据库唯一索引(悲观锁\乐观锁)
redis setnx
Redisson
8.ribbon和feign的区别
| 特性 | Ribbon | Feign |
|---|---|---|
| 主要功能 | 客户端负载均衡 | 声明式 HTTP 客户端,简化服务间通信 |
| 核心作用 | 选择合适的服务实例进行请求 | 简化服务调用,自动发起 HTTP 请求并返回响应 |
| 是否需要手动处理请求 | 需要手动处理 HTTP 请求和响应,负载均衡仅仅是功能之一 | 不需要手动处理 HTTP 请求和响应,自动封装请求过程 |
| 负载均衡 | 需要与其他工具(如 RestTemplate)配合使用负载均衡 | 自动集成 Ribbon,提供负载均衡功能 |
| 使用复杂度 | 较高,需要手动编写和管理请求 | 较低,通过接口和注解来声明服务调用 |
| 与 Ribbon 的集成 | 需要手动集成负载均衡策略 | 自动集成 Ribbon,简化了负载均衡配置 |
| 适用场景 | 自定义服务调用,负载均衡处理复杂的业务逻辑 | 简化的服务调用,适用于微服务间的 HTTP 请求 |
9.线上的API接口响应比较慢,该如何快速排查和定位问题?
1.监控工具和日志分析
2. 网络性能
3. 数据库性能
4. 缓存使用
5. 代码层面分析
6. 负载均衡和高可用
等等
10.如何设计一个高效的缓存系统?
设计一个高效的缓存系统需要综合考虑 命中率、延迟、容量、一致性、扩展性 和 容灾能力
面试题目
1.kafka消息是有序的吗
分区内有序
跨分区无序
2.如何保证有序
确保顺序性时,通常的做法是确保同类型的消息发送到同一个分区。
3.乐观锁及其原理
CAS操作有三个参数:
- 内存地址(V) :表示要操作的内存位置或变量。
- 旧值(A) :预期当前内存位置的值。
- 新值(B) :如果当前值等于旧值A,则将内存位置的值更新为B。
CAS的工作步骤如下:
- 比较:将当前内存地址的值(V)与旧值A进行比较。
- 交换:如果V与A相等,则将V更新为新值B;如果V与A不相等,则不进行更新,返回操作失败。
CAS的操作流程
- 获取当前内存地址的值V。
- 如果V等于预期的旧值A,就将内存地址的值V更新为新值B。
- 如果V不等于A,表示有其他线程已经修改了该值,操作失败,返回一个失败的状态。
- 需要重新尝试进行CAS操作,直到成功为止。
CAS是实现高效并发控制的基础机制,利用硬件支持的原子操作来替代传统的锁机制,从而提高并发性能。尽管CAS在许多场景中表现出色,但也存在一些问题,如ABA问题和自旋锁的性能问题,使用时需要根据具体的应用场景来考虑如何解决这些问题。
4.秒杀怎么设计
其他不记得了