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 万时,单体应用往往更高效 。微服务的核心价值在于解决大规模团队协作和复杂业务演进的问题,而非单纯的技术先进性

相关推荐
郝学胜-神的一滴2 小时前
系统设计:新鲜事系统扩展与优化
java·python·职场和发展·php·软件工程·软件构建
爱吃烤鸡翅的酸菜鱼2 小时前
Maven中BOM(Bill of Materials)的使用详解
java·中间件·maven·源代码管理
XS0301062 小时前
Java 基础(七)多态
java·开发语言
不知名的老吴2 小时前
一文读懂:单例模式的经典案例分析
java·开发语言·单例模式
yaoxin5211232 小时前
388. Java IO API - 处理事件
java·服务器·数据库
JAVA学习通2 小时前
AI 工作流编排系统的任务拆分、重试与观测:2026年工程实践深度解析
java·人工智能·spring
凤山老林2 小时前
27-Java final 关键字
java·开发语言
少许极端2 小时前
算法奇妙屋(四十九)-贡献法
java·算法·leetcode·贡献法
卷毛的技术笔记2 小时前
从零到一:深入浅出分布式锁原理与Spring Boot实战(Redis + ZooKeeper)
java·spring boot·redis·分布式·后端·面试·java-zookeeper