Spring Cloud核心组件详解
Spring Cloud核心组件详解
Spring Cloud技术栈
Spring Cloud
├── 服务发现:Nacos / Eureka
├── 配置中心:Nacos / Apollo
├── API网关:Spring Cloud Gateway
├── 熔断器:Resilience4j
├── 负载均衡:Spring Cloud LoadBalancer
├── 分布式事务:Seata
├── 链路追踪:Micrometer Tracing
└── 消息驱动:Spring Cloud Stream
Nacos服务发现
依赖配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2023.0.1.0</version>
</dependency>
配置
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
// 使用服务发现调用
@Service
public class OrderService {
@Autowired
private DiscoveryClient discoveryClient;
public User getUser(Long userId) {
List<ServiceInstance> instances =
discoveryClient.getInstances("user-service");
ServiceInstance instance = instances.get(0);
String url = "http://" + instance.getHost() + ":" + instance.getPort()
+ "/api/users/" + userId;
return restTemplate.getForObject(url, User.class);
}
}
Nacos配置中心
依赖配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置文件
# bootstrap.yml
spring:
application:
name: user-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
group: DEFAULT_GROUP
动态配置
@RefreshScope
@RestController
public class ConfigController {
@Value("${app.feature.enabled:false}")
private boolean featureEnabled;
@Value("${app.max-retry:3}")
private int maxRetry;
@GetMapping("/config")
public Map<String, Object> getConfig() {
return Map.of(
"featureEnabled", featureEnabled,
"maxRetry", maxRetry
);
}
}
Spring Cloud Gateway
依赖配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
路由配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=0
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
全局过滤器
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !validateToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 添加用户信息到请求头
ServerHttpRequest request = exchange.getRequest().mutate()
.header("X-User-Id", getUserIdFromToken(token))
.build();
return chain.filter(exchange.mutate().request(request).build());
}
@Override
public int getOrder() {
return -100;
}
private boolean validateToken(String token) { return true; }
private String getUserIdFromToken(String token) { return "123"; }
}
Resilience4j熔断器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
resilience4j:
circuitbreaker:
instances:
userService:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10000
permittedNumberOfCallsInHalfOpenState: 3
retry:
instances:
userService:
maxAttempts: 3
waitDuration: 500
@Service
public class UserServiceWithCircuitBreaker {
@CircuitBreaker(name = "userService", fallbackMethod = "getUserFallback")
@Retry(name = "userService")
public User getUser(Long id) {
return restTemplate.getForObject(
"http://user-service/api/users/" + id, User.class);
}
public User getUserFallback(Long id, Exception e) {
return new User(id, "降级用户", "服务暂时不可用");
}
}
分布式事务(Seata)
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
@Service
public class OrderServiceSeata {
@Autowired
private OrderRepository orderRepository;
@Autowired
private InventoryClient inventoryClient;
@GlobalTransactional
public void createOrder(Long userId, Long productId, int quantity) {
// 扣减库存(远程调用)
inventoryClient.deduct(productId, quantity);
// 创建订单
Order order = new Order(userId, productId, quantity);
orderRepository.save(order);
}
}
总结
Spring Cloud提供了完整的微服务解决方案。Nacos同时支持服务发现和配置中心,Gateway处理路由和限流,Resilience4j实现熔断降级,Seata解决分布式事务。