一、先理解什么是“微服务”?
想象你有一个大超市(传统单体应用),所有商品都在一个大厅里。如果某类商品(比如生鲜区)出了问题,整个超市可能都要关闭维修。
而“微服务”就像把超市拆分成多个小店(生鲜店、日用品店、零食店...),每个小店独立运营。如果生鲜店出问题,其他店还能正常营业。Spring Cloud 就是管理这些小店的工具包。
二、Spring Cloud 核心功能(通过例子理解)
假设我们要做一个电商系统,拆分成两个微服务:
-
用户服务:管理用户信息
-
订单服务:管理订单信息
1. 服务注册与发现(Eureka)
-
问题:订单服务如何找到用户服务的地址?
-
解决:用一个“电话簿”(注册中心)记录所有服务的位置。
实例代码:
-
创建注册中心(类似电话簿):
@SpringBootApplication @EnableEurekaServer // 声明这是注册中心 public class RegistryCenterApplication { public static void main(String[] args) { SpringApplication.run(RegistryCenterApplication.class, args); } }
-
配置文件
application.yml
:server: port: 8761 # 默认注册中心端口 eureka: client: register-with-eureka: false # 自己不注册自己 fetch-registry: false
-
-
用户服务注册到电话簿:
@SpringBootApplication @EnableEurekaClient // 声明自己是客户端,要注册 public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } }
-
配置文件
application.yml
:server: port: 8081 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # 注册中心的地址
-
2. 服务调用(Feign 或 RestTemplate)
-
问题:订单服务如何调用用户服务的接口?
-
解决:通过注册中心查找用户服务的地址,并发送HTTP请求。
实例代码:
-
订单服务中调用用户服务:
@FeignClient(name = "user-service") // 指定要调用的服务名 public interface UserServiceClient { @GetMapping("/users/{id}") // 调用用户服务的接口 User getUser(@PathVariable Long id); }
-
在订单服务中使用Feign:
@RestController public class OrderController { @Autowired private UserServiceClient userServiceClient; @GetMapping("/order/{userId}") public Order getOrder(@PathVariable Long userId) { User user = userServiceClient.getUser(userId); // 直接调用用户服务 return new Order("订单123", user); } }
3. 负载均衡(Ribbon)
-
问题:如果用户服务有多个实例(比如8081、8082端口),订单服务该调用哪个?
-
解决:Ribbon 会自动分配请求,避免某个服务压力过大。
配置:
-
默认已集成在 Feign 中,无需额外代码。
4. 断路器(Hystrix)
-
问题:如果用户服务宕机,订单服务一直等待会崩溃吗?
-
解决:Hystrix 会在服务不可用时快速失败,并返回预设的备用响应。
实例代码:
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserServiceClient {
// ...
}
@Component
public class UserServiceFallback implements UserServiceClient {
@Override
public User getUser(Long id) {
return new User("默认用户", "服务暂不可用"); // 备用响应
}
}
三、Spring Cloud 的总结
-
核心功能:服务注册与发现、负载均衡、服务调用、熔断降级。
-
优势:让微服务之间的协作变得简单,像搭积木一样构建系统。
-
适用场景:大型分布式系统,需要高可用、易扩展的场景。