目录
介绍
Spring Cloud 核心组件是构建微服务架构的基础模块,(按功能层级排序) 少字全意 基础框架需要内容,此为核心 细节扩展外找即可。
一、服务注册与发现 Eureka
- **功能**:服务治理核心组件,提供**服务注册与发现**能力。服务启动时通过 Eureka Client 注册元数据到 Eureka Server(注册中心),其他服务通过查询注册表动态获取服务实例地址
- **特性**:支持高可用集群、心跳续约机制(默认30秒)、自我保护模式(防止因网络波动误删服务)。
二、服务通信与负载均衡 Ribbon、Feign
**Ribbon**
- **功能**:**客户端负载均衡**,基于 HTTP/TCP 请求分配流量。默认策略为轮询(Round Robin),支持自定义策略(如随机、权重等)
- **协作**:与 Eureka 集成,动态获取服务实例列表,避免硬编码地址
**Feign**
- **功能**:**声明式 HTTP 客户端**,通过接口注解简化服务调用。底层基于动态代理自动封装 HTTP 请求,整合了 Ribbon 和 Hystrix,实现负载均衡与容错。
三、容错与熔断 Hystrix
- **功能**:**服务熔断与降级**,防止雪崩效应。通过熔断器机制,在服务故障时快速失败并降级(如返回兜底数据),支持线程隔离和请求监控
- **触发条件**:默认10秒内请求失败率超过50%触发熔断
四、服务网关 Zuul/Gateway
- **Zuul**:早期网关组件,支持路由转发、过滤链(如权限校验、日志记录),但基于同步阻塞模型
- **Gateway**:新一代网关,基于 Netty 实现异步非阻塞,性能更高,支持动态路由、限流、熔断等
五、配置中心 Spring Cloud Config
- **功能**:**集中化管理微服务配置**,支持 Git/SVN 存储配置,实现动态更新
- **协作**:结合 Spring Cloud Bus(消息总线)可实时推送配置变更
组件协作流程示例
以订单服务调用库存服务为例:
1. **注册**:库存服务通过 Eureka Client 注册到 Eureka Server。
2. **发现**:订单服务通过 Feign 调用库存服务时,Ribbon 从 Eureka 获取实例列表并负载均衡。
3. **容错**:若库存服务响应超时,Hystrix 触发熔断,返回降级结果。
4. **网关**:外部请求通过 Gateway 路由到订单服务,执行鉴权、限流等过滤逻辑。
扩展说明
- **替代方案**:部分组件如 Hystrix 已逐步被 Resilience4j、Sentinel 替代,Zuul 被 Gateway 取代,但核心设计理念一致。
- **选型建议**:新项目优先使用 Gateway 替代 Zuul,结合 Nacos(替代 Eureka)实现更灵活的服务治理。
实例 核心代码
Eureka
// Eureka Server 启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApp.class, args);
}
}
// Eureka Client 配置(application.yml)
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${spring.application.name}:${server.port}
Feign
// 定义 Feign 客户端接口
@FeignClient(name = "inventory-service")
public interface InventoryServiceClient {
@PostMapping("/inventory/deduct")
String deductStock(@RequestBody Map<String, Object> params);
}
// 调用示例(在订单服务中)
@Autowired
private InventoryServiceClient inventoryServiceClient;
public void updateOrderStatus() {
inventoryServiceClient.deductStock(params); // 自动发起 HTTP 请求
}
Ribbon 客户端负载均衡
消费者负载均衡 末日轮询 Round Robin 和 Eureka 协作 获取服务实例列表
// 启用负载均衡的 RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 调用服务(自动选择实例)
String url = "http://inventory-service/inventory/deduct";
restTemplate.postForObject(url, params, String.class);
Hystrix 熔断器
防止 服务雪崩 通过熔断隔离故障服务,支撑降级 超时控制
// 服务降级示例
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String callIntegralService() {
// 调用积分服务
}
public String fallbackMethod() {
return "积分服务暂不可用,稍后重试";
}
// 配置熔断策略(application.yml)
hystrix:
command:
default:
execution.isolation.thread.timeoutInMilliseconds: 3000
circuitBreaker.requestVolumeThreshold: 10
Zull/Gateway 网关
统一入口 管理 请求路由 权限校验 限流
// 启用 Zuul 代理
@EnableZuulProxy
@SpringBootApplication
public class GatewayApp {}
// 路由配置(application.yml)
zuul:
routes:
order-service:
path: /order/**
serviceId: order-service
扩展
核心操作流程
服务通过 Eureka 注册 》Feign/Ribbon 实现调用 〉Hystrix 保障稳定性》网关统一路由。
代码关键点
试用@EnableEurekaServer 和EnableEureakClient 快速搭建注册中心和服务节点
通过@FeignClient +接口定义实现无入侵远程调用
结合HystrixCommand 实现服务容错
***************持续更新 易经的方式看技术*************************
***************持续更新 易经的方式看技术*************************