Spring Cloud入门:微服务架构
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. 最佳实践
- 服务拆分:按业务能力拆分服务
- 配置管理:使用配置中心统一管理配置
- 服务治理:使用注册中心实现服务发现
- 网关路由:使用网关统一入口
- 熔断降级:使用Hystrix或Sentinel实现熔断
总结
Spring Cloud是微服务架构的主流框架。掌握Spring Cloud的核心组件,可以构建可扩展、高可用的微服务系统。