一、核心概念与定位
1.1 四者定位对比
┌───────────────────────────��──────────────────────────┐
│ 微服务架构 │
│ (架构设计理念) │
│ ├─ 服务拆分 │
│ ├─ 独立部署 │
│ ├─ 去中心化 │
│ └─ 技术栈多样 │
└──────────────────────────────────────────────────────┘
▲
│ 实现微服务架构的技术栈之一
│
┌──────────────────────────────────────────────────────┐
│ Spring Cloud Alibaba │
│ (微服务解决方案 - 阿里巴巴版) │
│ ├─ Nacos(服务发现/配置中心) │
│ ├─ Sentinel(限流熔断) │
│ ├─ Seata(分布式事务) │
│ └─ RocketMQ(消息队列) │
└──────────────────────────────────────────────────────┘
▲
│ 基于
│
┌──────────────────────────────────────────────────────┐
│ Spring Cloud │
│ (微服务解决方案 - 通用版) │
│ ├─ Eureka(服务发现) │
│ ├─ Ribbon(负载均衡) │
│ ├─ Hystrix(熔断器) │
│ ├─ Gateway(API网关) │
│ └─ Config(配置中心) │
└──────────────────────────────────────────────────────┘
▲
│ 基于
│
┌──────────────────────────────────────────────────────┐
│ Spring Boot │
│ (快速开发脚手架) │
│ ├─ 自动配置(Auto-Configuration) │
│ ├─ Starter 依赖(简化依赖管理) │
│ ├─ 内嵌服务器(Tomcat/Jetty) │
│ ├─ 生产就绪特性(Actuator) │
│ └─ 开箱即用(约定优于配置) │
└──────────────────────────────────────────────────────┘
▲
│ 基于
│
┌──────────────────────────────────────────────────────┐
│ Spring Framework │
│ (企业级开发框架) │
│ ├─ IoC 容器(控制反转) │
│ ├─ AOP(面向切面编程) │
│ ├─ 数据访问(JDBC/ORM) │
│ ├─ 事务管理 │
│ └─ Web MVC │
└──────────────────────────────────────────────────────┘
1.2 一句话总结
| 技术 | 定位 | 一句话总结 |
|---|---|---|
| 微服务架构 | 架构风格 | 将单体应用拆分为多个小服务的架构设计理念 |
| Spring Framework | 基础框架 | Java 企业级应用开发的基础框架(IoC + AOP) |
| Spring Boot | 开发脚手架 | 简化 Spring 应用开发,让你专注于业务逻辑 |
| Spring Cloud | 微服务工具集 | 基于 Spring Boot 的微服务开发工具集 |
| Spring Cloud Alibaba | 微服务增强 | Spring Cloud 的阿里巴巴增强版(Nacos + Sentinel + Seata) |
1.3 层级关系
应用场景层:
└─ 微服务架构
│
├─ 需要:服务发现、负载均衡、熔断降级、配置中心...
│
技术实现层:
├─ Spring Cloud Alibaba(提供具体组件)
│ └─ 基于 Spring Cloud
│
├─ Spring Cloud(定义微服务标准接口)
│ └─ 基于 Spring Boot
│
├─ Spring Boot(简化配置,快速开发)
│ └─ 基于 Spring Framework
│
└─ Spring Framework(提供基础能力:IoC、AOP、事务)
二、四者的区别与联系
2.1 核心区别对比表
| 维度 | Spring Framework | Spring Boot | Spring Cloud | Spring Cloud Alibaba |
|---|---|---|---|---|
| 定位 | 企业级开发框架 | 快速开发脚手架 | 微服务工具集 | 微服务增强工具集 |
| 层级 | 基础层 | 应用层 | 微服务层 | 微服务增强层 |
| 核心功能 | IoC、AOP、事务、MVC | 自动配置、Starter | 服务治理、分布式配置 | Nacos、Sentinel、Seata |
| 配置方式 | XML/注解 | 注解 + application.yml | 注解 + 配置中心 | 注解 + Nacos |
| 部署方式 | War → Tomcat | Jar → 内嵌Tomcat | 多个独立服务 | 多个独立服务 |
| 适用场景 | 单体应用/企业应用 | 快速开发/单体应用 | 微服务架构 | 微服务架构(阿里云生态) |
| 学习曲线 | 陡峭 | 平缓 | 较陡 | 较陡 |
| 复杂度 | 中等 | 低 | 高 | 高 |
| 是否必需 | 所有项目的基础 | 推荐使用 | 微服务必需 | 可选(替代Netflix组件) |
2.2 依赖关系
关系链:
Spring Framework(必需)
↓ 包含并简化
Spring Boot(可选但推荐)
↓ 提供微服务基础
Spring Cloud(微服务场景必需)
↓ 提供阿里云生态组件
Spring Cloud Alibaba(可选,但生产推荐)
依赖示例:
xml
<!-- 1. Spring Framework -->
<!-- 注意:使用 Spring Boot 时,Spring Framework 会自动引入,无需手动配置 -->
<!-- 2. Spring Boot Parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
</parent>
<!-- 3. Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 4. Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2.3 功能对比
2.3.1 配置方式对比
Spring Framework 配置:
xml
<!-- applicationContext.xml -->
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
</bean>
<bean id="userService" class="com.example.UserService">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
Spring Boot 配置:
yaml
# application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
# Java 配置
@Service
public class UserService {
@Autowired
private UserDao userDao;
}
Spring Cloud 配置:
yaml
# application.yml
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
# 服务注册自动完成
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
2.3.2 服务调用对比
Spring Framework + RestTemplate:
java
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public User getUser(Long userId) {
// 硬编码服务地址
String url = "http://localhost:8080/users/" + userId;
return restTemplate.getForObject(url, User.class);
}
}
Spring Cloud + Feign:
java
// 1. 定义 Feign 客户端
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
// 2. 使用(自动负载均衡、服务发现)
@Service
public class OrderService {
@Autowired
private UserClient userClient;
public User getUser(Long userId) {
return userClient.getUser(userId); // 自动从Nacos获取服务地址
}
}
Spring Cloud Alibaba + Sentinel:
java
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
// 熔断降级
@Component
public class UserClientFallback implements UserClient {
@Override
public User getUser(Long id) {
// 降级逻辑
return new User(id, "默认用户", "服务降级");
}
}
2.4 联系总结
1. 继承关系:
Spring Framework
└─ Spring Boot(简化 Spring)
└─ Spring Cloud(基于 Spring Boot 的微服务工具)
└─ Spring Cloud Alibaba(Spring Cloud 的增强)
2. 依赖关系:
- Spring Boot 依赖 Spring Framework
- Spring Cloud 依赖 Spring Boot
- Spring Cloud Alibaba 依赖 Spring Cloud
3. 功能互补:
- Spring Framework:提供基础能力(IoC、AOP、事务)
- Spring Boot:简化开发(自动配置、快速启动)
- Spring Cloud:提供微服务能力(服务发现、配置中心、网关)
- Spring Cloud Alibaba:提供阿里云生态组件(Nacos、Sentinel、Seata)
4. 可以独立使用:
- ✅ 只用 Spring Framework:传统企业应用
- ✅ Spring Framework + Spring Boot:单体应用(推荐)
- ✅ Spring Boot + Spring Cloud:微服务架构
- ✅ Spring Boot + Spring Cloud + Spring Cloud Alibaba:微服务架构(阿里云生态)
- ❌ 不能单独用 Spring Cloud(必须基于 Spring Boot)
三、微服务架构详解
3.1 什么是微服务架构?
定义:微服务架构是一种将单一应用程序拆分成一组小型服务的架构风格,每个服务运行在独立的进程中,服务之间采用轻量级通信机制(通常是 HTTP RESTful API)。
核心特征:
1. 服务独立
└─ 每个服务独立开发、部署、运行
2. 去中心化
└─ 服务自治,没有中央控制
3. 技术栈多样
└─ 不同服务可以使用不同技术
4. 按业务拆分
└─ 围绕业务能力组织服务
5. 轻量级通信
└─ RESTful API、消息队列
6. 自动化部署
└─ CI/CD、容器化
3.2 单体架构 vs 微服务架构
3.2.1 架构对比图
单体架构(Monolithic):
┌───────────────────────────────────┐
│ 单体应用(一个War包) │
│ │
│ ┌─────────────────────────────┐ │
│ │ 用户模块 │ │
│ ├─────────────────────────────┤ │
│ │ 订单模块 │ │
│ ├─────────────────────────────┤ │
│ │ 商品模块 │ │
│ ├─────────────────────────────┤ │
│ │ 支付模块 │ │
│ └─────────────────────────────┘ │
│ │
│ 共享同一个数据库 │
└───────────────────────────────────┘
微服务架构(Microservices):
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 用户服务 │ │ 订单服务 │ │ 商品服务 │
│ (独立部署) │ │ (独立部署) │ │ (独立部署) │
│ │ │ │ │ │
│ 用户数据库 │ │ 订单数据库 │ │ 商品数据库 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└─────────────────┼─────────────────┘
│
HTTP/RPC 调用
3.2.2 优缺点对比
| 维度 | 单体架构 | 微服务架构 |
|---|---|---|
| 开发 | 简单,一个项目 | 复杂,多个项目 |
| 部署 | 整体部署,简单 | 独立部署,复杂 |
| 扩展 | 垂直扩展(加配置) | 水平扩展(加实例) |
| 可靠性 | 一处故障全部挂 | 服务隔离,局部故障 |
| 技术栈 | 统一技术栈 | 可选不同技术栈 |
| 团队协作 | 代码冲突多 | 团队独立开发 |
| 数据一致性 | 本地事务,简单 | 分布式事务,复杂 |
| 运维成本 | 低 | 高 |
| 适用场景 | 小型应用、团队小 | 大型应用、团队大 |
3.3 微服务核心问题与解决方案
3.3.1 微服务面临的挑战
1. 服务发现
问题:服务 A 如何找到服务 B 的地址?
方案:Nacos、Eureka、Consul
2. 负载均衡
问题:服务 A 调用服务 B 的多个实例,如何分配?
方案:Ribbon、LoadBalancer
3. 服务熔断/降级
问题:服务 B 挂了,如何避免雪崩?
方案:Sentinel、Hystrix
4. 配置管理
问题:10个服务,每个都要改配置?
方案:Nacos Config、Spring Cloud Config
5. 分布式事务
问题:跨多个服务的事务如何保证一致性?
方案:Seata、Saga
6. API 网关
问题:客户端如何统一访问多个服务?
方案:Spring Cloud Gateway、Zuul
7. 链路追踪
问题:请求经过多个服务,如何追踪?
方案:Sleuth + Zipkin、SkyWalking
8. 服务监控
问题:服务健康状况如何监控?
方案:Spring Boot Actuator、Prometheus
3.3.2 Spring Cloud 解决方案
┌─────────────────────────────────────────────────┐
│ Spring Cloud 全家桶 │
├─────────────────────────────────────────────────┤
│ 服务注册/发现 │ Nacos Discovery / Eureka │
│ 负载均衡 │ LoadBalancer / Ribbon │
│ 服务调用 │ OpenFeign / RestTemplate │
│ 熔断降级 │ Sentinel / Resilience4j │
│ 配置中心 │ Nacos Config / Config Server │
│ API 网关 │ Spring Cloud Gateway │
│ 分布式事务 │ Seata │
│ 链路追踪 │ Sleuth + Zipkin / SkyWalking │
│ 消息驱动 │ Stream (Kafka/RabbitMQ) │
└─────────────────────────────────────────────────┘
3.4 微服务架构最佳实践
1. 服务拆分原则
├─ 单一职责:一个服务只做一件事
├─ 高内聚低耦合:服务内部高内聚,服务间低耦合
├─ 按业务能力拆分:围绕业务领域
└─ 数据库独立:每个服务有自己的数据库
2. 服务通信
├─ 同步通信:HTTP RESTful、gRPC
└─ 异步通信:消息队列(RocketMQ、Kafka)
3. 服务治理
├─ 服务注册与发现
├─ 负载均衡
├─ 熔断降级
└─ 限流
4. 数据一致性
├─ 最终一致性(推荐)
├─ TCC 事务
├─ Saga 事务
└─ 本地消息表
5. 部署运维
├─ 容器化(Docker)
├─ 编排(Kubernetes)
├─ CI/CD
└─ 监控告警
四、Spring 框架详解
4.1 Spring Framework 核心
Spring Framework 核心模块:
┌─────────────────────────────────────────────┐
│ Core Container │
│ ├─ spring-core(核心工具) │
│ ├─ spring-beans(Bean 管理) │
│ ├─ spring-context(应用上下文) │
│ └─ spring-expression(SpEL 表达式) │
├─────────────────────────────────────────────┤
│ AOP + Aspects │
│ ├─ spring-aop(面向切面编程) │
│ └─ spring-aspects(AspectJ 集成) │
├─────────────────────────────────────────────┤
│ Data Access │
│ ├─ spring-jdbc(JDBC 支持) │
│ ├─ spring-tx(事务管理) │
│ └─ spring-orm(ORM 集成) │
├─────────────────────────────────────────────┤
│ Web │
│ ├─ spring-web(Web 基础) │
│ ├─ spring-webmvc(Spring MVC) │
│ └─ spring-webflux(响应式 Web) │
└─────────────────────────────────────────────┘
4.2 Spring Framework 核心特性
4.2.1 IoC(控制反转)
java
// 传统方式:手动创建依赖
public class UserService {
private UserDao userDao = new UserDaoImpl(); // 紧耦合
}
// Spring IoC:依赖注入
@Service
public class UserService {
@Autowired
private UserDao userDao; // Spring 自动注入
}
4.2.2 AOP(面向切面编程)
java
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service..*.*(..))")
public Object logAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("方法执行前");
Object result = pjp.proceed();
System.out.println("方法执行后");
return result;
}
}
4.2.3 声明式事务
java
@Service
public class UserService {
@Transactional
public void createUser(User user) {
userDao.save(user);
accountDao.createAccount(user.getId());
// 异常自动回滚
}
}
五、Spring Boot 详解
5.1 Spring Boot 核心特性
Spring Boot 核心价值:
┌─────────────────────────────────────────────┐
│ 1. 自动配置(Auto-Configuration) │
│ └─ 根据 classpath 自动配置 Bean │
├─────────────────────────────────────────────┤
│ 2. Starter 依赖 │
│ └─ 一站式依赖管理 │
├─────────────────────────────────────────────┤
│ 3. 内嵌服务器 │
│ └─ Tomcat、Jetty、Undertow │
├─────────────────────────────────────────────┤
│ 4. 生产就绪特性(Actuator) │
│ └─ 健康检查、指标监控 │
├─────────────────────────────────────────────┤
│ 5. 外部化配置 │
│ └─ application.yml、环境变量 │
└─────────────────────────────────────────────┘
5.2 Spring vs Spring Boot 对比
5.2.1 依赖管理
Spring Framework:
xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- 还需要配置很多其他依赖... -->
</dependencies>
Spring Boot:
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
</parent>
<dependencies>
<!-- 一个 starter 搞定所有 Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
5.2.2 配置方式
Spring Framework:
xml
<!-- web.xml -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
</servlet>
<!-- spring-mvc.xml -->
<beans>
<context:component-scan base-package="com.example"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Spring Boot:
java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// application.yml
spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
5.3 Spring Boot Starter
| Starter | 功能 | 包含的核心依赖 |
|---|---|---|
| spring-boot-starter-web | Web 应用 | Spring MVC、Tomcat、Jackson |
| spring-boot-starter-data-jpa | JPA | Hibernate、Spring Data JPA |
| spring-boot-starter-data-redis | Redis | Lettuce、Spring Data Redis |
| spring-boot-starter-security | 安全 | Spring Security |
| spring-boot-starter-test | 测试 | JUnit、Mockito、AssertJ |
| spring-boot-starter-actuator | 监控 | Micrometer、Actuator |
| spring-boot-starter-amqp | RabbitMQ | Spring AMQP |
| spring-boot-starter-validation | 校验 | Hibernate Validator |
六、Spring Cloud 详解
6.1 Spring Cloud 架构
┌────────────────────────────────────────────────────┐
│ 客户端 │
└────────────────────────────────────────────────────┘
│
↓
┌────────────────────────────────────────────────────┐
│ API Gateway (网关) │
│ Spring Cloud Gateway │
│ ├─ 路由转发 │
│ ├─ 鉴权 │
│ └─ 限流 │
└────────────────────────────────────────────────────┘
│
┌──────────────┼──────────────┐
│ │ │
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 用户服务 │ │ 订单服务 │ │ 商品服务 │
│ user-service │ │ order-service │ │product-service│
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
└──────────────┼──────────────┘
│
↓
┌──────────────────────────────┐
│ 服务注册与发现中心 │
│ Nacos / Eureka │
└──────────────────────────────┘
│
┌──────────────┼──────────────┐
│ │ │
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 配置中心 │ │ 限流熔断 │ │ 链路追踪 │
│ Nacos Config │ │ Sentinel │ │ Zipkin │
└───────────────┘ └───────────────┘ └───────────────┘
6.2 Spring Cloud 核心组件
6.2.1 Netflix 组件(传统方案)
| 组件 | 作用 | 状态 |
|---|---|---|
| Eureka | 服务注册与发现 | 维护模式 |
| Ribbon | 负载均衡 | 维护模式 |
| Hystrix | 熔断器 | 停止开发 |
| Zuul | API 网关 | 停止开发 |
| Config | 配置中心 | 活跃 |
6.2.2 新一代组件(推荐方案)
| 组件 | 作用 | 替代 |
|---|---|---|
| Nacos | 服务注册/发现 + 配置中心 | Eureka + Config |
| LoadBalancer | 负载均衡 | Ribbon |
| Sentinel | 流控、熔断、降级 | Hystrix |
| Gateway | API 网关 | Zuul |
| Seata | 分布式事务 | - |
6.3 Spring Cloud 核心功能
6.3.1 服务注册与发现(Nacos Discovery)
yaml
# application.yml
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
java
// 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
// 自动注册到 Nacos
6.3.2 负载均衡(LoadBalancer)
java
// 配置 LoadBalancer
@Configuration
public class LoadBalancerConfig {
@Bean
@LoadBalanced // 启用负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 使用(自动负载均衡)
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public User getUser(Long userId) {
// user-service 自动解析为实际地址,并负载均衡
return restTemplate.getForObject(
"http://user-service/users/" + userId,
User.class
);
}
}
6.3.3 声明式服务调用(OpenFeign)
java
// 1. 定义 Feign 客户端
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
@PostMapping("/users")
User createUser(@RequestBody User user);
}
// 2. 使用
@Service
public class OrderService {
@Autowired
private UserClient userClient;
public void createOrder(Order order) {
User user = userClient.getUser(order.getUserId());
// 业务逻辑
}
}
6.3.4 配置中心(Nacos Config)
重要提示:Spring Boot 2.4+ 默认禁用 bootstrap 配置文件,需要添加以下依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
yaml
# bootstrap.yml(优先级高于 application.yml)
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev # 开发环境(建议使用 namespace ID)
group: DEFAULT_GROUP
java
// 动态刷新配置
@RestController
@RefreshScope // 配置变更自动刷新
public class ConfigController {
@Value("${user.max-age:100}")
private Integer maxAge;
@GetMapping("/config")
public Integer getMaxAge() {
return maxAge;
}
}
6.3.5 API 网关(Spring Cloud Gateway)
yaml
# application.yml
spring:
cloud:
gateway:
httpclient:
connect-timeout: 5000 # 连接超时 5秒
response-timeout: 30s # 响应超时 30秒
pool:
max-connections: 1000 # 连接池最大连接数
max-idle-time: 30s # 连接空闲时间
routes:
- id: user-service-route
uri: lb://user-service # 负载均衡到 user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1 # 去掉 /api 前缀
- id: order-service-route
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=1
请求流程:
客户端请求:http://gateway:8080/api/users/1
↓
网关路由匹配:/api/users/** → user-service
↓
去掉前缀:/api/users/1 → /users/1
↓
负载均衡:lb://user-service → http://192.168.1.100:8081
↓
实际请求:http://192.168.1.100:8081/users/1
七、Spring Cloud Alibaba 详解
7.1 Spring Cloud Alibaba 核心组件
┌──────────────────────────────────────────────────┐
│ Spring Cloud Alibaba 全家桶 │
├──────────────────────────────────────────────────┤
│ Nacos │ 服务发现 + 配置中心 │
│ Sentinel │ 流量控制、熔断降级 │
│ Seata │ 分布式事务 │
│ RocketMQ │ 消息队列 │
│ Dubbo │ RPC 通信(可选) │
│ Alibaba Cloud │ 阿里云服务集成 │
└──────────────────────────────────────────────────┘
7.2 Nacos(服务发现 + 配置中心)
7.2.1 服务注册与发现
xml
<!-- pom.xml -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
yaml
# application.yml
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev # 可以使用命名空间名称,但生产环境建议使用 ID(如:f5e9a7c3-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
group: DEFAULT_GROUP
metadata:
version: 1.0.0
region: hangzhou
java
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
7.2.2 配置中心
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
yaml
# bootstrap.yml
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev
group: DEFAULT_GROUP
shared-configs:
- data-id: common-db.yaml
group: DEFAULT_GROUP
refresh: true
- data-id: common-redis.yaml
group: DEFAULT_GROUP
refresh: true
Nacos 配置示例(在 Nacos 控制台创建):
yaml
# Data ID: user-service-dev.yaml
user:
max-age: 120
max-connections: 100
spring:
datasource:
url: jdbc:mysql://localhost:3306/userdb
username: root
password: password
动态配置刷新:
java
@RestController
@RefreshScope // 支持配置热更新
public class UserController {
@Value("${user.max-age:100}")
private Integer maxAge;
@GetMapping("/config")
public Map<String, Object> getConfig() {
return Map.of("maxAge", maxAge);
}
}
7.3 Sentinel(流量控制与熔断降级)
7.3.1 添加依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
yaml
# application.yml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
port: 8719
eager: true # 启动时立即连接
7.3.2 流量控制
java
@RestController
public class OrderController {
// 1. 注解方式限流
@GetMapping("/orders/{id}")
@SentinelResource(
value = "getOrder",
blockHandler = "handleBlock", // 限流处理
fallback = "handleFallback" // 异常降级
)
public Order getOrder(@PathVariable Long id) {
return orderService.getOrder(id);
}
// 限流处理方法
public Order handleBlock(Long id, BlockException ex) {
return new Order(id, "系统繁忙,请稍后重试");
}
// 异常降级方法
public Order handleFallback(Long id, Throwable ex) {
return new Order(id, "服务异常,请稍后重试");
}
}
在 Sentinel 控制台配置规则:
资源名:getOrder
限流阈值:QPS = 10
流控效果:快速失败
7.3.3 熔断降级
java
@Service
public class UserService {
@Autowired
private UserClient userClient;
@SentinelResource(
value = "getUser",
fallback = "getUserFallback",
exceptionsToIgnore = {IllegalArgumentException.class}
)
public User getUser(Long id) {
return userClient.getUser(id);
}
// 降级方法
public User getUserFallback(Long id, Throwable ex) {
log.error("获取用户失败: {}", id, ex);
return new User(id, "默认用户", "降级数据");
}
}
熔断规则(Sentinel 控制台配置):
熔断策略:慢调用比例
最大RT:500ms
比例阈值:0.5(50%)
熔断时长:10s
最小请求数:5
规则说明:
- 1秒内至少5个请求
- 如果超过50%的请求RT > 500ms
- 触发熔断,10秒内直接降级
7.3.4 OpenFeign 集成 Sentinel
yaml
# application.yml
feign:
sentinel:
enabled: true # 启用 Sentinel
java
// Feign 客户端
@FeignClient(
name = "user-service",
fallback = UserClientFallback.class // 降级实现
)
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
// 降级实现类
@Component
public class UserClientFallback implements UserClient {
@Override
public User getUser(Long id) {
return new User(id, "降级用户", "服务降级");
}
}
7.4 Seata(分布式事务)
7.4.1 分布式事务场景
订单服务(order-service)
├─ 创建订单
├─ 调用库存服务(扣减库存)
└─ 调用账户服务(扣减余额)
问题:如何保证三个操作的事务一致性?
7.4.2 Seata AT 模式
前置准备 :每个业务数据库都需要创建 undo_log 表用于回滚
sql
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加依赖:
xml
<!-- pom.xml -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
yaml
# application.yml
spring:
cloud:
alibaba:
seata:
tx-service-group: my-tx-group
seata:
registry:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace: seata
group: SEATA_GROUP
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
java
// 订单服务
@Service
public class OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private StorageClient storageClient;
@Autowired
private AccountClient accountClient;
@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
public void createOrder(Order order) {
// 1. 创建订单
orderDao.create(order);
// 2. 扣减库存(远程调用)
storageClient.decrease(order.getProductId(), order.getCount());
// 3. 扣减账户余额(远程调用)
accountClient.decrease(order.getUserId(), order.getMoney());
// 任何一步失败,全部回滚
}
}
Seata 工作流程:
1. TM(事务管理器)开启全局事务
└─ 获得全局事务 XID
2. RM(资源管理器)注册分支事务
├─ order-service 注册分支事务1
├─ storage-service 注册分支事务2
└─ account-service 注册分支事务3
3. 各分支执行业务逻辑
└─ 记录前后镜像(回滚日志)
4. 提交或回滚
├─ 成功 → TC 通知各 RM 删除回滚日志
└─ 失败 → TC 通知各 RM 回滚
7.5 RocketMQ(消息队列)
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
yaml
# application.yml
spring:
cloud:
stream:
rocketmq:
binder:
name-server: 127.0.0.1:9876
bindings:
output: # 生产者
destination: order-topic
content-type: application/json
input: # 消费者
destination: order-topic
content-type: application/json
group: order-group
java
// 生产者
@Service
public class OrderService {
@Autowired
private StreamBridge streamBridge;
public void createOrder(Order order) {
// 保存订单
orderDao.save(order);
// 发送消息
streamBridge.send("output", order);
}
}
// 消费者(函数式编程模型,Spring Cloud Stream 3.x+)
@Configuration
public class OrderListener {
@Bean
public Consumer<Order> handleOrder() {
return order -> {
System.out.println("收到订单: " + order);
// 处理业务逻辑
};
}
}
// 注意:旧版本 @StreamListener 已弃用,建议使用函数式编程模型
7.6 Spring Cloud vs Spring Cloud Alibaba
| 功能 | Spring Cloud(Netflix) | Spring Cloud Alibaba |
|---|---|---|
| 服务发现 | Eureka(维护模式) | Nacos(活跃) |
| 配置中心 | Config Server | Nacos Config |
| 负载均衡 | Ribbon(维护模式) | LoadBalancer / Ribbon |
| 服务调用 | OpenFeign | OpenFeign / Dubbo |
| 熔断降级 | Hystrix(停止开发) | Sentinel |
| API 网关 | Zuul(停止)/ Gateway | Gateway |
| 分布式事务 | - | Seata |
| 消息队列 | Stream(通用) | RocketMQ |
| 链路追踪 | Sleuth + Zipkin | Sleuth + Zipkin |
| 社区支持 | Netflix 已停止维护部分组件 | 阿里巴巴持续维护 |
| 适用场景 | 通用微服务 | 阿里云生态、国内项目 |
八、技术选型与最佳实践
8.1 技术选型决策树
项目类型选择:
小型应用/个人项目(< 10万用户)
└─ Spring Boot 单体应用
├─ Spring Boot + MyBatis/JPA
├─ Spring Boot + Redis
└─ 部署:单机 / Docker
中型应用(10万-100万用户)
├─ 选择1:单体应用(垂直扩展)
│ └─ Spring Boot + 分库分表
│
└─ 选择2:微服务(水平扩展)
└─ Spring Boot + Spring Cloud Alibaba
├─ Nacos(服务发现 + 配置)
├─ Sentinel(限流熔断)
└─ Gateway(网关)
大型应用(> 100万用户)
└─ 微服务架构(必选)
└─ Spring Boot + Spring Cloud Alibaba
├─ Nacos
├─ Sentinel
├─ Seata(分布式事务)
├─ RocketMQ(消息队列)
├─ Gateway
└─ Kubernetes(容器编排)
8.2 微服务架构演进路径
阶段1:单体应用
┌─────────────────────────────┐
│ Spring Boot 应用 │
│ ├─ 所有功能在一个应用 │
│ └─ 单数据库 │
└─────────────────────────────┘
阶段2:服务拆分(初期)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 用户服务 │ │ 订单服务 │ │ 商品服务 │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└──────────────┼──────────────┘
│
直接调用(硬编码地址)
阶段3:引入服务发现
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 用户服务 │ │ 订单服务 │ │ 商品服务 │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└──────────────┼──────────────┘
│
┌────────────────┐
│ Nacos Discovery│
└────────────────┘
阶段4:完善微服务治理
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 用户服务 │ │ 订单服务 │ │ 商品服务 │
└──────────┘ └──────────┘ └──────────┘
│ │ │
└──────────────┼──────────────┘
│
┌─────────────┼─────────────┐
│ │ │
┌────────┐ ┌──────────┐ ┌──────────┐
│ Nacos │ │ Sentinel │ │ Gateway │
└────────┘ └──────────┘ └──────────┘
阶段5:云原生(终极)
┌─────────────────────────────────────┐
│ Kubernetes 集群 │
│ ├─ 服务编排 │
│ ├─ 自动扩缩容 │
│ ├─ 服务网格(Istio) │
│ └─ 监控告警(Prometheus + Grafana) │
└─────────────────────────────────────┘
8.3 依赖版本兼容性
8.3.1 版本对应关系
| Spring Boot | Spring Cloud | Spring Cloud Alibaba | JDK | 说明 |
|---|---|---|---|---|
| 3.2.x | 2023.0.x (Leyton) | 2022.0.0.0 | 17+ | 最新版本,推荐新项目使用 |
| 3.1.x | 2022.0.x (Kilburn) | 2022.0.0.0-RC2 | 17+ | 稳定版本 |
| 3.0.x | 2022.0.x (Kilburn) | 2022.0.0.0-RC1 | 17+ | |
| 2.7.x | 2021.0.x (Jubilee) | 2021.0.5.0 | 8/11/17 | LTS 推荐,生产环境首选 |
| 2.6.x | 2021.0.x (Jubilee) | 2021.0.4.0 | 8/11/17 | 稳定版本 |
| 2.4.x | 2020.0.x (Ilford) | 2021.1 | 8/11 | |
| 2.3.x | Hoxton.SR12 | 2.2.x.RELEASE | 8/11 | 已停止维护 |
版本选择建议:
- 新项目:Spring Boot 3.2.x + Spring Cloud 2023.0.x + JDK 17
- 生产环境:Spring Boot 2.7.x + Spring Cloud 2021.0.x + JDK 8/11(更稳定)
- 老项目升级:建议逐步升级,先升级到 2.7.x,再考虑 3.x
8.3.2 推荐依赖配置
xml
<!-- pom.xml -->
<properties>
<java.version>17</java.version>
<spring-boot.version>3.2.1</spring-boot.version>
<spring-cloud.version>2023.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
8.4 最佳实践
8.4.1 服务拆分原则
1. 单一职责原则
└─ 一个服务只负责一个业务领域
2. 高内聚低耦合
├─ 服务内部功能高度相关
└─ 服务之间依赖最小化
3. 按业务能力拆分
└─ 围绕业务领域(DDD)
4. 数据隔离
└─ 每个服务独立数据库
5. 大小适中
├─ 不要过度拆分(10-20个微服务合理)
└─ 团队能够维护
8.4.2 服务通信方式选择
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 同步查询 | OpenFeign | 简单易用、声明式 |
| 异步通知 | RocketMQ | 解耦、削峰 |
| 实时通信 | WebSocket | 双向通信 |
| 高性能RPC | Dubbo | 性能优于HTTP |
| 跨语言 | gRPC | Protobuf 序列化 |
8.4.3 配置管理最佳实践
yaml
# bootstrap.yml(优先级最高)
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: ${spring.profiles.active}
group: DEFAULT_GROUP
file-extension: yaml
shared-configs: # 共享配置
- data-id: common-db.yaml
refresh: true
- data-id: common-redis.yaml
refresh: true
profiles:
active: @profiles.active@ # Maven 动态替换
# Nacos 配置文件命名规范:
# ${spring.application.name}-${spring.profiles.active}.${file-extension}
# 示例:user-service-dev.yaml
8.4.4 日志链路追踪
xml
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
yaml
# application.yml
spring:
sleuth:
sampler:
probability: 1.0 # 采样率 100%
zipkin:
base-url: http://localhost:9411
日志输出:
[user-service,abc123,def456,true] INFO - 查询用户
│ │ │ │
│ │ │ └─ 是否导出到 Zipkin
│ │ └─ Span ID
│ └─ Trace ID(全链路唯一)
└─ 服务名
九、完整示例项目
9.1 项目架构
电商微服务项目
┌──────────────────────────────────────────────────┐
│ Gateway (网关) │
│ 端口:8080 │
└──────────────────────────────────────────────────┘
│
┌──────────────┼──────────────┐
│ │ │
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 用户服务 │ │ 订单服务 │ │ 商品服务 │
│ user-service │ │ order-service │ │product-service│
│ 端口:8081 │ │ 端口:8082 │ │ 端口:8083 │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
└──────────────┼──────────────┘
│
┌──────────────────────────────┐
│ Nacos (服务发现+配置中心) │
│ 端口:8848 │
└──────────────────────────────┘
9.2 父工程 POM
xml
<!-- mall-parent/pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>mall-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>mall-gateway</module>
<module>mall-user</module>
<module>mall-order</module>
<module>mall-product</module>
</modules>
<properties>
<java.version>17</java.version>
<spring-boot.version>3.2.1</spring-boot.version>
<spring-cloud.version>2023.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
9.3 网关服务
xml
<!-- mall-gateway/pom.xml -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
yaml
# mall-gateway/application.yml
server:
port: 8080
spring:
application:
name: mall-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true # 启用服务发现路由
routes:
- id: user-service
uri: lb://mall-user
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
- id: order-service
uri: lb://mall-order
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=1
- id: product-service
uri: lb://mall-product
predicates:
- Path=/api/products/**
filters:
- StripPrefix=1
java
// GatewayApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
9.4 用户服务
xml
<!-- mall-user/pom.xml -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
</dependencies>
yaml
# mall-user/bootstrap.yml
spring:
application:
name: mall-user
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
profiles:
active: dev
# mall-user/application.yml
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mall_user?useUnicode=true&characterEncoding=utf8
username: root
password: password
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
java
// UserServiceApplication.java
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.example.user.mapper")
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
// User.java
@Data
@TableName("users")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String email;
private Date createdAt;
}
// UserMapper.java
public interface UserMapper extends BaseMapper<User> {
}
// UserService.java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getById(Long id) {
return userMapper.selectById(id);
}
public List<User> list() {
return userMapper.selectList(null);
}
public boolean save(User user) {
return userMapper.insert(user) > 0;
}
}
// UserController.java
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
@SentinelResource(value = "getUser", blockHandler = "handleBlock")
public User getUser(@PathVariable Long id) {
return userService.getById(id);
}
@GetMapping
public List<User> listUsers() {
return userService.list();
}
@PostMapping
public boolean createUser(@RequestBody User user) {
return userService.save(user);
}
// 限流处理
public User handleBlock(Long id, BlockException ex) {
return new User(id, "系统繁忙", "", "", null);
}
}
9.5 订单服务
xml
<!-- mall-order/pom.xml -->
<dependencies>
<!-- 同 user-service -->
<!-- 添加 Feign 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Sentinel 整合 Feign -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
yaml
# mall-order/application.yml
server:
port: 8082
spring:
application:
name: mall-order
datasource:
url: jdbc:mysql://localhost:3306/mall_order
feign:
sentinel:
enabled: true # 启用 Sentinel
java
// OrderServiceApplication.java
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@MapperScan("com.example.order.mapper")
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
// Order.java
@Data
@TableName("orders")
public class Order {
@TableId(type = IdType.AUTO)
private Long id;
private Long userId;
private Long productId;
private Integer quantity;
private BigDecimal totalPrice;
private Date createdAt;
}
// UserClient.java (Feign 客户端)
@FeignClient(name = "mall-user", fallback = UserClientFallback.class)
public interface UserClient {
@GetMapping("/users/{id}")
User getUser(@PathVariable("id") Long id);
}
// UserClientFallback.java
@Component
public class UserClientFallback implements UserClient {
@Override
public User getUser(Long id) {
return new User(id, "降级用户", "", "", null);
}
}
// ProductClient.java
@FeignClient(name = "mall-product", fallback = ProductClientFallback.class)
public interface ProductClient {
@GetMapping("/products/{id}")
Product getProduct(@PathVariable("id") Long id);
}
// OrderService.java
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
@Autowired
private ProductClient productClient;
public Order createOrder(Order order) {
// 1. 验证用户
User user = userClient.getUser(order.getUserId());
if (user == null) {
throw new RuntimeException("用户不存在");
}
// 2. 验证商品
Product product = productClient.getProduct(order.getProductId());
if (product == null) {
throw new RuntimeException("商品不存在");
}
// 3. 计算总价
order.setTotalPrice(product.getPrice().multiply(new BigDecimal(order.getQuantity())));
// 4. 创建订单
orderMapper.insert(order);
return order;
}
}
// OrderController.java
@RestController
@RequestMapping("/orders")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping
public Order createOrder(@RequestBody Order order) {
return orderService.createOrder(order);
}
}
9.6 启动顺序
1. 启动 Nacos
└─ sh startup.sh -m standalone
2. 启动 Sentinel Dashboard(可选)
└─ java -jar sentinel-dashboard.jar
3. 启动微服务
├─ 启动 user-service (8081)
├─ 启动 product-service (8083)
├─ 启动 order-service (8082)
└─ 启动 gateway (8080)
4. 测试
└─ http://localhost:8080/api/users/1