Spring Cloud Alibaba 微服务从入门到生产部署完整指南

第一部分:核心概念解析

理解 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

  1. 访问 Nacos 的 GitHub Releases 页面

  2. 选择一个稳定版本,下载 nacos-server-x.x.x.tar.gz (Linux/macOS) 或 .zip (Windows) 文件。

  3. 解压文件:

    bash 复制代码
    tar -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:验证部署

  1. 查看日志 : tail -f logs/nacos.log,看到 "Nacos started successfully" 即表示成功。

  2. 访问控制台 : 打开浏览器访问 http://127.0.0.1:8848/nacos

    • 默认账号 : nacos
    • 默认密码 : nacos

第三部分:生产级微服务基础设施部署

生产环境必须保证高可用,所有中间件都应以集群模式部署。

架构概览

步骤 1:准备数据库 (MySQL)

Nacos 和 Seata 在集群模式下都需要外部数据库。

  1. 安装 MySQL 5.7+

  2. 创建两个独立的数据库:

    sql 复制代码
    -- 用于 Nacos 的数据库
    CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    ​
    -- 用于 Seata 的数据库
    CREATE DATABASE seata CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  3. 初始化数据库表:

    • Nacos : 导入 Nacos 安装包 conf/ 目录下的 nacos-mysql.sqlnacos_config 数据库。
    • Seata : 导入 Seata Server 安装包 conf/ 目录下的 db_store.sqlseata 数据库。

步骤 2:部署 Nacos 集群

  1. 准备至少3台服务器,并在每台服务器上解压 Nacos。

  2. 修改配置 conf/application.properties :在每一台 Nacos 服务器上,配置数据库连接。

    ini 复制代码
    spring.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密码]
  3. 配置集群节点 conf/cluster.conf :在每一台 Nacos 服务器上,创建该文件并列出所有 Nacos 节点的 IP 和端口。

    makefile 复制代码
    192.168.1.1:8848
    192.168.1.2:8848
    192.168.1.3:8848
  4. 启动所有节点 :在每台服务器的 bin 目录下执行 sh startup.sh (不带任何参数)。

步骤 3:部署 RocketMQ 集群

  1. 准备至少2台服务器,解压 RocketMQ。

  2. 启动 NameServer:在多台机器上启动,它们之间无通信。

    bash 复制代码
    # 在每台 NameServer 机器上执行
    nohup sh bin/mqnamesrv &
  3. 修改 Broker 配置 : 在 conf/ 目录下创建 broker.properties 文件,配置 namesrvAddr 指向所有 NameServer。

    ini 复制代码
    brokerClusterName = DefaultCluster
    brokerName = broker-a
    brokerId = 0
    deleteWhen = 04
    fileReservedTime = 48
    # 列出所有 NameServer 的地址
    namesrvAddr = 192.168.1.10:9876;192.168.1.11:9876
  4. 启动 Broker

    bash 复制代码
    nohup sh bin/mqbroker -c /path/to/broker.properties &

步骤 4:部署 Seata Server 集群

  1. 下载 Seata Server 并解压到多台服务器。

  2. 修改配置 conf/file.conf :配置存储模式为 db 并填入数据库信息。

    ini 复制代码
    store {
      mode = "db"
    }
    db {
      datasource = "druid"
      dbType = "mysql"
      driverClassName = "com.mysql.cj.jdbc.Driver"
      url = "jdbc:mysql://[你的MySQL_IP]:3306/seata"
      user = "[你的MySQL用户名]"
      password = "[你的MySQL密码]"
    }
  3. 修改配置 conf/registry.conf:配置注册中心为 Nacos。

    ini 复制代码
    registry {
      type = "nacos"
      nacos {
        serverAddr = "192.168.1.1:8848,192.168.1.2:8848,192.168.1.3:8848" # Nacos 集群地址
        namespace = "" 
        cluster = "default"
      }
    }
  4. 启动 Seata Server :在每台 Seata 机器上执行 sh bin/seata-server.sh

步骤 5:部署 Sentinel Dashboard

  1. 下载 Sentinel Dashboard 的 JAR 包

  2. 启动 Dashboard 并配置规则持久化到 Nacos

    ini 复制代码
    java -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 控制台,为你的服务创建配置文件。

  1. 创建共享配置 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}
  2. 创建应用配置 order-service.yml : (Data ID: order-service.yml, Group: DEFAULT_GROUP)

    yaml 复制代码
    server:
      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:打包与运行

  1. 打包 : mvn clean package -DskipTests
  2. 部署 : 将 target/ 目录下的 JAR 包上传到服务器。
  3. 运行 : java -jar your-app-name-0.0.1-SNAPSHOT.jar

步骤 6:全链路验证

  1. Nacos 控制台 :服务管理 -> 服务列表,检查 order-serviceproduct-service 等是否都已注册成功。
  2. Sentinel 控制台:访问你的服务接口几次,检查仪表盘是否出现应用名和资源。
  3. Seata:调用全局事务接口,检查相关数据库表的数据是否一致。模拟失败场景,验证事务是否成功回滚。
  4. RocketMQ Dashboard: (如果部署了) 检查 Topic 的消息生产和消费情况。
  5. 应用日志tail -f logs/spring.log 检查有无异常。
相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp2 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi3 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy4 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9655 小时前
pip install 已经不再安全
后端
寻月隐君6 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github