跳到主要内容

微服务基础

问题

什么是微服务架构?和单体架构相比有什么优缺点?前端需要了解哪些?

答案

单体 vs 微服务

维度单体微服务
开发效率初期快,后期慢初期慢,后期快
部署整体部署独立部署
扩展整体扩展按需扩展
技术栈统一可各自选择
复杂度代码复杂运维复杂
数据一致性简单(单库事务)复杂(分布式事务)

微服务核心概念

1. API 网关

gateway-concept.ts
// API 网关是微服务的统一入口
interface APIGateway {
routing: '将 /api/users → 用户服务,/api/orders → 订单服务';
authentication: '统一认证,下游服务只处理业务逻辑';
rateLimit: '统一限流,保护后端服务';
loadBalance: '负载均衡到多个服务实例';
transform: '请求/响应数据转换';
}

// Nginx 作为简单 API 网关
// location /api/users/ → proxy_pass http://user-service;
// location /api/orders/ → proxy_pass http://order-service;

2. 服务间通信

communication.ts
// 同步通信:HTTP / gRPC
// 适用于需要立即响应的场景

// 异步通信:消息队列
// 适用于不需要立即响应的场景
interface CommunicationPatterns {
sync: {
http: 'RESTful API,简单通用';
grpc: '高性能二进制协议,适合内部通信';
};
async: {
messageQueue: '通过队列异步通信,解耦服务';
eventDriven: '发布事件,感兴趣的服务自行订阅';
};
}

3. 服务发现

service-discovery.ts
// 服务注册与发现:服务实例动态注册,消费方动态查找
interface ServiceDiscovery {
// 客户端发现:客户端查询注册中心,自己选择实例
clientSide: 'Eureka, Consul (客户端负载均衡)';

// 服务端发现:通过负载均衡器代理,客户端不感知
serverSide: 'Nginx, K8s Service, AWS ALB';
}

// 在 K8s 中,Service 自动做服务发现
// 用服务名即可访问:http://user-service:3000/api/users

前端与微服务的关系

前端视角

前端通常不直接与各微服务通信,而是通过 BFF(Backend for Frontend)API 网关 统一访问。

前端需要关注:

  1. BFF 层:可能由前端团队维护,负责聚合多个微服务的数据
  2. 接口协调:不同微服务的 API 风格可能不一致
  3. 错误处理:某个微服务挂了,如何降级展示
  4. 微前端:一个微服务对应一个前端子应用

常见面试问题

Q1: 什么时候该用微服务?

答案

不是所有项目都需要微服务。 适用条件:

  • 团队 > 10 人,需要独立开发和部署
  • 业务模块边界清晰
  • 不同模块有不同的扩展需求
  • 有成熟的 DevOps 基础设施

不建议用微服务的场景

  • 小团队(< 5 人)
  • 创业初期,业务还在快速变化
  • 没有 K8s 等编排能力

Q2: BFF 层的作用是什么?

答案

BFF(Backend for Frontend)是为前端定制的后端服务层:

  1. 接口聚合:一个页面需要的数据可能来自 5 个微服务,BFF 聚合后返回一个接口
  2. 数据裁剪:后端返回全量数据,BFF 只返回前端需要的字段
  3. 格式转换:统一不同微服务的数据格式
  4. 针对端优化:Web 和 Mobile 可以有不同的 BFF

Q3: 微服务间如何保证数据一致性?

答案

不使用分布式事务(太复杂),而是最终一致性

  1. Saga 模式:一系列本地事务,通过事件协调,失败时执行补偿操作
  2. Event Sourcing:通过事件驱动,各服务消费事件后更新自己的数据
  3. Outbox Pattern:事务中将事件写入 outbox 表,异步发布到消息队列

Q4: 微服务拆分的原则?

答案

  1. 业务边界:按照业务领域拆分(DDD 限界上下文)
  2. 数据独立:每个服务有自己的数据库
  3. 独立部署:修改一个服务不影响其他服务
  4. 团队对齐:一个团队负责一个或几个服务

Q5: 前端工程师为什么要了解微服务?

答案

  1. 现代前端经常需要维护 BFF 层(Node.js)
  2. 微前端架构与微服务思想一致
  3. 需要理解后端架构才能合理设计前端架构
  4. 排查问题时需要理解请求链路

相关链接