Skip to content

Spring Cloud微服务实战指南

引言

Spring Cloud是一个用于构建微服务架构的强大框架。本文将介绍Spring Cloud的核心组件和最佳实践。

核心组件

服务注册与发现 (Eureka)

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

// application.yml
server:
  port: 8761
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false

配置中心 (Config)

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

// application.yml
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-repo/config
          searchPaths: config

服务网关 (Gateway)

java
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user_service", r -> r.path("/users/**")
                .uri("lb://user-service"))
            .route("order_service", r -> r.path("/orders/**")
                .uri("lb://order-service"))
            .build();
    }
}

服务熔断与降级

Resilience4j配置

java
@RestController
@RequestMapping("/api")
public class UserController {
    
    @CircuitBreaker(name = "userService", fallbackMethod = "fallback")
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }
    
    public User fallback(Long id, Exception e) {
        return new User(id, "默认用户");
    }
}

// application.yml
resilience4j.circuitbreaker:
  instances:
    userService:
      slidingWindowSize: 10
      failureRateThreshold: 50
      waitDurationInOpenState: 5000

分布式追踪

Sleuth + Zipkin

java
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceApplication {
    @Bean
    public Sampler defaultSampler() {
        return Sampler.ALWAYS_SAMPLE;
    }
}

// application.yml
spring:
  sleuth:
    sampler:
      probability: 1.0
  zipkin:
    base-url: http://localhost:9411

消息总线

Spring Cloud Bus

java
@RefreshScope
@RestController
@RequestMapping("/config")
public class ConfigController {
    
    @Value("${config.name}")
    private String configName;
    
    @GetMapping("/name")
    public String getConfigName() {
        return configName;
    }
}

// application.yml
spring:
  cloud:
    bus:
      enabled: true
      refresh:
        enabled: true
  rabbitmq:
    host: localhost
    port: 5672

负载均衡

LoadBalancer配置

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

安全认证

OAuth2配置

java
@EnableResourceServer
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/api/public/**").permitAll()
            .antMatchers("/api/private/**").authenticated();
    }
}

// application.yml
security:
  oauth2:
    resource:
      jwt:
        key-uri: http://auth-server/oauth/token_key

服务监控

Spring Boot Admin

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

// application.yml
spring:
  boot:
    admin:
      context-path: /admin
      monitor:
        period: 10000

最佳实践

  1. 服务拆分

    • 领域驱动设计
    • 单一职责原则
    • 合理粒度
  2. 配置管理

    • 环境隔离
    • 配置中心
    • 动态刷新
  3. 容错处理

    • 熔断降级
    • 重试机制
    • 限流保护
  4. 监控告警

    • 健康检查
    • 性能监控
    • 日志追踪

性能优化

  1. JVM调优
java
-Xms2g
-Xmx2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
  1. 连接池配置
yaml
spring:
  datasource:
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      idle-timeout: 300000
  1. 缓存使用
java
@Cacheable(value = "users", key = "#id")
public User getUser(Long id) {
    return userRepository.findById(id);
}

部署架构

  1. 容器化部署
yaml
version: '3'
services:
  eureka:
    image: eureka-server
    ports:
      - "8761:8761"
  config:
    image: config-server
    depends_on:
      - eureka
  1. 高可用配置
yaml
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/

常见问题

  1. 服务注册

    • 服务发现延迟
    • 心跳超时
    • 注册中心同步
  2. 配置管理

    • 配置刷新
    • 环境隔离
    • 安全性
  3. 分布式事务

    • 数据一致性
    • 补偿机制
    • 幂等性

参考资料

  1. Spring Cloud官方文档
  2. Spring Boot实战
  3. 微服务架构设计模式
  4. 分布式系统原理
  5. 云原生应用开发指南

幸运的人用童年治愈一生,不幸的人用一生治愈童年 —— 强爸