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 检查有无异常。
相关推荐
IT_10241 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
ai小鬼头2 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
Touper.2 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
一只叫煤球的猫3 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
一只鹿鹿鹿3 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程
专注VB编程开发20年3 小时前
开机自动后台运行,在Windows服务中托管ASP.NET Core
windows·后端·asp.net
程序员岳焱3 小时前
Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
后端·mysql·性能优化
一只叫煤球的猫4 小时前
手撕@Transactional!别再问事务为什么失效了!Spring-tx源码全面解析!
后端·spring·面试
旷世奇才李先生4 小时前
Ruby 安装使用教程
开发语言·后端·ruby
沃夫上校7 小时前
Feign调Post接口异常:Incomplete output stream
java·后端·微服务