核心组件概述
SpringCloud 5大核心组件包括:注册中心(Eureka/Nacos)、服务调用(Feign)、负载均衡(Ribbon)、服务熔断(Hystrix/Sentinel)、服务网关(Gateway)。
随着SpringCloud Alibaba在国内的兴起,现在更多项目选择阿里巴巴生态:Nacos作为注册中心和配置中心、Ribbon负载均衡、Feign服务调用、Sentinel服务保护、Gateway网关。
服务注册与发现
服务注册发现的核心概念:
- 服务注册:服务启动时向注册中心注册自己的信息(IP、端口、服务名等)
- 服务发现:客户端从注册中心获取服务列表,实现服务间的调用
以Nacos为例的实现流程:
- 服务提供者启动时向Nacos注册服务信息
- 服务消费者从Nacos拉取服务列表
- 消费者通过负载均衡选择具体的服务实例进行调用
- Nacos维护服务的健康状态,自动剔除不健康实例
Ribbon负载均衡
负载均衡策略详解:
- RoundRobinRule:轮询策略,按顺序选择服务器
- WeightedResponseTimeRule:权重策略,响应时间越短权重越高
- RandomRule:随机选择可用服务器
- BestAvailableRule:选择并发数最低的服务器
- RetryRule:重试机制,在指定时间内重试选择服务器
- AvailabilityFilteringRule:可用性过滤,先过滤故障实例再选择连接数小的
- ZoneAvoidanceRule:区域感知策略,优先选择同区域的服务器
自定义负载均衡策略:
- 全局配置:创建类实现IRule接口,通过@Bean注解注册
- 局部配置:在配置文件中为特定服务指定负载均衡策略
# 局部配置示例
service-name:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
服务熔断与降级
熔断机制:
当服务调用失败率达到阈值时,熔断器开启,直接返回错误响应,避免级联故障。熔断器有三种状态:关闭、开启、半开。
降级机制:
当服务不可用时,执行预定义的降级逻辑,返回默认值或友好提示,保证系统基本可用。
Hystrix vs Sentinel:
- Hystrix:Netflix开源,功能成熟但已停止更新
- Sentinel:阿里开源,功能更强大,支持实时监控和规则配置
服务网关Gateway
Gateway的核心功能:
- 路由转发:根据请求路径转发到对应的微服务
- 过滤器:实现认证、限流、监控等横切关注点
- 负载均衡:集成Ribbon实现客户端负载均衡
Gateway vs Zuul:
- Gateway基于Spring 5.0和WebFlux,性能更好
- 支持异步非阻塞编程模型
- 提供更丰富的过滤器和断言功能
服务调用Feign
Feign的特点:
- 声明式HTTP客户端,通过注解定义接口
- 集成Ribbon实现负载均衡
- 集成Hystrix实现熔断降级
- 支持请求/响应压缩和日志记录
Feign vs RestTemplate:
- Feign代码更简洁,易于维护
- RestTemplate更灵活,适合复杂场景
配置中心
Nacos配置中心的优势:
- 集中管理配置,支持动态更新
- 支持多环境配置隔离
- 提供配置版本管理和回滚功能
- 支持配置监听和推送机制
服务监控
微服务监控的重要性:
- 实时了解服务运行状态
- 快速定位和解决问题
- 优化服务性能
常用监控方案:
- Spring Boot Actuator:提供健康检查、指标收集等功能
- Micrometer:指标收集框架,支持多种监控系统
- Prometheus + Grafana:指标收集和可视化展示
- SkyWalking:分布式链路追踪系统
面试常见问题
Q: SpringCloud和Dubbo的区别?
A: SpringCloud是完整的微服务解决方案,基于HTTP通信;Dubbo主要解决RPC调用问题,基于TCP通信,性能更好但功能相对单一。
Q: 如何保证微服务的数据一致性?
A: 通过分布式事务解决方案,如Seata、TCC模式或最终一致性方案(消息队列+补偿机制)。
Q: 微服务拆分的原则是什么?
A: 按业务边界拆分,遵循高内聚低耦合原则,每个服务有独立的数据库和部署单元。
Q: 如何处理分布式系统的CAP问题?
A: 根据业务需求选择CP或AP,通常选择AP(可用性+分区容错),通过最终一致性保证数据一致性。