第一部分:核心概念解析
理解 Spring Boot、Spring Cloud 和 Spring Cloud Alibaba 之间的层次关系是掌握微服务架构的基石。
Spring Boot:快速搭建房子的"主体结构"
一句话总结:它是一个让你能快速构建单个、可独立运行的微服务(一栋栋独立的房子)的强大工具。
Spring Boot 是一个快速开发框架,它基于**"约定优于配置"**的理念,通过"起步依赖" (Starters) 和"自动配置" (Auto-Configuration) 极大地简化了 Spring 应用的创建和部署过程。
- 起步依赖 (
spring-boot-starter-web
) :自动管理和引入构建特定类型应用(如 Web 应用)所需的全套依赖。 - 自动配置:智能地配置应用程序所需的 Bean,如数据源、Web 服务器等,开发者无需编写大量样板配置。
- 内嵌服务器 (Tomcat, Jetty) :允许将应用打包成一个可执行的 JAR 文件,无需外部 Web 服务器即可独立运行。
Spring Cloud:规划整个"城市"的"蓝图和公共设施"
一句话总结:它是一套构建微服务生态(一座城市)的顶层设计规范和接口,它依赖 Spring Boot 来实现每一个微服务(房子)。
当拥有了多个由 Spring Boot 构建的微服务后,如何管理它们就成了新问题。Spring Cloud 为此提供了一套标准的微服务治理规范和接口,用于解决:
- 服务注册与发现:服务如何找到彼此?
- 负载均衡:如何将请求分发到服务的多个实例?
- 服务容错与熔断:当某个服务不可用时如何避免级联失败?
- 统一配置管理:如何集中管理所有服务的配置?
- API 网关:如何为系统提供统一的、安全的入口?
Spring Cloud 只定义了这些"规范",但它本身不提供具体的实现。
Spring Cloud Alibaba:按蓝图建设城市的"阿里施工队"
一句话总结:它是 Spring Cloud 微服务治理规范的一套"全家桶"实现方案,让你能够真正搭建起一个高可用的微服务系统。
Spring Cloud Alibaba 是 Spring Cloud 规范的一套完整、高性能的实现,由阿里巴巴集团开源。它提供了构建分布式应用所需的全套组件,是目前最主流的实现方案之一。
- Nacos : 提供服务注册发现 和配置管理功能。
- Sentinel : 提供强大的流量控制、熔断降级和系统负载保护功能。
- RocketMQ : 高性能的消息队列,用于服务间异步通信。
- Seata : 提供分布式事务解决方案,保障数据最终一致性。
- OpenFeign: 声明式的服务调用客户端,与上述组件无缝集成。
关系总结与架构图
arduino
Syntax error in textmermaid version 10.9.1
ERROR: [Mermaid] Parse error on line 5:
...pring Cloud Netflix (旧): Netflix 提供的实现];
-----------------------^
Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'
层级关系 :Spring Boot 是基础 -> Spring Cloud 在其上定义规范 -> Spring Cloud Alibaba 提供这套规范的具体实现。
第二部分:Nacos 单机部署 (开发与测试)
单机模式非常适合本地开发和功能测试,它使用内置数据库,无需外部依赖。
步骤 1:环境准备
确保你的系统中已安装 Java 环境。
bash
# Nacos 2.x 需要 JDK 1.8 或更高版本
java -version
步骤 2:下载并解压 Nacos
-
访问 Nacos 的 GitHub Releases 页面。
-
选择一个稳定版本,下载
nacos-server-x.x.x.tar.gz
(Linux/macOS) 或.zip
(Windows) 文件。 -
解压文件:
bashtar -xvf nacos-server-x.x.x.tar.gz cd nacos
步骤 3:以单机模式启动
进入 nacos/bin
目录,执行启动脚本,并明确指定 -m standalone
参数。
-
Linux / macOS:
sh startup.sh -m standalone
-
Windows:
startup.cmd -m standalone
步骤 4:验证部署
-
查看日志 :
tail -f logs/nacos.log
,看到 "Nacos started successfully" 即表示成功。 -
访问控制台 : 打开浏览器访问
http://127.0.0.1:8848/nacos
。- 默认账号 :
nacos
- 默认密码 :
nacos
- 默认账号 :
第三部分:生产级微服务基础设施部署
生产环境必须保证高可用,所有中间件都应以集群模式部署。
架构概览
步骤 1:准备数据库 (MySQL)
Nacos 和 Seata 在集群模式下都需要外部数据库。
-
安装 MySQL 5.7+ 。
-
创建两个独立的数据库:
sql-- 用于 Nacos 的数据库 CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 用于 Seata 的数据库 CREATE DATABASE seata CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-
初始化数据库表:
- Nacos : 导入 Nacos 安装包
conf/
目录下的nacos-mysql.sql
到nacos_config
数据库。 - Seata : 导入 Seata Server 安装包
conf/
目录下的db_store.sql
到seata
数据库。
- Nacos : 导入 Nacos 安装包
步骤 2:部署 Nacos 集群
-
准备至少3台服务器,并在每台服务器上解压 Nacos。
-
修改配置
conf/application.properties
:在每一台 Nacos 服务器上,配置数据库连接。inispring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://[你的MySQL_IP]:3306/nacos_config?characterEncoding=utf8&useSSL=false db.user.0=[你的MySQL用户名] db.password.0=[你的MySQL密码]
-
配置集群节点
conf/cluster.conf
:在每一台 Nacos 服务器上,创建该文件并列出所有 Nacos 节点的 IP 和端口。makefile192.168.1.1:8848 192.168.1.2:8848 192.168.1.3:8848
-
启动所有节点 :在每台服务器的
bin
目录下执行sh startup.sh
(不带任何参数)。
步骤 3:部署 RocketMQ 集群
-
准备至少2台服务器,解压 RocketMQ。
-
启动 NameServer:在多台机器上启动,它们之间无通信。
bash# 在每台 NameServer 机器上执行 nohup sh bin/mqnamesrv &
-
修改 Broker 配置 : 在
conf/
目录下创建broker.properties
文件,配置namesrvAddr
指向所有 NameServer。inibrokerClusterName = DefaultCluster brokerName = broker-a brokerId = 0 deleteWhen = 04 fileReservedTime = 48 # 列出所有 NameServer 的地址 namesrvAddr = 192.168.1.10:9876;192.168.1.11:9876
-
启动 Broker:
bashnohup sh bin/mqbroker -c /path/to/broker.properties &
步骤 4:部署 Seata Server 集群
-
下载 Seata Server 并解压到多台服务器。
-
修改配置
conf/file.conf
:配置存储模式为db
并填入数据库信息。inistore { mode = "db" } db { datasource = "druid" dbType = "mysql" driverClassName = "com.mysql.cj.jdbc.Driver" url = "jdbc:mysql://[你的MySQL_IP]:3306/seata" user = "[你的MySQL用户名]" password = "[你的MySQL密码]" }
-
修改配置
conf/registry.conf
:配置注册中心为 Nacos。iniregistry { type = "nacos" nacos { serverAddr = "192.168.1.1:8848,192.168.1.2:8848,192.168.1.3:8848" # Nacos 集群地址 namespace = "" cluster = "default" } }
-
启动 Seata Server :在每台 Seata 机器上执行
sh bin/seata-server.sh
。
步骤 5:部署 Sentinel Dashboard
-
下载 Sentinel Dashboard 的 JAR 包。
-
启动 Dashboard 并配置规则持久化到 Nacos:
inijava -Dserver.port=8080 \ -Dcsp.sentinel.dashboard.server=localhost:8080 \ -Dproject.name=sentinel-dashboard \ -Dcsp.sentinel.datasource.nacos.server-addr="192.168.1.1:8848" \ -Dcsp.sentinel.datasource.nacos.namespace="" \ -Dcsp.sentinel.datasource.nacos.group-id="SENTINEL_GROUP" \ -Dcsp.sentinel.datasource.nacos.data-id-suffix="-flow-rules" \ -Dcsp.sentinel.datasource.nacos.data-type="json" \ -jar sentinel-dashboard.jar
第四部分:微服务应用编码与部署
步骤 1:添加 Maven 依赖
在项目 pom.xml
中添加 Spring Cloud Alibaba 的 BOM (Bill of Materials) 和核心依赖。
xml
<properties>
<spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
<dependencies>
<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.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
步骤 2:核心配置 (bootstrap.yml)
在 src/main/resources
目录下创建 bootstrap.yml
,用于连接 Nacos。
yaml
spring:
application:
name: order-service # 定义你的应用名,必须唯一
cloud:
nacos:
# Nacos Server 地址 (集群)
server-addr: 192.168.1.1:8848,192.168.1.2:8848,192.168.1.3:8848
# 配置中心配置
config:
file-extension: yml # 配置文件格式
group: DEFAULT_GROUP # 配置分组
shared-configs: # 共享配置
- data-id: common.yml
refresh: true
# 服务发现配置
discovery:
group: DEFAULT_GROUP
步骤 3:在 Nacos 上创建配置
登录 Nacos 控制台,为你的服务创建配置文件。
-
创建共享配置
common.yml
: (Data ID:common.yml
, Group:DEFAULT_GROUP
)yaml# Sentinel 配置 spring.cloud.sentinel: transport: dashboard: 192.168.1.20:8080 # Sentinel Dashboard 地址 datasource: flow: nacos: server-addr: ${spring.cloud.nacos.server-addr} data-id: ${spring.application.name}-flow-rules group-id: SENTINEL_GROUP data-type: json rule-type: flow # RocketMQ 配置 spring.cloud.stream: rocketmq: binder: name-server: 192.168.1.10:9876;192.168.1.11:9876 # RocketMQ NameServer 地址 # Seata 配置 seata: enabled: true tx-service-group: "my_tx_group" # 事务分组 registry: type: "nacos" nacos: application: "seata-server" server-addr: ${spring.cloud.nacos.server-addr}
-
创建应用配置
order-service.yml
: (Data ID:order-service.yml
, Group:DEFAULT_GROUP
)yamlserver: port: 8081 spring: datasource: url: "jdbc:mysql://[业务数据库IP]:3306/db_order?useUnicode=true" username: user password: password # Feign 配置 feign: sentinel: enabled: true
步骤 4:代码实现示例
-
启动类: 启用服务发现和 Feign。
less@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
-
Feign 客户端: 调用库存服务。
less// "product-service" 是库存服务在 Nacos 上的应用名 @FeignClient("product-service") public interface ProductFeignClient { @PostMapping("/product/deduct") void deductStock(@RequestParam("productId") Long productId, @RequestParam("count") Integer count); }
-
全局事务 : 使用
@GlobalTransactional
注解。less@Service public class OrderServiceImpl implements OrderService { @Autowired private OrderDao orderDao; @Autowired private ProductFeignClient productFeignClient; @Override @GlobalTransactional(name = "create-order-tx", rollbackFor = Exception.class) // 开启全局事务 public void createOrder(Order order) { // 1. 创建订单 (本地事务) orderDao.create(order); // 2. 调用库存服务扣减库存 (RPC) productFeignClient.deductStock(order.getProductId(), order.getCount()); } }
步骤 5:打包与运行
- 打包 :
mvn clean package -DskipTests
- 部署 : 将
target/
目录下的 JAR 包上传到服务器。 - 运行 :
java -jar your-app-name-0.0.1-SNAPSHOT.jar
步骤 6:全链路验证
- Nacos 控制台 :服务管理 -> 服务列表,检查
order-service
、product-service
等是否都已注册成功。 - Sentinel 控制台:访问你的服务接口几次,检查仪表盘是否出现应用名和资源。
- Seata:调用全局事务接口,检查相关数据库表的数据是否一致。模拟失败场景,验证事务是否成功回滚。
- RocketMQ Dashboard: (如果部署了) 检查 Topic 的消息生产和消费情况。
- 应用日志 :
tail -f logs/spring.log
检查有无异常。