微服务架构设计实战:从单体到分布式
开篇:什么是微服务,它用来做什么?

你有没有用过像“淘宝”、“京东”这样的大网站?它们功能非常丰富、用户数巨大。如果这些系统是用传统的单体架构(也就是所有代码写在一个程序里)来开发,那这个程序会变得超级复杂、难以维护。
为了解决这个问题,就有了一个叫 “微服务架构” 的方案。你可以简单理解为:把一个大系统拆成几个小系统,每个小系统只管自己那一块,比如用户管理、订单处理、商品展示等。
这些小系统可以各自独立运行、部署、升级,彼此之间通过网络进行通信。这样做的好处是:
- 更容易维护
- 出问题更容易定位和修复
- 可以根据需求单独扩展某一部分的功能
今天,我们就从零开始,带你一步步实现一个简单的微服务项目!
环境准备:搭建你的开发环境

我们需要的工具有:
1. 安装 Java(JDK)
Java 是编写后端服务的常用语言。我们选择使用 Spring Boot 框架来搭建我们的微服务。
- 下载地址:https://www.oracle.com/java/technologies/javase-downloads.html
- 建议选择 JDK 17 或者 21
安装完成后,在命令行输入:
java -version
看到类似以下输出说明安装成功:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment ...
2. 安装 Maven
Maven 是一个 Java 项目的构建工具,能帮助我们下载依赖、打包项目。
解压后配置环境变量(如 PATH)。然后在命令行中输入:
mvn --version
出现版本信息就 OK 啦。
3. 安装 IntelliJ IDEA(推荐)
这是目前最流行的 Java 开发工具。
安装之后打开它,就能愉快地写代码啦!
核心概念:微服务中的关键词解释(通俗易懂)


为了方便理解,我会尽量用生活中的例子来类比。
1. 单体应用 vs 微服务
| 类比 | 单体应用 | 微服务 |
|---|---|---|
| 做饭方式 | 一锅炖 | 分开做 |
| 优点 | 简单易上手 | 易维护、灵活 |
| 缺点 | 越来越难管理 | 需要协调多个模块 |
举个例子,就像你在厨房做饭,原本是把菜、肉、汤都放在一起煮,现在改成分别炒菜、炖汤、烤鸡翅一样。
2. REST API(网络请求接口)
想象你去餐厅点餐,你说“我要一份番茄炒蛋”,服务员听到了就给你安排厨师做这道菜。这里的“点餐”动作就是一种接口(API),它告诉你怎么和服务沟通。
在微服务中,A服务想获取B服务的数据,就要通过 HTTP 请求调用 B 提供的 REST 接口。
3. Eureka 注册中心(服务中心)
假设你开了一家连锁店,每一家分店都要向总部登记。Eureka 就是一个登记处,所有的微服务启动后都要来这里注册自己的地址,别的服务就可以通过这个中心找到它们。
4. Feign(远程调用客户端)
Feign 是一种简化远程调用的方式。你可以把它理解成“自动拨号器”——你想打给另一个服务的时候,只需要说一句“我要调用用户服务”,Feign 就会帮你完成整个过程。
5. Gateway(网关)
网关相当于一个门口保安。你要访问某个服务,先得经过网关。它可以控制谁可以进、不能进;还可以统一处理认证、限流等功能。
实战项目:动手做一个“用户 + 订单”微服务系统
我们来做一个小系统,包含两个服务:
- 用户服务(UserService)
- 订单服务(OrderService)
这两个服务之间需要互相通信。
第一步:创建父工程(Spring Initializr)
填写信息如下:
- Project: Maven
- Language: Java
- Spring Boot Version: 最新稳定版本(如 3.1.x)
- Group: com.example
- Artifact: microservice-demo
- Dependencies:
- Spring Web
- Spring Cloud Discovery Client
- Spring Cloud OpenFeign
- Spring Cloud Gateway
点击【Generate】下载压缩包,解压导入 IntelliJ IDEA。
第二步:创建子模块(用户服务)
右键项目 → New → Module → Maven Module
取名为 user-service
添加基础代码:
pom.xml 添加内容:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
创建主启动类:
// src/main/java/com/example/userservice/UserServiceApplication.java
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
添加 Controller 示例:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUserById(@PathVariable Long id) {
return "User ID: " + id;
}
}
配置 application.yml 文件:
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
第三步:创建订单服务(order-service)
同样新建一个 Maven Module,取名 order-service。
添加代码结构与上面类似:
Controller 示例:
@RestController
@RequestMapping("/orders")
public class OrderController {
@Autowired
private UserServiceClient userServiceClient;
@GetMapping("/user/{userId}")
public String getOrdersByUserId(@PathVariable Long userId) {
String userInfo = userServiceClient.getUserById(userId);
return "Orders for: " + userInfo;
}
}
Feign 客户端定义:
@FeignClient(name = "user-service")
public interface UserServiceClient {
@GetMapping("/users/{id}")
String getUserById(@PathVariable Long id);
}
配置文件:
server:
port: 8082
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
第四步:启动注册中心(Eureka Server)
新建一个模块 eureka-server。
pom.xml 中添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
主类加注解:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

配置文件:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动后,访问 http://localhost:8761,能看到注册页面。
第五步:启动所有服务,测试访问
依次启动顺序建议:
- Eureka Server
- User Service
- Order Service
测试访问:
- 访问用户服务:http://localhost:8081/users/1
- 访问订单服务并调用用户服务:http://localhost:8082/orders/user/1
你会看到结果是:
Orders for: User ID: 1
说明两个服务之间已经可以正常通信了!
常见问题:新手容易遇到的问题解答
❓Q1:为什么 Feign 调用失败?
- 检查是否加入了
@EnableFeignClients注解 - 是否开启了负载均衡(例如是否用了
spring-cloud-starter-loadbalancer) - 是否服务已经注册成功(查看 Eureka 页面)
❓Q2:Eureka 启动报错怎么办?
- 检查端口是否冲突
- 查看控制台日志,确认配置是否正确
- 网络设置是否允许本机访问
❓Q3:如何查看服务注册情况?
启动 Eureka 服务器后,访问 http://localhost:8761,可以看到已注册的服务列表。
学习建议:下一步学什么?
你现在掌握了微服务的基本搭建和调用,接下来可以学习这些方向:
✅ 进阶内容清单:
- 使用 Zuul 或 Gateway 实现路由控制
- 学习配置中心 Config Server
- 实践链路追踪 Sleuth + Zipkin
- 使用 Docker 容器化部署
- Kubernetes 部署集群管理
- 服务熔断 Hystrix 和降级策略
📘 学习资源推荐:
- 书籍:《Spring Cloud 微服务实战》
- 视频课程:B站搜索 “Spring Cloud 教程”
- 官方文档:https://spring.io/projects/spring-cloud
希望这篇教程能让你轻松入门微服务的设计与实践。记住一句话:编程不是背公式,而是动手练出来的!坚持敲代码,每天进步一点点 😄
如果你喜欢,请继续关注更多实用教程分享!

评论 0