java面试-微服务篇

微服务(Microservices)是一种软件架构风格,将单体应用拆分为一组小型、独立部署的服务,每个服务围绕业务能力构建,通过轻量通信机制协作。以下是 Java 领域的完整解析:

一、核心定义

单体应用 vs 微服务

表格

|----------|--------------------|------------------------|
| 特性 | 单体应用(Monolith) | 微服务(Microservices) |
| 代码结构 | 所有模块在一个代码库 | 每个服务独立代码库 |
| 部署单位 | 整个应用一起部署 | 服务独立部署 |
| 技术栈 | 通常统一技术栈 | 各服务可选不同技术 |
| 扩展方式 | 整体复制扩容 | 仅扩容瓶颈服务 |
| 故障隔离 | 一处崩溃全系统宕机 | 单服务故障不影响全局 |
| 团队规模 | 百人协作困难 | 小团队自治 |

微服务的本质特征

  • 单一职责:一个服务只做一件事(如订单服务、用户服务)
  • 独立部署:修改订单服务无需重新发布用户服务
  • 去中心化:无集中式 ESB,服务间直接通信
  • 容错设计:服务故障快速失败,不级联扩散

二、Java 微服务技术栈

核心框架层

表格

|--------------------------|-----------|---------------------------|
| 框架 | 定位 | 特点 |
| Spring Boot | 服务开发基础 | 自动配置、内嵌服务器、快速启动 |
| Spring Cloud | 微服务治理全家桶 | 集成 Netflix 组件,Java 生态最成熟 |
| Spring Cloud Alibaba | 阿里开源替代方案 | Nacos、Sentinel、Seata,国内主流 |
| Micronaut | 云原生框架 | 编译期 AOP,启动极快,内存占用低 |
| Quarkus | 容器/K8s 优化 | 原生镜像支持,冷启动毫秒级 |
| Dubbo | RPC 框架 | 阿里开源,高性能二进制通信 |

基础设施层

复制代码
┌─────────────────────────────────────────┐
│           网关层 (Gateway)               │
│    Spring Cloud Gateway / Zuul          │
├─────────────────────────────────────────┤
│           服务注册与发现                  │
│    Nacos / Consul / Eureka              │
├─────────────────────────────────────────┤
│           配置中心                       │
│    Nacos Config / Spring Cloud Config   │
├─────────────────────────────────────────┤
│           负载均衡                       │
│    Ribbon / Spring Cloud LoadBalancer   │
├─────────────────────────────────────────┤
│           服务调用                       │
│    OpenFeign / RestTemplate / Dubbo     │
├─────────────────────────────────────────┤
│           熔断限流                       │
│    Sentinel / Hystrix / Resilience4j    │
├─────────────────────────────────────────┤
│           链路追踪                       │
│    SkyWalking / Zipkin / Sleuth         │
├─────────────────────────────────────────┤
│           分布式事务                     │
│    Seata / Saga 模式 / TCC              │
└─────────────────────────────────────────┘

三、微服务拆分原则

拆分策略

表格

|------------|------------|----------------------------|
| 策略 | 说明 | 示例 |
| 按业务边界 | DDD 限界上下文 | 订单域、用户域、库存域 |
| 按数据独立性 | 数据变更频率和关联度 | 商品主数据 vs 商品评论 |
| 按读写分离 | 读多写少分离 | 商品搜索服务(ES)vs 商品管理服务(MySQL) |
| 按团队边界 | 康威定律 | 订单团队维护订单服务 |

四、优缺点分析

✅ 优点

表格

|----------|--------------------------------------|
| 优点 | 业务价值 |
| 独立扩展 | 秒杀时仅扩容订单服务,节省 70% 服务器成本 |
| 技术异构 | 推荐服务用 Python + TensorFlow,交易服务用 Java |
| 故障隔离 | 评论服务宕机,商品详情页仍可展示 |
| 团队自治 | 小团队独立开发、测试、部署,发布周期从天缩短到小时 |
| 渐进演进 | 单体应用可逐步拆分,无需推倒重来 |

❌ 缺点

表格

|------------|-----------------------|
| 缺点 | 应对策略 |
| 分布式复杂度 | 引入服务网格(Istio)降低治理成本 |
| 数据一致性难 | 采用 Saga 模式、最终一致性设计 |
| 运维成本高 | 使用 K8s + DevOps 平台自动化 |
| 网络延迟 | 本地缓存 + 异步化 + 合并请求 |
| 测试复杂 | 契约测试(Pact)+ 自动化环境 |

五、与 SOA 的区别

表格

|----------|-----------------|---------------|
| 维度 | SOA(面向服务架构) | 微服务 |
| 服务粒度 | 粗粒度(多个业务聚合) | 细粒度(单一业务) |
| 通信方式 | 重量级 ESB(企业服务总线) | 轻量级 HTTP/gRPC |
| 数据库 | 通常共享数据库 | 每个服务独立数据库 |
| 部署 | 集中式部署 | 独立容器化部署 |
| 治理 | 集中强管控 | 去中心化自治 |

六、演进路径

复制代码
单体应用(Spring Boot)
    ↓
    数据库拆分(垂直分库)
    ↓
    提取公共服务(用户中心、支付中心)
    ↓
    网关 + 注册中心(Spring Cloud Gateway + Nacos)
    ↓
    全面微服务化(服务网格 + K8s)
    ↓
     Serverless / 函数计算(FaaS)

微服务不是银弹,团队规模 < 10 人、日活 < 10 万时,单体应用往往更高效 。微服务的核心价值在于解决大规模团队协作和复杂业务演进的问题,而非单纯的技术先进性

相关推荐
小新同学^O^1 分钟前
简单学习 --> WebSocket
java·websocket·网络协议·学习
敲代码的瓦龙30 分钟前
Java?枚举!!!
java·开发语言
NiceCloud喜云40 分钟前
IntelliJ IDEA 保姆级安装 + ClaudeAPI 配置教程
java·开发语言·前端·ide·chrome·docker·intellij-idea
孙69034243 分钟前
swf 图片转 pdf
java·后端
用户46825574591344 分钟前
Spring AI MCP 实战:tools/list 启动快照陷阱与完整解法
java
吴声子夜歌1 小时前
Java——EnumMap和EnumSet
java·enumset·enummap
gjwjuejin1 小时前
从 Vue 2 到 Vue 3:一位前端工程师的实战学习笔记
java
3D探路人1 小时前
模灵 大模型聚合API 转发流程技术实现
java·大数据·开发语言·前端·人工智能·计算机视觉
程似锦吖2 小时前
无中生有 之 从0开始写一个动态定时任务管理
java·开发语言
techdashen2 小时前
dial9:给 Tokio 装上“飞行记录仪“
java·数据库·redis