这场模拟面试围绕智慧城市物联网项目展开,考察了Java开发者需要掌握的核心技术栈。作为面试官,我特别关注候选人对技术原理的理解深度和实际应用经验。下面我将从技术维度拆解每个问题,并补充面试中未展开的实战细节。
Java 8与Java 17的差异不仅是语法特性,更是工程实践的抉择。在实际项目中,我们坚持使用Java 8通常基于以下考量:
但新项目建议直接上Java 17,因为:
提示:升级前务必用jdeprscan扫描废弃API,用jlink定制最小运行时环境
Maven与Gradle的选择需要结合团队现状:
| 维度 | Maven优势 | Gradle优势 |
|---|---|---|
| 学习曲线 | XML语法简单直观 | Groovy/Kotlin DSL更灵活 |
| 构建速度 | 稳定但较慢(平均慢20-30%) | 增量构建快,支持缓存 |
| 多模块管理 | 需要parent POM | 更优雅的复合构建 |
| 生态插件 | 插件丰富但扩展性差 | 可自定义构建逻辑 |
实战技巧:
--build-cache参数复用缓存服务注册发现只是起点,完整的微服务治理包含:
配置示例:
yaml复制# application.yml
eureka:
client:
serviceUrl:
defaultZone: http://eureka1:8761/eureka/
instance:
health-check-url-path: /actuator/health
lease-renewal-interval-in-seconds: 30
hystrix:
command:
default:
execution:
isolation:
strategy: THREAD
thread.timeoutInMilliseconds: 3000
mermaid复制graph TD
A[需要复杂SQL?] -->|是| B[选择MyBatis]
A -->|否| C[需要快速开发?]
C -->|是| D[选择Hibernate]
C -->|否| E[考虑JOOQ]
连接池关键参数(以HikariCP为例):
maximumPoolSize = Tn * (Cm - 1) + 1connectionTimeout 建议设为3000ms(超过HTTP超时时间)leakDetectionThreshold 生产环境设为60000ms检测连接泄漏智慧城市项目典型缓存方案:
code复制[客户端] → [Nginx本地缓存] → [Redis集群] → [数据库]
↑ ↑
Lua脚本 Redisson锁
避坑指南:
product:{id%100}EXPIRE key 3600 + random(300))| 场景 | Kafka适用性 | RabbitMQ适用性 |
|---|---|---|
| 设备日志采集 | ✅ 分区和压缩效率高 | ⚠️ 性能较差 |
| 实时指令下发 | ⚠️ 延迟较高(100ms+) | ✅ 延迟低(10ms内) |
| 事务消息 | ❌ 不支持 | ✅ 插件支持 |
| 消息回溯 | ✅ 保留7天以上 | ❌ 消费后即删除 |
Kafka调优参数:
properties复制# producer端
linger.ms=20 // 适当增大减少网络请求
compression.type=snappy
# consumer端
fetch.min.bytes=65536 // 提高吞吐量
max.poll.records=500 // 单次拉取条数
标准实现流程:
安全加固措施:
设备接入层:
峰值连接数 = 设备数 × 在线率 × 冗余系数(1.2)数据处理层:
java复制// 使用Spring Integration处理设备消息
@Bean
public IntegrationFlow deviceFlow() {
return IntegrationFlows
.from(Mqtt.inboundAdapter(...))
.transform(new DeviceMessageTransformer())
.handle(redisOutboundGateway())
.get();
}
监控告警:
promql复制rate(device_connect_total[5m]) > 1000 // 连接暴涨告警
process_cpu_usage > 0.8 // CPU过载告警
在准备这类面试时,建议从三个维度构建知识体系:
我自己的经验是,每次技术方案设计后,用ADRs(Architecture Decision Records)文档记录技术选型过程,这既能帮助团队知识传承,也是面试时展示技术深度的好素材。