Spring Cloud 基本原理
Spring Cloud 是一套基于 Spring Boot 的微服务架构工具集,通过封装分布式系统的通用模式(如服务发现、配置管理、熔断器等),简化了微服务系统的开发和部署。其核心原理基于以下组件和机制:
服务注册与发现(Eureka/Nacos)
Spring Cloud 通过服务注册中心(如 Eureka 或 Nacos)实现服务动态发现。服务启动时向注册中心注册自身信息(IP、端口、健康状态等),其他服务通过查询注册中心获取依赖服务的实时地址列表。
- 服务注册:服务提供者通过 REST API 向注册中心发送心跳。
- 服务发现:消费者从注册中心拉取服务列表,并通过客户端负载均衡(如 Ribbon)调用目标服务。
客户端负载均衡(Ribbon)
Ribbon 是客户端负载均衡工具,集成在服务消费者中。通过轮询、随机等策略从服务列表中选择实例,避免集中式负载均衡器的单点故障。
@Bean
@LoadBalanced // 启用 Ribbon
public RestTemplate restTemplate() {
return new RestTemplate();
}
声明式服务调用(Feign/OpenFeign)
Feign 通过动态代理生成 HTTP 请求客户端,将 REST 调用简化为接口定义。底层整合 Ribbon 实现负载均衡,并支持熔断降级。
@FeignClient(name = "order-service")
public interface OrderServiceClient {
@GetMapping("/orders/{id}")
Order getOrder(@PathVariable Long id);
}
熔断与降级(Hystrix/Sentinel)
通过熔断器模式防止服务雪崩,当服务调用失败率达到阈值时自动熔断,快速失败并执行降级逻辑。
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String callService() {
// 远程调用
}
分布式配置中心(Config Server/Nacos)
集中管理微服务配置,支持动态刷新。配置存储在 Git 或数据库,客户端通过 /actuator/refresh 端点热更新配置。
spring:
cloud:
config:
uri: http://config-server
label: master
API 网关(Zuul/Gateway)
网关作为统一入口,负责路由转发、鉴权、限流等。Spring Cloud Gateway 基于 WebFlux 实现非阻塞 IO,支持动态路由和过滤器链。
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
分布式链路追踪(Sleuth + Zipkin)
通过 Sleuth 生成请求链路 ID(TraceId/SpanId),Zipkin 收集并可视化调用链,帮助定位延迟问题。
spring:
zipkin:
base-url: http://zipkin-server
sleuth:
sampler:
probability: 1.0 # 采样率
消息驱动(Stream)
基于 Spring Cloud Stream 抽象消息中间件(如 Kafka、RabbitMQ),通过 Binder 实现解耦,简化事件驱动开发。
@StreamListener(Sink.INPUT)
public void handleMessage(String message) {
// 处理消息
}
总结
Spring Cloud 通过标准化组件和自动配置,将分布式系统的复杂性抽象为简单接口。其核心思想是“约定优于配置”,开发者只需关注业务逻辑,而无需重复实现服务治理的基础设施。
以下代码是笔者通过查阅一些资料搭建了一个简单的spring cloud 项目
环境准备 apache-maven-3.9.9+jdk17+mysql数据库
一、EnableEurekaServer服务注册与发现搭建
1、maven仓库配置pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2025.0.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



