← 返回首页

Spring Cloud核心组件详解

📂 java ⏱ 3 min 404 words

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解决分布式事务。