20240514
- 请描述一下您对springboot的理解
SpringBoot 是一个基于 Spring 的框架,SpringBoot 的理念是约定大于配置,相对于 Spring 的配置而言,SpringBoot 可以让开发者很快的搭建起一个 Spring 应用。一些常用的组件,如数据库、缓存、消息队列等,都可以通过 Starter 来快速的集成到项目中 。
2.请描述过往技术研发经历中遇到印象比较深刻的经历,以及如何应对?
项目上说一个填报系统,在保存报表数据的时候,出现了数据错乱和数据条数对不上的问题,但是这个问题并不是每次都出现。
首先尝试在本地复现问题,在本地尝试了很久,未能复现问题。最后找项目现场要来了日志,看了很久之后,发现有一条将缓存保存到数据库的日志。最后对比代码发现,系统有一个定时固化用户的线程,这个线程会把用户缓存的数据写到数据库中。
阅读代码发现,是在固化的时候没有对资源加锁,致使遍历数据的时候,下标被修改。
最后解决问题的方法是在固化的时候加锁。
3.请描述您在java后端开发中擅长的技术点,并展开谈谈?
在 Java 后端开发方面,我拥有扎实的技术基础和丰富的项目经验。首先,我对 Java 核心编程非常熟悉,具备优秀的编码能力。我熟练应用各种设计模式如单例、策略、模板和责任链等,这些设计模式在提高代码的复用性和可维护性方面发挥了重要作用。在并发编程方面,我有深入理解的 ThreadLocal、synchronized、volatile、以及高级的同步工具如 AQS 和 Lock。我对 Java 线程池的使用和优化也有实际的操作经验,这对提升应用性能和资源利用率非常关键。 我还熟练掌握 JVM 的底层原理,包括内存结构和垃圾回收机制,并具备 JVM 性能调优的实践经验。在数据库方面,我不仅熟悉 MySQL 的使用,还了解其索引和事务机制,能够进行 SQL 的优化,以提高数据库操作的效率。 此外,我对消息队列技术如 RabbitMQ 有深入的了解,熟悉其消息处理和故障恢复机制。在缓存技术方面,我熟练使用 Redis,并了解其数据持久化机制及常见问题如缓存击穿、雪崩和穿透的解决策略。 在系统部 署和网络服务配置方面,我熟练使用 Linux 命令,有 Docker 和 Docker-Compose 的实际操作经验,以及能够根据项目需求优化 Nginx 配置。我还熟练应用包括 Spring、SpringMVC、Spring Boot、MyBatis/Plus 和 Spring Cloud Alibaba 在内的一系列主流开源框架,这些技术的综合运用极大地提升了开发效率和项目的可扩展性。
4.如果让您独立负责一项任务的研发,您会从哪些方面入手?
开发的流程为:
- 首先需要对需求进行分析,要知道这个需求是什么,要实现什么功能。
- 确定好需求之后,写设计文档。
- 根据设计文档进行开发。
- 进行功能测试与压力测试。
其中最重要的是在确定好需求之后,要根据需求写好设计文档,设计文档是开发的基础,是开发的指导。要着重考虑接口的设计,数据的存储结构,以及功能的扩展性。
5.请列举您所知道的技术栈,并谈谈您对这些技术栈的理解?
Spring 技术栈常用的开源库
- MyBatis、MyBatis Plus: ORM 框架,用于操作数据库。
- JWT:认证框架
- Swagger:接口文档,可以根据代码自动生成接口文档。
- Junit:单元测试
- Redission:用于操作 Redis。
常用的组件
- Git:版本控制,管理代码。
- Maven:项目构建工具,管理项目依赖。
- MySQL:关系型数据库,主要用于数据存储,在使用时要考虑 SQL优化,事务,索引等问题。
- Redis:非关系型数据库,主要用于缓存数据,可以实现分布式锁。在使用时要考虑缓存击穿、雪崩、穿透等问题。
- RabbitMQ: 消息队列,用于处理异步任务,在使用的时候要考虑消息丢失、重复消费等问题。
- Jenkins:持续集成
- Nginx:反向代理服务器,可以用来解决负载均衡、反向 代理、解决跨域、配置 SSL 证书等问题。
- Docker:虚拟化容器,可以快速部署应用,提高开发效率。
微服务技术栈
- Nacos:注册中心、配置中心
- OpenFeign:服务调用
- Gateway:网关
- Seata:分布式事务
- Sentinel:降级、限流
- SkyWalking:分布式链路追踪
- Elasticsearch:全文搜索引擎,主要解决 MySQL 的全文搜索效率低的问题。
- Logstash:日志收集,可以将日志收集到 Elasticsearch 中。
- Kibana:数据可视化,可以将 Elasticsearch 中的数据可视化。