Spring Cloud 速查表
本文档提供 Spring Cloud 常用配置、组件和命令的快速参考。基于 Spring Cloud 2024.0.x (Moorgate) 版本。
版本对应关系
| Release Train | Spring Boot 版本 | JDK 版本 |
|---|---|---|
| 2024.0.x (Moorgate) | 3.4.x | 17+ |
| 2023.0.x (Leyton) | 3.3.x, 3.2.x | 17+ |
| 2022.0.x (Kilburn) | 3.0.x, 3.1.x | 17+ |
Maven 依赖管理
BOM 依赖管理
<properties>
<spring-cloud.version>2024.0.0</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
常用依赖
| 依赖 | 说明 |
|---|---|
spring-cloud-starter-netflix-eureka-server | Eureka 服务端 |
spring-cloud-starter-netflix-eureka-client | Eureka 客户端 |
spring-cloud-starter-gateway | API 网关 |
spring-cloud-starter-loadbalancer | 负载均衡器 |
spring-cloud-starter-openfeign | 声明式 HTTP 客户端 |
spring-cloud-starter-config | 配置中心客户端 |
spring-cloud-starter-bootstrap | Bootstrap 上下文 |
spring-cloud-circuitbreaker-spring-retry | 断路器重试 |
服务注册与发现
Eureka Server 搭建
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Eureka Client 配置
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
registry-fetch-interval-seconds: 30
instance:
prefer-ip-address: true
lease-renewal-interval-in-seconds: 10
lease-expiration-duration-in-seconds: 30
@SpringBootApplication
@EnableEurekaClient // 或 @EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
Nacos 服务注册
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
负载均衡
Ribbon 配置
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
return new RandomRule(); // 随机策略
}
}
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Spring Cloud Loadbalancer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
spring:
cloud:
loadbalancer:
configurations: default
ribbon:
enabled: false
使用服务名调用
@Autowired
private RestTemplate restTemplate;
public User getUser(Long id) {
String url = "http://user-service/user/" + id;
return restTemplate.getForObject(url, User.class);
}
API 网关
Spring Cloud Gateway 快速开始
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
静态路由配置
server:
port: 8080
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081
predicates:
- Path=/user/**
- id: order-service
uri: http://localhost:8082
predicates:
- Path=/order/**
动态路由(服务发现)
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
常用 Predicates
predicates:
- Path=/user/** # 路径匹配
- After=2024-01-01T00:00:00Z # 时间之后
- Before=2024-12-31T23:59:59Z # 时间之前
- Between=2024-01-01T00:00:00Z,2024-12-31T23:59:59Z
- Method=GET,POST # 请求方法
- Header=X-Request-Id, \d+ # 请求头
- Query=username # 查询参数
- Cookie=token,.* # Cookie
- Host=**.example.com # 主机名
常用 Filters
filters:
- StripPrefix=1 # 去掉前缀
- AddRequestHeader=X-Request-Id,12345 # 添加请求头
- RemoveRequestHeader=X-Token # 移除请求头
- AddResponseHeader=X-Response-Time,${executionTime} # 添加响应头
- PrefixPath=/api # 添加前缀
- RedirectTo=302,https://example.com # 重定向
- SetStatus=404 # 设置状态码
- RequestSize=5000000 # 请求大小限制
- Retry=3 # 重试次数
熔断配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
filters:
- name: CircuitBreaker
args:
name: slowCircuitBreaker
fallbackUri: /fallback/user
服务调用
OpenFeign 声明式客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
circuitbreaker:
enabled: true
@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
}
@Component
public class UserFallback implements UserClient {
@Override
public User getUser(Long id) {
return new User();
}
}
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
配置中心
Spring Cloud Config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
spring:
application:
name: user-service
cloud:
config:
uri: http://localhost:8888
profile: dev
label: master
Config Server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/username/config-repo
default-label: master
username: xxx
password: xxx
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
断路器
Resilience4j 断路器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
resilience4j:
circuitbreaker:
instances:
userService:
registerHealthIndicator: true
slidingWindowSize: 10
minimumNumberOfCalls: 5
permittedNumberOfCallsInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenState: 5s
failureRateThreshold: 50
timelimiter:
instances:
userService:
timeoutDuration: 3s
@Service
public class UserService {
@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
public User getUser(Long id) {
return restTemplate.getForObject("http://user-service/user/" + id, User.class);
}
private User getUserFallback(Long id, Exception e) {
return new User();
}
}
常用注解
| 注解 | 说明 |
|---|---|
@EnableEurekaServer | 启用 Eureka 服务端 |
@EnableEurekaClient | 启用 Eureka 客户端 |
@EnableDiscoveryClient | 启用服务发现客户端 |
@EnableFeignClients | 启用 Feign 客户端 |
@FeignClient | 声明 Feign 客户端 |
@EnableCircuitBreaker | 启用断路器 |
@CircuitBreaker | 断路器注解 |
@LoadBalanced | 负载均衡注解 |
@EnableConfigServer | 启用配置中心服务端 |
常见问题
1. 无法连接到 Eureka
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka/
register-with-eureka: true
fetch-registry: true
2. 网关路由不生效
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 必须启用服务发现
3. Feign 调用超时
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 10000
4. 负载均衡不生效
确保使用 @LoadBalanced 注解修饰 RestTemplate,或使用 lb:// 前缀的 URI。