Spring Cloud 微服务,从零开始怎么玩?

奇妙先知
2025-12-28 16:39
阅读 265

大家好,我是老张,一名干了五年后端开发的“老码农”。这几年带过不少新人,也写过几本技术书籍,但每次看到初学者面对微服务一脸懵的样子,我就想起自己当初学 Spring Cloud 时踩过的坑——文档看不懂、概念绕来绕去、跑个 Demo 都报错。所以今天,我想用最直白的方式,带你从零搭建一个真正的微服务项目。哪怕你连“微服务”是啥都不清楚,也能跟着做出来。

顺便说一句:这篇文章不讲理论堆砌,只聚焦一件事——动手跑通第一个微服务应用


为什么需要微服务?先别被术语吓到

想象一下:你开了一家小餐馆。最初,点菜、炒菜、收银、洗碗全由你一个人干(单体应用)。生意好了,人手不够,你就请了厨师、服务员、收银员(拆分成多个服务)。每个人只负责一块,效率高了,出问题也容易定位——这就是微服务的核心思想。

Spring Cloud 就是一套“工具包”,帮你管理这些“服务员”之间的沟通、故障处理、配置同步等问题。

💡 关键词提醒:虽然本文讲 Java 的 Spring Cloud,但微服务思想是通用的。比如 Go 语言也有类似生态(如 go-micro、Kratos),只是工具不同。如果你以后想用 Go 写微服务,理解这套逻辑会非常有帮助。


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

别急着写代码!先装好“铲子”和“砖头”。

必备工具清单

工具 作用 安装建议
JDK 17 Java 运行环境 推荐 Oracle JDK 或 OpenJDK
Maven 项目依赖管理 官网下载后配置 PATH
IntelliJ IDEA 开发 IDE 社区版免费,足够用
Git 代码版本控制 安装后初始化 git config
Postman 测试 HTTP 接口 可选,但强烈推荐

🛠️ 避坑提示:我当初用 JDK 8 跑 Spring Boot 3.x,直接报错!记住:Spring Boot 3+ 要求 JDK 17+。版本不匹配是新手最大痛点之一。

创建父工程(Maven 聚合项目)

微服务通常由多个子模块组成,我们先建个“总控台”。

# 在你的工作目录下执行
mkdir spring-cloud-demo && cd spring-cloud-demo

创建 pom.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>com.example</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>user-service</module>
        <module>order-service</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2023.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

关键点<packaging>pom</packaging> 表示这是父工程,不生成 jar 包;<modules> 声明子模块。


核心概念三件套:注册中心、服务调用、配置管理

微服务不是魔法,它解决三个基本问题:

  1. 服务在哪? → 用注册中心(如 Nacos、Eureka)
  2. 怎么调用别人? → 用声明式 HTTP 客户端(如 OpenFeign)
  3. 配置怎么统一? → 用配置中心(如 Spring Cloud Config、Nacos)

我们这次用 Nacos —— 阿里开源的一站式解决方案(支持注册 + 配置),比 Eureka + Config 搭配更简单。

第一步:启动 Nacos 服务

  1. Nacos GitHub Releases 下载最新版(如 nacos-server-2.2.3.zip)
  2. 解压后进入 bin 目录
  3. 执行(Linux/Mac):
    sh startup.sh -m standalone
    
    (Windows):
    startup.cmd -m standalone
    
  4. 浏览器访问 http://localhost:8848/nacos,账号密码都是 nacos

🔍 新手疑问:为什么不用 Docker?因为对零基础来说,直接运行更直观。等你熟悉后再上 Docker 不迟。


实战:搭建两个微服务并互相调用

我们现在做两件事:

  • user-service:提供用户信息查询
  • order-service:查询订单,并调用 user-service 获取用户姓名

1. 创建 user-service

在项目根目录执行:

mkdir user-service

user-service/pom.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>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>user-service</artifactId>

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

src/main/resources/application.yml

server:
  port: 8081

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

UserController.java

@RestController
public class UserController {

    @GetMapping("/users/{id}")
    public Map<String, Object> getUser(@PathVariable Long id) {
        // 模拟数据库查询
        Map<String, Object> user = new HashMap<>();
        user.put("id", id);
        user.put("name", "张三");
        return user;
    }
}

UserApplication.java

@SpringBootApplication
@EnableDiscoveryClient // 启用服务注册
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

启动后,打开 Nacos 控制台 → 服务列表,你会看到 user-service 已注册!


2. 创建 order-service 并调用 user-service

同样方式创建 order-service 模块。

order-service/pom.xml 额外加一个依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

application.yml

server:
  port: 8082

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

定义 Feign 客户端(远程调用接口):

@FeignClient(name = "user-service") // 对应注册的服务名
public interface UserClient {
    @GetMapping("/users/{id}")
    Map<String, Object> getUser(@PathVariable("id") Long id);
}

OrderController:

@RestController
public class OrderController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/orders/{orderId}")
    public Map<String, Object> getOrder(@PathVariable Long orderId) {
        Map<String, Object> order = new HashMap<>();
        order.put("orderId", orderId);
        order.put("product", "Java编程思想"); // 假装买了本书 📚

        // 调用 user-service
        Map<String, Object> user = userClient.getUser(1L);
        order.put("userName", user.get("name"));

        return order;
    }
}

主启动类加上 @EnableFeignClients

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 启用 Feign
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3. 测试整个链路

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

你应该看到返回:

{
  "orderId": 1001,
  "product": "Java编程思想",
  "userName": "张三"
}

恭喜!你完成了第一个微服务调用!


新手常见问题 & 解决方案

问题现象 可能原因 解决办法
服务没出现在 Nacos 应用未加 @EnableDiscoveryClient 或配置错误 检查 application.yml 中的 server-addr 和服务名
Feign 调用报 404 接口路径或参数不匹配 确保 @GetMapping 路径与提供方一致,@PathVariable 加 name
启动报错“No qualifying bean” 忘记加 @EnableFeignClients 在主类加上该注解
端口被占用 多个服务用了相同端口 修改 server.port

📌 经验之谈:我当初调不通 Feign,折腾半天才发现 @PathVariable 没写 value,而方法参数名和路径变量名不一致。细节决定成败!


下一步怎么学?我的学习路线建议

你已经迈出了最难的第一步。接下来,按这个顺序深入:

  1. 读一本好书:《Spring微服务实战》(John Carnell 著)——案例驱动,适合入门后进阶。
  2. 加入配置中心:把数据库连接、开关配置放到 Nacos,实现动态刷新。
  3. 加网关:用 Spring Cloud Gateway 统一入口,做路由和鉴权。
  4. 学熔断限流:集成 Sentinel,防止一个服务崩溃拖垮整个系统。
  5. 尝试其他语言:比如用 Go 写一个微服务(用 Gin + go-micro),对比理解架构思想。

🌟 最后鼓励:微服务不是银弹,小项目用单体更高效。但掌握它,意味着你具备了构建大型系统的能力。就像学骑自行车,一开始会摔,但一旦学会,世界就变大了。


总结

今天我们:

  • 用 Nacos 搭建了服务注册中心
  • 创建了 user-service 和 order-service 两个微服务
  • 通过 OpenFeign 实现了服务间调用
  • 验证了完整链路

工具(Nacos、Maven)、思想(拆分、通信)、实践(代码) 三位一体,才是学技术的正确姿势。

如果你觉得这篇教程有用,不妨动手敲一遍代码。看十遍不如做一遍——这是我写技术书籍时最深的体会。

下次见!

评论 0

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