30分钟快速搭建 Spring Cloud Alibaba 微服务实战(一)

本专栏主打SpringBoot + SpringCloud 一站式综合案例实战,摒弃零散小Demo、淘汰老旧版本,全程基于主流稳定版本,带你从零搭建一套结构规范、功能完整、可直接落地的企业级微服务项目。很多Java开发者都会SpringBoot和SpringCloud的基础语法,却依然搭不出完整微服务架构、做不了企业级项目、面试讲不出项目亮点,核心问题就是缺少一套完整、连贯、贴近生产的实战案例。

内容包括:

✅服务注册与发现、✅统一网关、

✅配置中心、✅熔断降级、

✅负载均衡、✅链路追踪、

✅权限控制、✅业务模块拆分。

将所有知识点全部融入真实业务场景,做到学一个、用一个、整合一个,彻底打通微服务开发全流程。无论你是刚学微服务的在校同学、需要补齐项目经验的初级开发,还是想要系统梳理微服务架构的职场开发者,本专栏都能帮你快速建立完整的微服务知识体系,积累高质量实战项目经验,真正实现看得懂、写得出、讲得清、用得上。

系列目录

基础理论部分:
npm vs pip
Maven和普通java项目的区别
Maven 生命周期的核心逻辑
Spring 核心特性IOC、AOP
认识Springboot中的各种注解
SpringBoot 标准执行流程详解
Spring Cloud、Spring Cloud Alibaba、SpringBoot这些易混淆概念梳理
实战部分:
springboot测试综合实例(JUnit 5 + SpringBootTest + MockMvc + H2 + Mockito)
30分钟快速搭建 Spring Cloud Alibaba 微服务实战(一)
30分钟快速搭建 Spring Cloud Alibaba 微服务实战(二)
30分钟快速搭建 Spring Cloud Alibaba 微服务实战(三)

文章目录

30分钟快速搭建 Spring Cloud Alibaba 微服务实战(可直接运行)

我给你准备最简、可直接运行、无废话的一套 Spring Cloud Alibaba 微服务 demo,包含微服务核心组件:

  • Nacos(服务注册/配置中心)
  • 服务提供者(提供接口)
  • 服务消费者(OpenFeign 远程调用)
  • Gateway(网关统一入口)

一、环境准备(1分钟)

1. 必须安装

  • JDK 8+ / 11
  • Maven 3.6+
  • IDEA / Eclipse

2. 启动 Nacos(核心!)

直接下载单机版 Nacos(不用改配置):

👉 Nacos 2.3.2 下载

解压后执行:

bash 复制代码
# Windows
bin/startup.cmd -m standalone

# Mac/Linux
bin/startup.sh -m standalone

在当前目录下右键点击在终端中打开,注意路径不要有中文

访问控制台:

http://localhost:8848/nacos

账号密码:nacos / nacos

看到这个界面就成功了!

二、项目结构(4个微服务)

复制代码
spring-cloud-alibaba-demo
├── gateway-server        # 网关 8080
├── provider-service      # 服务提供者 8081
├── consumer-service      # 服务消费者 8082
└── pom.xml               # 父工程统一版本

右键父工程 → New → Module,创建第一个子模块

选择 Spring Initializr

名字填 provider-service(和你后面要写的 完全一致)

勾选 Spring Web 和 Nacos Discovery(后面再调整依赖也可以)

点 Finish,它会自动在父工程下创建 provider-service 文件夹和 pom

重复刚才步骤 ,创建另外两个子模块

分别创建 consumer-service 和 gateway-server

补充说明:

java 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.13</version>
</parent>

❌️上面代码 <artifactId> spring-boot-starter-parent </artifactId>不能这样写,父工程是 Maven 聚合工程,不能加 Spring Boot 父依赖!

三、父工程 pom.xml(统一版本)

新建 Maven 项目,只保留 pom.xml,内容如下:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-cloud-alibaba-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>provider-service</module>
        <module>consumer-service</module>
        <module>gateway-server</module>
    </modules>

    <!-- 正确版本:Spring Boot 3.5.13 专用 -->
    <properties>
        <java.version>17</java.version>
        <spring.boot.version>3.5.13</spring.boot.version>
        <spring.cloud.version>2023.0.1</spring.cloud.version>
        <spring.cloud.alibaba.version>2023.0.1.0</spring.cloud.alibaba.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>

四、服务提供者(provider-service)

1. pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>provider-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider-service</name>
    <description>provider-service</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <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>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. application.yml

yaml 复制代码
server:
  port: 8081

spring:
  application:
    name: provider-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

3. 启动类 + 接口

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

// 提供接口
@RestController
@RequestMapping("/api")
public class ProviderController {
    @GetMapping("/hello")
    public String hello() {
        return "我是【微服务提供者】,端口:8081";
    }
}

五、服务消费者(consumer-service)

1. pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>consumer-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer-service</name>
    <description>consumer-service</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <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>
        <!-- OpenFeign 远程调用 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. application.yml

yaml 复制代码
server:
  port: 8082

spring:
  application:
    name: consumer-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

3. 启动类 + Feign 接口 + 控制层

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients  // 开启远程调用
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

// Feign 远程调用提供者
@FeignClient(name = "provider-service")
public interface ProviderFeign {
    @GetMapping("/api/hello")
    String hello();
}

// 消费者接口
@RestController
@RequestMapping("/api")
public class ConsumerController {
    @Autowired
    private ProviderFeign providerFeign;

