一、微服务架构:从单体到分布式的演进
随着业务复杂度的增加,传统的单体应用(Monolith)变得臃肿、难以维护和部署。微服务架构应运而生,它将一个大型应用拆分成一系列小型、自治、松耦合的服务。
微服务核心优势:
-
技术异构性:不同服务可以使用不同的技术栈。
-
弹性:单个服务故障不会导致整个系统崩溃。
-
独立部署:每个服务可以独立开发、测试和部署。
-
易于扩展:可以针对特定服务进行精准扩容。
Spring Cloud Alibaba 是一套由阿里巴巴开源的微服务解决方案集合,它完美地集成了 Spring Cloud 标准,并提供了生产级的服务治理、配置管理、流量控制等能力。
二、Spring Cloud Alibaba 核心组件简介
我们将使用以下核心组件来构建我们的分布式系统:
-
Nacos:服务注册与发现、配置管理中心。
-
OpenFeign:声明式的HTTP服务调用客户端。
-
Sentinel:流量控制、熔断降级、系统负载保护。
三、实战:构建一个简单的微服务系统
我们将创建两个服务:user-service(用户服务)和 order-service(订单服务)。订单服务需要通过HTTP调用用户服务来获取用户信息。
步骤1:搭建Nacos服务注册中心
-
从 Nacos Release 页面下载并启动Nacos Server。
-
执行启动脚本(单机模式):
sh startup.sh -m standalone # Linux/Mac
startup.cmd -m standalone # Windows
3.访问 http://localhost:8848/nacos,使用 nacos/nacos 登录。你将看到Nacos控制台。
步骤2:创建用户服务(user-service)
-
添加依赖 (
pom.xml):
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.配置文件 (application.yml):
server:
port: 8081
spring:
application:
name: user-service # 服务名,非常重要!
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务器地址
# 管理端点(可选,用于健康检查)
management:
endpoints:
web:
exposure:
include: "*"
3.编写一个简单的Controller:
@RestController
public class UserController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable String id) {
// 模拟从数据库查询用户
return "User Info for ID: " + id;
}
}
4.主应用类:
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
启动 user-service,在Nacos控制台的服务列表中,你应该能看到 user-service。
步骤3:创建订单服务(order-service)并调用用户服务
- 添加依赖:在
user-service依赖的基础上,增加OpenFeign:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.配置文件 (application.yml):
server:
port: 8082
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
3.使用OpenFeign声明式调用:
// 1. 创建Feign客户端接口
@FeignClient(name = "user-service") // 指定要调用的服务名
public interface UserClient {
@GetMapping("/user/{id}") // 复制user-service的接口定义
String getUserById(@PathVariable("id") String id);
}
// 2. 在OrderController中注入并使用
@RestController
public class OrderController {
@Autowired
private UserClient userClient; // Feign会自动实现这个接口
@GetMapping("/order/{userId}")
public String getOrder(@PathVariable String userId) {
// 通过Feign调用user-service
String userInfo = userClient.getUserById(userId);
return "Order for User: " + userInfo;
}
}
4.主应用类:需要添加 @EnableFeignClients 注解。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 启用Feign客户端
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
步骤4:测试
-
启动
order-service。 -
访问
http://localhost:8082/order/123。 -
你会看到返回结果:
"Order for User: User Info for ID: 123"。
整个过程的核心是:order-service 通过服务名 user-service 向Nacos查询其真实地址,然后Feign发起HTTP调用。实现了服务间的解耦。
四、进阶:使用Sentinel实现流量控制
在高并发场景下,为了防止某个服务被突发流量冲垮,我们需要引入熔断和降级。
-
在订单服务中引入Sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.配置Sentinel Dashboard(一个控制台):
-
下载并启动Sentinel Dashboard。
-
在
order-service的application.yml中配置:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel控制台地址
3.在Feign客户端上配置熔断降级:
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
// ... 同上
}
// 熔断降级实现类
@Component
public class UserClientFallback implements UserClient {
@Override
public String getUserById(String id) {
return "[Fallback] User Service is Temporarily Unavailable"; // 降级逻辑
}
}
-
当
user-service不可用或响应过慢时,会自动调用UserClientFallback中的方法,返回一个友好的降级响应,而不是让错误蔓延。
五、总结
通过本文,我们使用 Spring Cloud Alibaba 的核心组件搭建了一个简单的微服务系统:
-
Nacos 作为服务注册和配置中心,实现了服务的注册与发现。
-
OpenFeign 实现了声明式的服务间调用,代码简洁。
-
Sentinel 提供了流量控制和熔断降级能力,保证了系统的稳定性。
这只是微服务世界的入门。接下来你可以探索分布式配置、分布式事务(Seata)、网关(Spring Cloud Gateway)等更高级的主题。

被折叠的 条评论
为什么被折叠?



