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

相关推荐
咖啡八杯14 分钟前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
程序员爱钓鱼26 分钟前
为什么学习 Go?Go 能做什么?
后端·面试·go
阿标在干嘛1 小时前
从HTTP到WebSocket:招投标信息实时推送系统的协议选型与架构设计
大数据·微服务·架构
要开心吖ZSH2 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh7 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯9 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育9 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵9 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影11 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库