面试题答案
一键面试负载均衡策略
- 优化思路:选择更适合高并发场景的负载均衡算法,提高请求分配的合理性,避免部分实例压力过大。
- 技术手段:
- Spring Cloud Ribbon:默认采用轮询算法,可切换为随机算法RandomRule,适用于后端服务处理能力相近场景;或使用加权轮询WeightedResponseTimeRule,根据响应时间动态调整权重,响应时间短的实例分配更多请求。
- Spring Cloud LoadBalancer:支持多种负载均衡算法,如RoundRobinLoadBalancer(轮询)、RandomLoadBalancer(随机),同样可根据实际情况选择并配置。
- Nginx:作为反向代理服务器,可使用ip_hash算法,根据客户端IP地址进行哈希计算,将同一IP的请求始终转发到同一后端服务器,适合有状态服务场景;或使用least - connections算法,将请求转发到连接数最少的后端服务器。
缓存机制
- 优化思路:合理使用缓存,减少对后端数据库等存储系统的访问,降低响应时间。
- 技术手段:
- 本地缓存:在微服务内部使用Guava Cache,适合缓存一些变化频率低且对实时性要求不高的数据,如系统配置信息。通过设置过期时间、最大容量等参数,控制缓存的生命周期和内存占用。
- 分布式缓存:使用Redis作为分布式缓存,存储高并发场景下频繁访问的数据,如热门商品信息。可采用缓存预热机制,在系统启动时将常用数据加载到缓存中;设置合理的缓存过期时间,避免缓存雪崩(大量缓存同时过期导致请求全部落到后端数据库),可采用随机过期时间策略;使用缓存击穿(单个热点缓存失效,大量请求打到后端)解决方案,如加互斥锁,保证同一时间只有一个请求去查询数据库并更新缓存。
数据库连接池
- 优化思路:合理配置数据库连接池参数,提高数据库连接的复用率,减少连接创建和销毁的开销。
- 技术手段:
- HikariCP:是Spring Boot默认的连接池,优化配置参数如
maximumPoolSize
(最大连接数),根据数据库服务器硬件资源和预估并发请求数设置,一般经验值为CPU核心数的2倍 + 1;idleTimeout
(连接空闲超时时间),避免长时间空闲连接占用资源;connectionTimeout
(连接获取超时时间),防止请求长时间等待连接。 - Druid:除了基本的连接池参数配置外,Druid提供丰富的监控功能,可通过配置开启监控统计功能,实时查看连接池状态、SQL执行情况等,以便及时发现性能瓶颈。
- HikariCP:是Spring Boot默认的连接池,优化配置参数如
代码层面优化
- 优化思路:对业务代码进行性能分析,找出性能瓶颈并优化。
- 技术手段:
- 异步处理:对于非关键路径的业务逻辑,使用Spring的
@Async
注解将方法异步执行,避免阻塞主线程。例如用户注册成功后发送通知邮件的操作。 - 减少不必要的数据库操作:在业务逻辑中,合并多次数据库查询为一次,如使用
IN
语句代替多次单条查询;优化SQL语句,通过执行计划分析工具(如MySQL的EXPLAIN
关键字)找出慢查询语句,添加合适的索引,优化表结构。 - 对象复用:避免在高并发场景下频繁创建和销毁对象,使用对象池技术,如Apache Commons Pool,复用对象以减少内存开销和创建对象的时间。
- 异步处理:对于非关键路径的业务逻辑,使用Spring的
资源配置优化
- 优化思路:根据微服务应用的实际需求,合理分配服务器资源。
- 技术手段:
- 垂直扩展:增加服务器的硬件资源,如CPU、内存、磁盘I/O等,提高单个服务器的处理能力。但这种方式存在硬件资源上限,且成本较高。
- 水平扩展:通过增加微服务实例数量,利用负载均衡器将请求分发到多个实例上处理,提高系统整体的并发处理能力。可以使用容器化技术(如Docker)和容器编排工具(如Kubernetes)方便地实现微服务的水平扩展和管理。