跳到主要内容

Spring Cloud 速查表

本文档提供 Spring Cloud 常用配置、组件和命令的快速参考。基于 Spring Cloud 2024.0.x (Moorgate) 版本。

版本对应关系

Release TrainSpring Boot 版本JDK 版本
2024.0.x (Moorgate)3.4.x17+
2023.0.x (Leyton)3.3.x, 3.2.x17+
2022.0.x (Kilburn)3.0.x, 3.1.x17+

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-serverEureka 服务端
spring-cloud-starter-netflix-eureka-clientEureka 客户端
spring-cloud-starter-gatewayAPI 网关
spring-cloud-starter-loadbalancer负载均衡器
spring-cloud-starter-openfeign声明式 HTTP 客户端
spring-cloud-starter-config配置中心客户端
spring-cloud-starter-bootstrapBootstrap 上下文
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。

相关链接