服务治理
问题
微服务的服务治理包含哪些核心组件?注册发现、配置中心、网关、熔断限流是如何协同工作的?
答案
服务治理全景
核心组件
| 组件 | 职责 | 主流方案 |
|---|---|---|
| 注册发现 | 服务注册与发现,健康检查 | Nacos、Eureka、Consul |
| 配置中心 | 集中管理配置,动态刷新 | Nacos、Apollo、Spring Cloud Config |
| API 网关 | 路由、鉴权、限流、日志 | Spring Cloud Gateway、Kong |
| 负载均衡 | 分发请求到多个服务实例 | Spring Cloud LoadBalancer |
| 熔断降级 | 防止级联故障 | Sentinel、Resilience4j |
| 链路追踪 | 全链路调用追踪与排查 | SkyWalking、Zipkin |
服务注册与发现
API 网关核心功能
| 功能 | 说明 |
|---|---|
| 路由转发 | 根据路径/Header 将请求路由到对应服务 |
| 认证鉴权 | JWT 验证、OAuth2、API Key |
| 限流熔断 | 基于 IP/用户/接口 的限流 |
| 请求聚合 | 聚合多个后端请求,减少前端调用 |
| 日志记录 | 统一的访问日志和审计 |
| 协议转换 | HTTP → gRPC 等 |
| 灰度发布 | 按规则将部分流量路由到新版本 |
健康检查与优雅停机
Spring Boot Actuator 健康检查
// application.yml
// management:
// endpoints:
// web:
// exposure:
// include: health, info
// endpoint:
// health:
// show-details: always
// 自定义健康检查
@Component
public class DatabaseHealthIndicator implements HealthIndicator {
@Override
public Health health() {
if (isDatabaseUp()) {
return Health.up().withDetail("database", "MySQL is running").build();
}
return Health.down().withDetail("error", "Cannot connect to MySQL").build();
}
}
Spring Cloud 技术栈选型
| 组件 | Spring Cloud Alibaba | Spring Cloud Netflix(已停更) |
|---|---|---|
| 注册中心 | Nacos | Eureka |
| 配置中心 | Nacos | Spring Cloud Config |
| 网关 | Spring Cloud Gateway | Zuul |
| 负载均衡 | Spring Cloud LoadBalancer | Ribbon |
| 远程调用 | OpenFeign | OpenFeign |
| 熔断限流 | Sentinel | Hystrix |
| 链路追踪 | SkyWalking | Sleuth + Zipkin |
当前主流选型
Spring Cloud Alibaba + Nacos + Sentinel + Gateway + OpenFeign 是国内 Java 微服务的事实标准。
常见面试问题
Q1: Nacos 和 Eureka 的区别?
答案:
| 对比 | Nacos | Eureka |
|---|---|---|
| CAP | CP + AP 可切换 | AP |
| 配置中心 | 内置 | 无(需额外组件) |
| 健康检查 | TCP/HTTP/MySQL | 客户端心跳 |
| 雪崩保护 | 有 | 有(自我保护) |
| 维护状态 | 活跃(阿里) | 停更 |
Nacos 功能更全面(注册 + 配置 + 服务管理),是当前首选。
详见 注册中心。
Q2: 网关的作用是什么?没有网关行不行?
答案:
没有网关可以运行,但会有以下问题:
- 客户端需要知道每个服务的地址(耦合)
- 每个服务都需要实现鉴权、限流、日志等横切关注点(重复)
- 跨域、协议转换等需要每个服务处理
网关作为统一入口,集中处理这些横切关注点,让业务服务专注于业务逻辑。
Q3: 服务调用链路过长怎么优化?
答案:
- 减少调用层级:避免 A→B→C→D 的长链路,考虑 BFF 聚合
- 异步化:非关键路径改为异步消息
- 缓存:频繁查询的数据本地缓存/Redis 缓存
- 并行调用:CompletableFuture 并行调用多个服务
- 链路追踪:使用 SkyWalking 定位慢调用