从单体到微服务:Spring Cloud零基础实战指南
大家好,我是阿杰,一名在某大厂干了三年后端开发的工程师,业余也在B站做技术分享。最近很多粉丝私信问我:“微服务到底难不难?能不能从零开始带我们跑通一个项目?”说实话,我当初学 Spring Cloud 的时候也是一头雾水——一堆组件、配置复杂、文档晦涩。但只要你理解了核心思想,其实没那么可怕。
今天这篇教程,我会用最直白的语言 + 完整代码案例,带你从零搭建一个简单的微服务系统。哪怕你连“微服务”是什么都不知道,也能跟着做完。对了,虽然主题是 Spring Cloud,但我会巧妙融入你提到的“区块链”和“JavaScript”关键词(别急,后面会解释为什么它们也会出现 😄)。
一、微服务到底是什么?为什么需要它?
想象一下,你开发了一个电商网站。最开始,所有功能——用户登录、商品展示、下单支付——都写在一个项目里,这就是单体应用。随着业务增长,代码越来越臃肿,改一个小功能可能要重新部署整个系统,团队协作也变得困难。
微服务就是把大项目拆成多个小服务,每个服务独立开发、部署、运行。比如:
- 用户服务(负责注册/登录)
- 商品服务(负责商品信息)
- 订单服务(负责下单)
这些服务通过网络互相调用,组合成完整系统。而 Spring Cloud 就是一套工具箱,帮你解决微服务中的常见问题:服务发现、配置管理、负载均衡、熔断保护等。
📌 我当初第一次听到“服务注册中心”时完全懵了。其实你可以把它想象成“电话簿”:每个服务启动时把自己的地址(IP+端口)告诉注册中心,其他服务想调用它时,就去注册中心查号码。
二、环境准备:5分钟搭好开发环境
你需要以下工具(全部免费):
| 工具 | 版本建议 | 作用 |
|---|---|---|
| JDK | 17 或 21 | Java 运行环境 |
| Maven | 3.8+ | 项目依赖管理 |
| IntelliJ IDEA | 社区版即可 | 代码编辑器 |
| Node.js | 18+ | (用于后面提到的 JavaScript 示例) |
步骤 1:安装 JDK 和 Maven
- 下载 OpenJDK 17(推荐 Adoptium)
- 配置
JAVA_HOME环境变量 - 验证:终端输入
java -version和mvn -v
步骤 2:创建父工程(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>eureka-server</module>
<module>user-service</module>
<module>product-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>
⚠️ 注意:Spring Boot 3.x 需要 JDK 17+,且不再支持 Netflix Eureka(已迁移到社区维护版)。我们这里使用
spring-cloud-starter-netflix-eureka-server的兼容版本。
三、核心概念:三个必须懂的微服务组件
1. 服务注册与发现(Eureka)
所有微服务启动时向 Eureka Server 注册自己,调用方通过服务名(而非 IP)调用。
2. 声明式 HTTP 客户端(OpenFeign)
不用手动写 HTTP 请求,像调本地方法一样调远程服务。
3. API 网关(Gateway)
统一入口,避免前端直接调用多个后端服务。
四、实战:搭建一个“商品查询”微服务系统
步骤 1:创建 Eureka 注册中心
在项目根目录执行:
mkdir eureka-server
eureka-server/pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
application.yml:
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
主启动类:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动后访问 http://localhost:8761,你会看到 Eureka 管理界面(目前没有服务注册)。
步骤 2:创建用户服务(user-service)
mkdir user-service
pom.xml 添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml:
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
Controller:
@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");
}
}
启动后刷新 Eureka 页面,你会看到 USER-SERVICE 出现在 Instances 列表中!
步骤 3:创建商品服务(product-service),并调用用户服务
同样创建模块,pom.xml 添加 Feign 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启用 Feign:
@SpringBootApplication
@EnableFeignClients
public class ProductServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServiceApplication.class, args);
}
}
定义 Feign 接口:
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/user/{id}")
Map<String, Object> getUser(@PathVariable("id") Long userId);
}
商品 Controller:
@RestController
public class ProductController {
@Autowired
private UserClient userClient;
@GetMapping("/product/{id}")
public Map<String, Object> getProduct(@PathVariable Long id) {
// 模拟商品数据
Map<String, Object> product = Map.of(
"id", id,
"name", "iPhone 15",
"price", 5999
);
// 调用用户服务(假装这是购买者信息)
Map<String, Object> buyer = userClient.getUser(1L);
return Map.of("product", product, "buyer", buyer);
}
}
启动 product-service,访问 http://localhost:8082/product/1001,你会看到商品 + 用户信息合并返回!
五、关于“区块链”和“JavaScript”的说明
你可能会疑惑:说好的区块链和 JavaScript 呢?
JavaScript:在真实微服务架构中,前端(通常是 Vue/React,基于 JS)会通过 API 网关(如 Spring Cloud Gateway)统一请求后端服务。例如:
// 前端 JS 代码示例
fetch('/api/product/1001')
.then(res => res.json())
.then(data => console.log(data));
网关会将 /api/product/** 路由到 product-service,实现前后端解耦。
区块链:虽然 Spring Cloud 本身和区块链无关,但微服务架构非常适合构建区块链应用的后端。比如:
- 一个服务负责处理交易(Transaction Service)
- 一个服务负责维护账本状态(Ledger Service)
- 通过 Feign 或消息队列通信
我曾在公司参与过一个供应链金融项目,就用 Spring Cloud 搭建了区块链节点的配套服务层。所以掌握微服务,是进入 Web3 后端开发的重要一步!
六、新手常见问题 & 避坑指南
❓ 问题1:启动报错 “Consider defining a bean of type ‘xxx’”
✅ 解决:检查是否漏加 @EnableFeignClients 或 @ComponentScan。
❓ 问题2:服务注册不到 Eureka
✅ 解决:
- 确保
defaultZone地址正确(注意结尾有/eureka/) - 检查防火墙是否阻止 8761 端口
- 查看控制台是否有
Registered instance日志
❓ 问题3:Feign 调用超时
✅ 解决:在 application.yml 中增加超时配置:
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 10000
💡 我当初调通第一个 Feign 调用花了整整一天!就是因为
@PathVariable忘了加value参数。记住:Feign 要求路径变量名必须显式指定!
七、下一步学什么?
恭喜你已经跑通了第一个微服务项目!接下来建议:
- 加入配置中心:学习 Spring Cloud Config 或 Nacos,集中管理配置
- 添加熔断机制:用 Resilience4j 替代已停更的 Hystrix
- 引入消息队列:用 RabbitMQ/Kafka 解耦服务(比如下单后发通知)
- 部署到 Docker:每个服务打包成镜像,用 docker-compose 编排
最后提醒:不要试图一次性学完所有组件。先掌握 Eureka + Feign + Gateway 这“铁三角”,就能应对 80% 的微服务场景。
如果你觉得这篇教程有帮助,欢迎去 B站 搜索「阿杰聊后端」,我会持续更新 Spring Cloud 实战系列。下期我们讲《用 Nacos 替代 Eureka,打造更现代的微服务架构》!
有问题评论区见,我会一一回复。编程路上,我们一起进步!

评论 0