微服务基础
问题
什么是微服务架构?和单体架构相比有什么优缺点?前端需要了解哪些?
答案
单体 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 网关 统一访问。
前端需要关注:
- BFF 层:可能由前端团队维护,负责聚合多个微服务的数据
- 接口协调:不同微服务的 API 风格可能不一致
- 错误处理:某个微服务挂了,如何降级展示
- 微前端:一个微服务对应一个前端子应用
常见面试问题
Q1: 什么时候该用微服务?
答案:
不是所有项目都需要微服务。 适用条件:
- 团队 > 10 人,需要独立开发和部署
- 业务模块边界清晰
- 不同模块有不同的扩展需求
- 有成熟的 DevOps 基础设施
不建议用微服务的场景:
- 小团队(< 5 人)
- 创业初期,业务还在快速变化
- 没有 K8s 等编排能力
Q2: BFF 层的作用是什么?
答案:
BFF(Backend for Frontend)是为前端定制的后端服务层:
- 接口聚合:一个页面需要的数据可能来自 5 个微服务,BFF 聚合后返回一个接口
- 数据裁剪:后端返回全量数据,BFF 只返回前端需要的字段
- 格式转换:统一不同微服务的数据格式
- 针对端优化:Web 和 Mobile 可以有不同的 BFF
Q3: 微服务间如何保证数据一致性?
答案:
不使用分布式事务(太复杂),而是最终一致性:
- Saga 模式:一系列本地事务,通过事件协调,失败时执行补偿操作
- Event Sourcing:通过事件驱动,各服务消费事件后更新自己的数据
- Outbox Pattern:事务中将事件写入 outbox 表,异步发布到消息队列
Q4: 微服务拆分的原则?
答案:
- 业务边界:按照业务领域拆分(DDD 限界上下文)
- 数据独立:每个服务有自己的数据库
- 独立部署:修改一个服务不影响其他服务
- 团队对齐:一个团队负责一个或几个服务
Q5: 前端工程师为什么要了解微服务?
答案:
- 现代前端经常需要维护 BFF 层(Node.js)
- 微前端架构与微服务思想一致
- 需要理解后端架构才能合理设计前端架构
- 排查问题时需要理解请求链路
相关链接
- 设计 BFF 网关层 - BFF 详细设计
- 微前端架构 - 前端微服务化
- NestJS 框架深入 - NestJS 微服务支持