一、Spring Cloud是什么
Spring Cloud是基于Spring Boot的微服务开发框架,它提供了一系列工具,帮助开发者快速构建分布式系统的通用模式。
二、核心组件一览
| 组件 | 作用 | 替代方案 |
|---|---|---|
| Eureka | 服务注册与发现 | Nacos、Zookeeper |
| Ribbon | 客户端负载均衡 | Feign、Spring Cloud LoadBalancer |
| Hystrix | 熔断器 | Sentinel |
| Zuul/Gateway | API网关 | Spring Cloud Gateway |
| Config | 分布式配置 | Nacos、Apollo |
| Sleuth | 分布式追踪 | Zipkin、Jaeger |
三、快速开始
1. 服务注册中心 Eureka
xml
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
yaml
# application.yml
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
java
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2. 服务提供者
yaml
# provider.yml
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
java
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return new User(id, "User" + id, 25);
}
}
3. 服务消费者
java
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{userId}")
public Order getOrder(@PathVariable Long userId) {
// 调用用户服务
User user = restTemplate.getForObject(
"http://user-service/user/" + userId,
User.class
);
return new Order(userId, user.getName());
}
}
四、服务间通信
RestTemplate方式
java
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Feign方式(推荐)
java
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private UserClient userClient;
public Order getOrder(Long userId) {
User user = userClient.getUser(userId);
return new Order(userId, user.getName());
}
}
五、熔断器 Hystrix
java
@RestController
@RequestMapping("/order")
public class OrderController {
@HystrixCommand(fallbackMethod = "getUserFallback")
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return restTemplate.getForObject(
"http://user-service/user/" + id,
User.class
);
}
// 降级方法
public User getUserFallback(Long id) {
return new User(id, "默认用户", 0);
}
}
六、总结
Spring Cloud提供了一整套微服务解决方案,但组件众多,需要根据实际需求选择。推荐从Spring Cloud Alibaba开始,它集成度更高,文档更完善。
思考题:在你的项目中使用了哪些Spring Cloud组件?有没有遇到什么坑?
个人观点,仅供参考