Spring Cloud 微服务,从零开始怎么玩?
大家好,我是老张,一名干了五年后端开发的“老码农”。这几年带过不少新人,也写过几本技术书籍,但每次看到初学者面对微服务一脸懵的样子,我就想起自己当初学 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>声明子模块。
核心概念三件套:注册中心、服务调用、配置管理
微服务不是魔法,它解决三个基本问题:
- 服务在哪? → 用注册中心(如 Nacos、Eureka)
- 怎么调用别人? → 用声明式 HTTP 客户端(如 OpenFeign)
- 配置怎么统一? → 用配置中心(如 Spring Cloud Config、Nacos)
我们这次用 Nacos —— 阿里开源的一站式解决方案(支持注册 + 配置),比 Eureka + Config 搭配更简单。
第一步:启动 Nacos 服务
- 去 Nacos GitHub Releases 下载最新版(如 nacos-server-2.2.3.zip)
- 解压后进入
bin目录 - 执行(Linux/Mac):
(Windows):sh startup.sh -m standalonestartup.cmd -m standalone - 浏览器访问
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. 测试整个链路
- 启动 Nacos
- 启动 user-service(端口 8081)
- 启动 order-service(端口 8082)
- 访问:
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,而方法参数名和路径变量名不一致。细节决定成败!
下一步怎么学?我的学习路线建议
你已经迈出了最难的第一步。接下来,按这个顺序深入:
- 读一本好书:《Spring微服务实战》(John Carnell 著)——案例驱动,适合入门后进阶。
- 加入配置中心:把数据库连接、开关配置放到 Nacos,实现动态刷新。
- 加网关:用 Spring Cloud Gateway 统一入口,做路由和鉴权。
- 学熔断限流:集成 Sentinel,防止一个服务崩溃拖垮整个系统。
- 尝试其他语言:比如用 Go 写一个微服务(用 Gin + go-micro),对比理解架构思想。
🌟 最后鼓励:微服务不是银弹,小项目用单体更高效。但掌握它,意味着你具备了构建大型系统的能力。就像学骑自行车,一开始会摔,但一旦学会,世界就变大了。
总结
今天我们:
- 用 Nacos 搭建了服务注册中心
- 创建了 user-service 和 order-service 两个微服务
- 通过 OpenFeign 实现了服务间调用
- 验证了完整链路
工具(Nacos、Maven)、思想(拆分、通信)、实践(代码) 三位一体,才是学技术的正确姿势。
如果你觉得这篇教程有用,不妨动手敲一遍代码。看十遍不如做一遍——这是我写技术书籍时最深的体会。
下次见!

评论 0