Spring Cloud Alibaba 生产实践:从零开始搭建微服务架构

小王的技术栈
2025-12-15 05:58
阅读 330

大家好,我是一名工作5年的后端开发工程师。这几年带过不少新人,也面试过上百位求职者。我发现很多同学在学习微服务时,一上来就被各种名词吓退了——Nacos、Sentinel、Seata……看起来高大上,其实拆开来看,每个组件解决的都是很具体的“产品”问题。

今天我就用最通俗的方式,带你从零搭建一个基于 Spring Cloud Alibaba 的微服务系统。这篇文章不是照搬文档,而是结合我在真实项目中的 实战经验,告诉你哪些配置是生产环境真正需要的,哪些是面试官喜欢问的 面试题挑战


什么是 Spring Cloud Alibaba?它能解决什么问题?

简单说,Spring Cloud Alibaba(SCA)是一套微服务解决方案,它帮我们快速实现:

  • 服务注册与发现(谁提供服务?在哪?)
  • 配置中心(不用重启就能改配置)
  • 流量控制(防止系统被突发流量打垮)
  • 分布式事务(跨服务的数据一致性)

如果你正在做一个支持高并发、可扩展的 产品,比如电商、支付、内容平台,那么 SCA 就是你的好帮手。

💡 我当初学的时候,以为微服务就是“把单体拆成多个小项目”,后来才发现,真正的难点在于如何让这些小服务协同工作且稳定可靠。SCA 正是为了解决这个问题而生。


环境准备:5分钟搭好开发环境

1. 基础依赖

确保你已安装以下工具:

工具 版本建议 用途
JDK 17(或 8/11) Java 运行环境
Maven 3.6+ 项目构建
IDE IntelliJ IDEA 开发工具(Eclipse 也可)
Nacos 2.2+ 服务注册与配置中心

2. 启动 Nacos 服务

下载 Nacos:https://github.com/alibaba/nacos/releases

解压后进入 bin 目录,执行:

# Linux/Mac
sh startup.sh -m standalone

# Windows
startup.cmd -m standalone

启动后访问 http://localhost:8848/nacos,默认账号密码都是 nacos

新手提示:一定要加 -m standalone 参数!否则默认是集群模式,本地跑不起来。


核心概念:用大白话讲清楚

1. 服务注册与发现

想象你开了家快递站(服务提供者),顾客(服务消费者)怎么知道你在哪?
→ 你把地址登记到“快递黄页”(Nacos),顾客去黄页查就行。

  • 服务提供者:把自己的 IP 和端口告诉 Nacos
  • 服务消费者:从 Nacos 拿到提供者的地址,发起调用

2. 配置中心

传统方式:改 application.yml → 重启应用 → 生产事故!
SCA 方式:改 Nacos 上的配置 → 应用自动刷新 → 零停机

3. 限流降级(Sentinel)

当秒杀活动来了,10万请求涌进来,你的数据库扛不住怎么办?
→ Sentinel 像个“交通警察”,超过阈值就拒绝请求或返回兜底数据。


实战项目:搭建一个用户-订单微服务系统

我们将创建两个服务:

  • user-service:提供用户信息
  • order-service:调用 user-service 创建订单

第一步:创建父工程(Maven 聚合)

<!-- pom.xml -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
</parent>

<properties>
    <java.version>17</java.version>
    <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
    <spring-cloud.version>2022.0.2</spring-cloud.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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

⚠️ 注意:Spring Boot 3.x 对应 SCA 2022.x,版本必须匹配!

第二步:编写 user-service

1. 添加依赖

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

2. 配置文件 application.yml

server:
  port: 8081

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

3. 编写控制器

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public Map<String, Object> getUser(@PathVariable Long id) {
        return Map.of("id", id, "name", "张三", "email", "zhangsan@example.com");
    }
}

第三步:编写 order-service(调用 user-service)

1. 同样添加 Nacos 依赖

2. 配置文件

server:
  port: 8082

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

3. 使用 RestTemplate + LoadBalancer 调用

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced // 关键!开启服务发现负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order/create")
    public String createOrder() {
        // 直接写服务名!不用写 IP 和端口
        String url = "http://user-service/user/1";
        Map user = restTemplate.getForObject(url, Map.class);
        return "订单创建成功,用户:" + user.get("name");
    }
}

第四步:启动 & 验证

  1. 启动 Nacos
  2. 启动 user-service(8081)
  3. 启启动 order-service(8082)
  4. 访问 http://localhost:8082/order/create

✅ 你会看到:订单创建成功,用户:张三

🔍 面试题挑战:为什么 RestTemplate 加了 @LoadBalanced 就能通过服务名调用?
答:Spring Cloud 自动集成了 Ribbon(现为 Spring Cloud LoadBalancer),它会从 Nacos 拉取服务列表,并做客户端负载均衡。


常见问题与避坑指南

❌ 问题1:服务启动了,但 Nacos 控制台看不到

  • 检查 spring.cloud.nacos.discovery.server-addr 是否写对
  • 检查网络是否通(telnet localhost 8848
  • 查看日志是否有 registering service... 字样

❌ 问题2:调用时报 UnknownHostException: user-service

  • 确认 RestTemplate 加了 @LoadBalanced
  • 确认两个服务都注册到了同一个 Nacos 集群

❌ 问题3:配置中心不生效

配置中心需要额外依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

并在 bootstrap.yml 中配置(注意是 bootstrap,不是 application):

spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml

💡 实战经验:生产环境中,一定要用 bootstrap.yml,因为配置中心的配置需要在应用启动前加载。


学习建议:下一步该学什么?

  1. 深入 Sentinel:学会配置 QPS 限流、熔断降级规则
  2. 集成 Seata:解决分布式事务问题(比如下单扣库存)
  3. 配置持久化:Nacos 默认用内嵌 Derby,生产环境要切 MySQL
  4. 监控告警:结合 Prometheus + Grafana 监控服务健康度

📌 最后送大家一句话:微服务不是银弹,复杂度换来了弹性。不要为了用微服务而拆分,要根据业务规模和团队能力做决策。


总结

今天我们用不到 100 行代码,搭建了一个具备服务注册、发现、调用的微服务系统。Spring Cloud Alibaba 的魅力在于:它把复杂的分布式问题,封装成了简单的注解和配置

记住:

  • Nacos = 服务注册中心 + 配置中心
  • @LoadBalanced = 自动服务寻址
  • 版本匹配是成功的第一步

希望这篇教程能帮你跨过微服务的第一道门槛。如果你觉得有用,欢迎分享给正在挣扎的小伙伴!

—— 一个喜欢把复杂东西讲简单的后端工程师

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