技术支持:考ACCA技术社区 📧 service@kaoacca.cn 📱 微信公众号:kaoacca_tech
一、Java架构师面试核心考点全景

1.1 架构能力模型与面试评估维度

Java架构师面试不仅考察技术深度,更注重工程思维、系统设计能力和业务抽象能力。主流大厂采用四维评估模型:

  • 技术深度:JVM原理、并发编程、网络编程、设计模式应用
  • 架构广度:微服务、分布式、中间件、云原生、DevOps
  • 工程能力:可扩展性设计、容错降级、灰度发布、监控告警
  • 业务理解:领域建模、限界上下文、事件风暴、技术选型权衡

例如在阿里P7/P8职级晋升中,架构设计题占比高达40%,要求候选人现场绘制系统架构图并阐述技术选型依据。

1.2 高频必考TOP10问题精解

微服务拆分原则

微服务拆分不是越小越好,需遵循高内聚低耦合原则:

  • 业务能力单一:每个服务对应一个明确的业务能力边界
  • 数据自治:服务拥有独立数据库,避免跨服务直接JOIN
  • 团队规模匹配:康威定律——系统架构受制于组织沟通结构
  • 演进成本可控:拆分粒度应支持独立部署、独立扩展

示例:电商系统拆分建议:用户中心、商品中心、订单中心、支付中心、库存中心、营销中心。

“拆分过细导致运维成本激增,过粗则失去微服务优势。建议从领域驱动设计(DDD)出发,通过事件风暴识别核心领域。”

分布式事务方案

常见方案对比:

方案 适用场景 一致性 性能 复杂度
2PC(XA) 强一致性要求,数据量小 强一致 低 中
Seata AT Java应用,需自动回滚 最终一致 中 低
Saga 长事务、跨系统 最终一致 高 高
消息事务(RocketMQ) 异步解耦场景 最终一致 高 中

实际案例:某支付系统采用Seata+本地事务表实现订单-支付-通知的最终一致。

高并发限流策略

限流三板斧:

  • 接入层限流:Nginx limit_req + IP限速
  • 应用层限流:Sentinel(QPS/线程数/热点参数)
  • 降级熔断:Hystrix/Sentinel fallback机制

实战案例:某秒杀系统采用令牌桶算法+热点参数限流,QPS从10万提升至80万,接口成功率保持99.95%。

// Sentinel配置示例
@SentinelResource(value = "seckillService",
    blockHandler = "handleBlock",
    fallback = "handleFallback")
public String seckill(Long userId) {
    // 业务逻辑
}

JVM调优实战

调优核心指标:GC频率、STW时间、内存利用率

  • Young GC频繁 → 堆内存太小/Eden区比例失调
  • Full GC频繁 → 老年代溢出/元空间溢出
  • STW过长 → G1适用大内存(8GB+),ZGC适用于超低延迟场景

调优参数示例:

java -Xms4g -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:G1HeapRegionSize=4m \
  -XX:+ParallelRefProcEnabled \
  -XX:+ExplicitGCInvokesConcurrent \
  -jar app.jar

某金融系统调优后,Full GC从每小时5次降至每周1次,P99延迟从120ms降至28ms。

缓存一致性策略

经典三方案:

  • Cache Aside Pattern:读走缓存,写走DB+删缓存(最常用)
  • Read Through:应用读缓存,缓存未命中时由缓存层读DB
  • Write Behind:先写缓存,异步刷DB(适用于写多读少场景)

防雪崩策略:

  • 设置随机过期时间(baseTime ± 10%)
  • 热点数据永不过期+异步刷新
  • 互斥锁重建缓存(Redis SETNX)

某社交APP采用Redis+Lua实现分布式锁+缓存双删,一致性错误率降至0.001%。

服务注册发现机制

主流方案对比:

组件 一致性算法 健康检查 适用场景
Eureka AP(自保模式) 客户端心跳 中小规模,容忍最终一致
Consul CP(Raft) HTTP/TCP/脚本 强一致性要求
Nacos CP+AP切换 HTTP/TCP/MySQL 阿里生态,配置中心集成
Zookeeper CP(ZAB) 会话超时 传统分布式协调

注:Nacos默认AP模式,支持CP模式切换(-Dnacos.member.list配置)。

链路追踪原理

OpenTracing标准三要素:

  • TraceID:全局唯一,贯穿整条调用链
  • SpanID:单次调用标识,父子关系通过parentSpanID关联
  • Context:跨进程传递的上下文信息

部署架构:

应用 → Agent → Collector → Storage → UI
       ↓
    Zipkin/Jaeger

某物流系统接入SkyWalking后,定位慢接口平均耗时从45分钟缩短至3分钟。

分布式锁实现

Redis锁实现要点:

  • SETNX + EXPIRE原子化(Lua脚本)
  • 锁续期(Watchdog机制)
  • 锁自动过期防死锁
  • 解铃还须系铃人(UUID校验)

RedLock问题:多节点锁在网络分区下失效,推荐使用Zookeeper或Redis单节点+Lua实现。