    @GetMapping("/test")
    public String test() {
        return "【微服务消费者】调用提供者 => " + providerFeign.hello();
    }
}

六、网关(gateway-server)

1. pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>gateway-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gateway-server</name>
    <description>gateway-server</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. application.yml

yaml 复制代码
server:
  port: 8080

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        - id: provider
          uri: lb://provider-service
          predicates:
            - Path=/provider/**
          filters:
            - RewritePath=/provider/(?<segment>.*), /$\{segment}

        - id: consumer
          uri: lb://consumer-service
          predicates:
            - Path=/consumer/**
          filters:
            - RewritePath=/consumer/(?<segment>.*), /$\{segment}

3. 启动类

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

七、启动并体验微服务(最关键!)

1. 按顺序启动

  1. Nacos(8848)
  2. provider-service(8081)
  3. consumer-service(8082)
  4. gateway-server(8080)

打开 Nacos 控制台 → 服务管理 → 服务列表

你会看到 3 个服务全部注册成功

八、测试接口(体验微服务调用)

1. 直接访问提供者

http://localhost:8081/api/hello

2. 直接访问消费者(消费者远程调用提供者)

http://localhost:8082/api/test

3. 通过网关访问(统一入口)

访问:网关 → 提供者

http://localhost:8080/provider/api/hello

完整流程(按顺序走)

1.浏览器请求到达 Gateway 网关(8080)

2.网关根据 Path 路由匹配

看到 /provider/** → 匹配到 provider 这条路由

3.网关从 Nacos 拉取服务列表

问 Nacos:provider-service 在哪?

Nacos 回答:在 localhost:8081

4.网关通过负载均衡(lb://)转发请求

把 /provider/api/hello 重写为 /api/hello

5.请求到达 provider-service(8081)

6.提供者执行 Controller 方法,返回结果

7.结果原路返回网关 → 再返回浏览器

九、你现在体验到的微服务能力

✅ 服务注册发现(Nacos)

✅ 服务间远程调用(OpenFeign)

✅ 统一网关入口(Spring Cloud Gateway)

✅ 负载均衡(默认 Ribbon/LoadBalancer)

✅ 微服务多模块独立部署

报错解决

你有可能会报错

原因是:在 Spring Boot 3.x 环境下,这个问题 90% 都是因为 Gateway 缺少 spring-cloud-starter-loadbalancer 依赖,导致 lb:// 协议无法解析,无法转发请求到 provider-service。

解决方法是:Spring Boot 3.x 里,lb:// 协议需要单独引入负载均衡依赖,否则会报错:这是 Spring Boot 3.x 的变化,原来的 Ribbon 被移除了,必须手动引入 spring-cloud-starter-loadbalancer。

在 gateway-server 的 pom.xml 里添加:下面代码

xml 复制代码
xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

另外在consumer-service中也要添加

xml 复制代码
xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

因为feign也需要loadbalancer不然会报错

本系列最终所有服务启动命令整理

  • nacos
    PS E:\0WHXY\stfxs\nacos-server-2.3.2\nacos> bin/startup.cmd -m standalone
    nacos界面访问http://localhost:8848/nacos/#/serviceManagement
  • seata
    PS E:\0WHXY\stfxs\seata-2.1.0-incubating-bin> bin/seata-server.bat -p 8091 -m filee
  • rocketmq的nameserver
    PS E:\0WHXY\stfxs\rocketmq-all-4.9.4-bin> $env:ROCKETMQ_HOME="E:\0WHXY\stfxs\rocketmq-all-4.9.4-bin"
    PS E:\0WHXY\stfxs\rocketmq-all-4.9.4-bin> bin/mqnamesrv.cmd
  • rocketmq的broker
    PS E:\0WHXY\stfxs\rocketmq-all-4.9.4-bin> $env:ROCKETMQ_HOME="E:\0WHXY\stfxs\rocketmq-all-4.9.4-bin"
    PS E:\0WHXY\stfxs\rocketmq-all-4.9.4-bin> bin/mqbroker.cmd -n localhost:9876 -c ./conf/broker.conf
  • 启动rocketmq的面板
    PS E:\0WHXY\stfxs> java -jar rocketmq-dashboard-2.1.0.jar
    rocketmq的面板界面访问http://localhost:8082/
  • 启动rocketmq的面板
    PS E:\0WHXY\stfxs> java -jar rocketmq-dashboard-2.1.0.jar
    rocketmq的面板界面访问http://localhost:8082/
  • 启动sentinel的面板
    PS E:\0WHXY\stfxs> java "-Dserver.port=8858" -jar .\sentinel-dashboard-1.8.9.jar
    sentinel的面板界面访问http://localhost:8858/#/dashboard
相关推荐
贵慜_Derek18 小时前
《从零实现 Agent 系统》连载 32|闭集 IE 与小模型:分类、意图与字段抽取
人工智能·架构·agent
江米小枣tonylua1 天前
译:设计生产级 RAG 架构
架构
怕浪猫1 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
怕浪猫1 天前
哪些软件对 Chrome DevTools Protocol 频繁使用
人工智能·架构·前端框架
Jack202 天前
HarmonyOS APP事件驱动大揭秘
架构
米丘2 天前
微前端之 Web Components 完全指南
微服务·html
Colin草率地做慢慢地改2 天前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
candyTong2 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
唐某人丶2 天前
从画架构图开始:架构分析与进阶指南
架构