← 返回首页
☁️

Spring Cloud入门:微服务架构

📂 java ⏱ 2 min 321 words

Spring Cloud入门:微服务架构

概述

Spring Cloud是Spring生态中的微服务框架。本教程介绍Spring Cloud的核心组件。

1. 服务注册与发现

// Eureka Server
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

// Eureka Client
import org.springframework.cloud.netflix.eureka.EnableDiscoveryClient;

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

2. 配置中心

// Config Server
import org.springframework.cloud.config.server.EnableConfigServer;

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

// Config Client
import org.springframework.cloud.context.config.annotation.RefreshScope;

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

@RestController
@RefreshScope
public class ConfigController {
    @Value("${app.config}")
    private String appConfig;
    
    @GetMapping("/config")
    public String getConfig() {
        return appConfig;
    }
}

3. 服务网关

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service", r -> r
                .path("/api/users/**")
                .filters(f -> f.stripPrefix(1))
                .uri("lb://user-service"))
            .route("order-service", r -> r
                .path("/api/orders/**")
                .filters(f -> f.stripPrefix(1))
                .uri("lb://order-service"))
            .build();
    }
}

4. 负载均衡

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

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

@Service
public class UserService {
    private final RestTemplate restTemplate;
    
    public UserService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    
    public User getUser(Long id) {
        return restTemplate.getForObject("http://user-service/api/users/" + id, User.class);
    }
}

5. 实际应用示例

微服务架构

                    +-----------+
                    | API Gateway|
                    +-----+-----+
                          |
        +-----------------+-----------------+
        |                 |                 |
+-------v-------+ +-------v-------+ +-------v-------+
|   User Service| |  Order Service| |Product Service|
+-------+-------+ +-------+-------+ +-------+-------+
        |                 |                 |
+-------v-------+ +-------v-------+ +-------v-------+
|     MySQL     | |     MySQL     | |     MySQL     |
+---------------+ +---------------+ +---------------+

Feign声明式客户端

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/api/users/{id}")
    User getUser(@PathVariable("id") Long id);
    
    @PostMapping("/api/users")
    User createUser(@RequestBody User user);
}

@Service
public class OrderService {
    private final UserClient userClient;
    
    public OrderService(UserClient userClient) {
        this.userClient = userClient;
    }
    
    public Order createOrder(Long userId, List<OrderItem> items) {
        User user = userClient.getUser(userId);
        // 创建订单逻辑
        return new Order(user, items);
    }
}

6. 最佳实践

  1. 服务拆分:按业务能力拆分服务
  2. 配置管理:使用配置中心统一管理配置
  3. 服务治理:使用注册中心实现服务发现
  4. 网关路由:使用网关统一入口
  5. 熔断降级:使用Hystrix或Sentinel实现熔断

总结

Spring Cloud是微服务架构的主流框架。掌握Spring Cloud的核心组件,可以构建可扩展、高可用的微服务系统。