SET lock:order:123 ${uuid} NX PX 30000

某库存扣减系统采用Redisson实现分布式锁,超卖率从0.5%降至0.0001%。

系统安全架构

五层防护体系:

  • 网络层:WAF、DDoS防护、IP黑白名单
  • 传输层:TLS 1.3、HSTS、证书校验
  • 应用层:JWT鉴权、参数校验、SQL注入过滤
  • 数据层:敏感字段加密(SM4)、脱敏
  • 运维层:最小权限原则、日志审计

某金融APP通过WAF+参数白名单,拦截SQL注入攻击237次/日。

技术选型权衡

选型四要素:

  • 业务阶段:初创期重效率,成熟期重稳定
  • 团队能力:优先选择团队熟悉的生态
  • 成本预算:云服务 vs 自建集群
  • 扩展性:能否平滑升级、水平扩展

反面案例:某团队为追求新技术强行引入K8s,运维成本翻倍,最终回滚至Docker Compose。

二、微服务架构深度解析

2.1 Spring Boot核心原理

自动配置机制:

  • @EnableAutoConfiguration:通过AutoConfigurationImportSelector加载候选配置
  • 条件注解:@ConditionalOnClass/@ConditionalOnMissingBean
  • 元数据配置:META-INF/spring.factories定义自动配置类

实际案例:某系统自定义AutoConfiguration实现数据库连接池动态切换,避免硬编码。

2.2 Spring Cloud组件选型

服务调用

对比表格:

组件 协议 负载均衡 容错
RestTemplate + Ribbon HTTP 客户端轮询 Hystrix
OpenFeign HTTP 集成Ribbon 集成Hystrix
Spring Cloud Gateway HTTP/WebSocket Reactor模式 Sentinel集成

推荐:新项目统一使用Gateway+OpenFeign,旧系统逐步迁移。

配置中心

Nacos vs Apollo对比:

特性 Nacos Apollo
配置格式 YAML/Properties/JSON YAML/Properties/JSON
灰度发布 支持(按IP/权重) 支持(按集群)
配置审计 支持 支持
多环境 支持(Namespace) 支持(Environment)

建议:阿里系用Nacos,非阿里系用Apollo,中小项目可考虑Consul。

网关

Gateway核心功能:

  • 路由(Route)+ 断言(Predicate)+ 过滤器(Filter)
  • 限流(RedisRateLimiter)
  • 熔断(HystrixGatewayFilterFactory)
  • 鉴权(JwtTokenFilter)

配置示例:

