跳到主要内容

Spring Cloud 速查表

本文档提供 Spring Cloud 常用配置的快速参考,基于 Spring Cloud 2024.x / 2025.x 版本。

版本对应

Release Train代号Spring BootJDK状态
2025.1.xOakwood4.0.x21+最新
2025.0.xNorthfields3.5.x17+维护中
2024.0.xMoorgate3.4.x17+维护中
2023.0.xLeyton3.3.x, 3.2.x17+维护中
2022.0.xKilburn3.0.x, 3.1.x17+EOL
2021.0.xJubilee2.6.x, 2.7.x8+EOL

版本选择建议:新项目使用最新稳定版(2024.0.x 或 2025.0.x),存量项目根据 Spring Boot 版本选择对应的 Spring Cloud 版本。务必确保版本匹配,版本不匹配会导致各种不可预期的错误。

查看最新版本:访问 Spring Cloud 官网 获取最新版本信息。

Maven 依赖

Spring Cloud 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 Alibaba BOM

<properties>
<spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

常用 Starter

Starter用途
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-circuitbreaker-resilience4j断路器
spring-cloud-starter-alibaba-nacos-discoveryNacos 服务发现
spring-cloud-starter-alibaba-nacos-configNacos 配置中心
spring-cloud-starter-alibaba-sentinelSentinel 流控

Spring Cloud Alibaba

版本对应

Spring Cloud AlibabaSpring CloudSpring Boot
2023.0.1.02023.0.x3.2.x
2022.0.0.02022.0.x3.0.x
2021.0.5.02021.0.x2.6.x

详细版本对应请参考 Spring Cloud Alibaba 官方文档

Nacos 服务发现

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置

spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
cluster-name: DEFAULT
weight: 1
metadata:
version: v1
zone: shanghai

常用配置项

配置项说明默认值
server-addrNacos Server 地址-
namespace命名空间 IDpublic
group分组DEFAULT_GROUP
cluster-name集群名DEFAULT
weight权重1
ephemeral是否临时实例true
heart-beat-interval心跳间隔5000ms
ip-delete-timeoutIP 删除超时30000ms

Nacos 配置中心

依赖

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置

spring:
application:
name: user-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
namespace: dev
group: DEFAULT_GROUP
shared-configs:
- data-id: common.yml
refresh: true
extension-configs:
- data-id: database.yml
refresh: true

动态刷新

@RestController
@RefreshScope
public class ConfigController {

@Value("${app.config.value:default}")
private String configValue;
}

Spring Cloud Gateway

依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

路由配置

spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- StripPrefix=1
discovery:
locator:
enabled: true
lower-case-service-id: true

断言工厂

断言示例
PathPath=/user/**
MethodMethod=GET,POST
HeaderHeader=X-Request-Id, \d+
QueryQuery=name, zhang.*
CookieCookie=session, abc123
HostHost=**.example.com
AfterAfter=2024-01-01T00:00:00+08:00
BeforeBefore=2024-12-31T23:59:59+08:00
BetweenBetween=2024-01-01T00:00:00+08:00,2024-12-31T23:59:59+08:00
RemoteAddrRemoteAddr=192.168.1.1/24
WeightWeight=group1, 80

过滤器工厂

过滤器示例
AddRequestHeaderAddRequestHeader=X-Request-Id, 12345
AddResponseHeaderAddResponseHeader=X-Response-Time, 2024
RemoveRequestHeaderRemoveRequestHeader=X-Unwanted
RemoveResponseHeaderRemoveResponseHeader=X-Unwanted
SetRequestHeaderSetRequestHeader=X-Request-Id, 54321
AddRequestParameterAddRequestParameter=foo, bar
StripPrefixStripPrefix=1
PrefixPathPrefixPath=/api
RewritePathRewritePath=/api/(?<s>.*), /${s}
SetPathSetPath=/api/user/{segment}
RedirectToRedirectTo=302, https://example.com
SetStatusSetStatus=404
RetryRetry=3
RequestSizeRequestSize=500KB

全局过滤器

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 认证逻辑
return chain.filter(exchange);
}

@Override
public int getOrder() {
return -100;
}
}

OpenFeign

依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

启用

@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

客户端定义

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {

@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);

@PostMapping("/user")
User createUser(@RequestBody User user);
}

配置

feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: BASIC
circuitbreaker:
enabled: true
compression:
request:
enabled: true
response:
enabled: true

日志级别

级别说明
NONE不记录日志(默认)
BASIC请求方法、URL、状态码、执行时间
HEADERSBASIC + 请求头和响应头
FULLHEADERS + 请求体和响应体

Spring Cloud LoadBalancer

依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

使用 RestTemplate

@Configuration
public class RestTemplateConfig {

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

使用 WebClient

@Configuration
public class WebClientConfig {

@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}

配置

spring:
cloud:
loadbalancer:
cache:
enabled: true
ttl: 35s
capacity: 256
health-check:
initial-delay: 0s
interval: 25s
configurations: default # weighted, zone-preference, health-check

自定义策略

public class RandomLoadBalancerConfig {

@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
Environment environment,
LoadBalancerClientFactory factory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(
factory.getLazyProvider(name, ServiceInstanceListSupplier.class),
name
);
}
}

Sentinel

依赖

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置

spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
eager: true
datasource:
flow:
nacos:
server-addr: localhost:8848
data-id: ${spring.application.name}-flow-rules
rule-type: flow

使用

@GetMapping("/user/{id}")
@SentinelResource(value = "getUser", blockHandler = "getUserBlockHandler")
public User getUser(@PathVariable Long id) {
return userService.getById(id);
}

public User getUserBlockHandler(Long id, BlockException ex) {
return new User(id, "限流降级用户");
}

Resilience4j

依赖

<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot3</artifactId>
</dependency>

断路器配置

resilience4j:
circuitbreaker:
instances:
userService:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10s
permittedNumberOfCallsInHalfOpenState: 3
slowCallDurationThreshold: 2s
slowCallRateThreshold: 50

使用

@CircuitBreaker(name = "userService", fallbackMethod = "fallback")
public User getUser(Long id) {
return userClient.getUser(id);
}

public User fallback(Long id, Exception ex) {
return new User(id, "降级用户");
}

Eureka

服务端

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:
port: 8761

eureka:
client:
register-with-eureka: false
fetch-registry: false
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

客户端

spring:
application:
name: user-service

eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
lease-renewal-interval-in-seconds: 10
lease-expiration-duration-in-seconds: 30

常用注解

注解用途
@EnableDiscoveryClient启用服务发现客户端
@EnableFeignClients启用 Feign 客户端
@FeignClient声明 Feign 客户端
@LoadBalanced启用负载均衡
@RefreshScope支持配置刷新
@SentinelResourceSentinel 资源注解
@CircuitBreaker断路器注解
@LoadBalancerClient自定义负载均衡配置

常见问题

服务注册失败

检查 Nacos/Eureka 地址是否正确,检查命名空间配置,检查网络连通性。

网关路由不生效

检查路由配置语法,检查断言是否匹配,检查目标服务是否已注册。

Feign 调用超时

调整超时配置:

feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 30000

负载均衡不生效

确保添加了 spring-cloud-starter-loadbalancer 依赖,确保使用 @LoadBalanced 注解,确保禁用了 Ribbon。

配置不刷新

确保添加了 @RefreshScope 注解,确保配置了 refresh: true,检查 Nacos 配置是否正确。

参考链接