- id: user-service
  uri: lb://user-service
  predicates:
    - Path=/api/user/**
  filters:
    - AddRequestHeader=X-Version, v2
    - StripPrefix=1

2.3 DDD在微服务中的实践

核心概念:

  • 限界上下文:明确服务边界,避免上下文混淆
  • 聚合根:统一管理聚合内对象的生命周期
  • 领域事件:跨服务通信(@DomainEvents)
  • 防腐层:隔离外部系统变更影响

某电商订单域拆分实践:

“订单聚合根包含:Order(聚合根)、OrderItem(实体)、DeliveryAddress(值对象)。支付事件通过领域事件触发库存服务扣减。”

三、分布式系统设计要点

3.1 分布式ID生成方案

主流方案对比:

方案 优点 缺点 适用场景
UUID 简单、全局唯一 无序、存储空间大 日志追踪
雪花算法 趋势递增、高性能 依赖时间、时钟回拨问题 通用业务ID
Redis INCR 顺序递增、支持高并发 依赖Redis可用性 订单号生成
Leaf(美团) 高可用、支持号段模式 需额外部署 大型分布式系统

雪花算法优化点:

  • 时钟回拨处理:等待或抛异常
  • workerId动态分配:Zookeeper注册
  • 时间戳精度:毫秒级→微秒级(需调整位数)

3.2 分布式配置中心

Nacos核心能力:

  • 配置管理:支持YAML/Properties/JSON格式
  • 灰度发布:按IP/权重/命名空间发布
  • 配置监听:长轮询机制(客户端定期拉取)
  • 历史版本:支持配置回滚(最多保留30天)

配置示例:

spring:
  application:
    name: order-service
  cloud:
    nacos:
      config:
        server-addr: nacos-server:8848
        namespace: prod-namespace
        group: DEFAULT_GROUP
        file-extension: yaml

某系统通过Nacos动态调整线程池参数,无需重启服务。

3.3 分布式任务调度

XXL-JOB vs Elastic-Job对比:

特性 XXL-JOB Elastic-Job
注册中心 DB Zookeeper
分片策略 支持 支持(基于ZK)
失败重试 支持(自动+手动) 支持(三次重试)
依赖 零依赖(仅需DB) ZK + Curator

某日志分析系统采用XXL-JOB实现每小时增量同步,任务成功率99.99%。

四、高并发系统设计实战

4.1 秒杀系统架构

核心优化点:

  • 前端限流:按钮防抖、倒计时锁
  • 库存预热:Redis预扣库存(Lua原子操作)
  • 请求排队:RocketMQ异步解耦
  • 库存扣减:乐观锁+版本号
  • 订单创建:异步写库+实时回调

架构图:

用户 → CDN静态页 → Nginx限流 → Redis预扣库存
                           ↓
                      MQ队列排队
                           ↓
                    订单服务异步处理
                           ↓
                      库存服务回调

某大促系统峰值QPS达25万,超卖率0.0001%。

4.2 热点数据处理

热点发现:

  • 基于访问频率动态识别(如Redis HyperLogLog)
  • 预热关键商品库存(提前加载至Redis)
  • 分层缓存:本地缓存(Caffeine)+ 分布式缓存

热点Key解决方案:

  • 互斥重建:SETNX + UUID校验
  • 逻辑过期:后台线程异步刷新
  • 多级缓存:本地缓存兜底

某社交APP通过Caffeine+Redis双层缓存,热点商品查询P99延迟从85ms降至12ms。

4.3 线程池最佳实践

线程池参数配置:

场景 corePoolSize maxPoolSize queueCapacity
CPU密集型 核心数+1 同core 0
IO密集型 2×核心数 3×核心数 1000
混合型 动态调整 动态调整 1000~5000

拒绝策略:

  • CallerRunsPolicy:调用者线程执行(适合降速)
  • AbortPolicy:抛异常(默认)
  • DiscardPolicy:静默丢弃(需日志记录)

某订单服务线程池优化后,线程上下文切换减少40%,TPS提升25%。

五、数据库架构设计

5.1 分库分表策略

常见方案:

  • 垂直拆分:按业务拆(用户库/订单库/商品库)
  • 水平拆分:按ID哈希/范围/时间拆
  • 读写分离:主库写+从库读(延迟监控)

分片键选择原则:

  • 高频率查询字段
  • 高区分度字段(避免所有数据打到一个分片)
  • 业务强关联字段(如订单号、用户ID)

某订单系统采用用户ID分片,10张订单表,单表2亿数据,查询性能稳定在20ms内。

5.2 索引优化实战

索引设计原则:

  • 最左前缀:联合索引(a,b,c)可匹配a、a+b、a+b+c
  • 避免回表:覆盖索引(SELECT字段包含在索引中)
  • 避免函数操作:WHERE YEAR(create_time)=2023 → create_time BETWEEN ...
  • 前缀索引:长字符串字段截取前N字符建索引

执行计划分析:

EXPLAIN SELECT * FROM orders WHERE user_id=123 AND status=1;
-- key: idx_user_status, type: range, rows: 1500 (优化后)

某系统通过调整索引顺序+覆盖索引,查询从1.2s降至8ms。

5.3 数据库连接池

HikariCP vs Druid对比:

特性 HikariCP Druid
性能 最高(字节码增强) 中等
监控 基础监控 SQL防火墙、慢查询分析
配置 简洁 丰富(30+参数)
适用场景 高性能要求 需要深度监控

HikariCP核心参数:

spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
六、系统安全架构

6.1 鉴权体系

JWT安全实践:

  • 签名算法:RS256(非对称加密)优于HS256
  • Token有效期:短期(15-30分钟)+ Refresh Token
  • 防重放攻击:Nonce + Timestamp校验
  • 服务端黑名单:退出登录时加入Redis黑名单

代码示例:

Claims claims = Jwts.parser()
    .setSigningKey(publicKey)
    .parseClaimsJws(token)
    .getBody();
// 检查黑名单
Boolean isBlacklisted = redisTemplate
    .opsForSet()
    .isMember("blacklist:tokens", token);

6.2 数据安全

敏感数据处理:

  • 加密存储:AES-256加密手机号/身份证号
  • 脱敏展示:@SensitiveInfo注解(如138****1234)
  • 传输加密:HTTPS + TLS 1.3
  • 审计日志:记录操作人/时间/IP/操作内容

某金融系统通过SM4国密算法加密用户敏感数据,通过等保三级认证。

6.3 防刷限流

三重防护:

  • 前端:验证码+操作频率限制
  • 网关:Nginx limit_req模块
  • 应用:Sentinel规则(QPS/并发线程数)

某抢票系统通过IP+设备指纹+行为分析,拦截恶意请求98.7%。

七、常用工具链与技术栈

7.1 监控告警体系

ELK + Prometheus + Grafana方案:

  • 日志:Logback → Logstash → Elasticsearch → Kibana
  • 指标:Micrometer → Prometheus → Grafana
  • 链路:SkyWalking → Elasticsearch → UI

关键指标:

指标 告警阈值 影响
接口错误率 >1% 服务异常
GC频率 >5次/分钟 内存泄漏风险
线程池队列 >80% 服务阻塞

7.2 容器化与云原生

K8s部署要点:

  • 资源限制:requests/limits防止资源争抢
  • 健康检查:liveness/readiness探针
  • 滚动更新:maxSurge/maxUnavailable控制
  • 配置分离:ConfigMap/Secret

部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "1Gi"
            cpu: "1000m"

某系统通过K8s自动扩缩容,资源利用率提升40%。

斌知网
蜀ICP备2026017620号-5