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

在软件开发的世界里,随着业务越来越复杂,传统的“单体应用(Monolithic Application)”会变得臃肿、难以维护。比如一个电商系统,原本只是一个简单的购物网站,后来功能越来越多——用户注册登录、商品管理、订单处理、支付、物流追踪、评论系统……如果这些功能都写在一个程序里,改一个小功能都可能牵一发而动全身。
这时候,“微服务架构(Microservices Architecture)”就应运而生了。你可以把它理解成:把一大锅汤分成多个小碗,每碗只装一种食材,需要哪个拿哪个,互不干扰。
微服务的特点是:
- 每个服务独立运行
- 每个服务有自己数据库
- 服务之间通过网络通信(通常是 HTTP 或消息队列)
- 可以用不同技术栈实现不同的服务
微服务适合中大型项目,尤其是需要高可用性、可扩展性的系统,如电商平台、在线教育平台、金融风控系统等。
环境准备:搭建你的微服务开发环境

我们要用 Spring Boot + Spring Cloud Alibaba 来演示如何构建微服务系统。
安装清单:
- JDK 17(推荐使用 OpenJDK)
- IntelliJ IDEA(社区版即可)
- Maven(版本 >= 3.6)
- Nacos Server(用于服务注册与配置中心)
安装步骤:
✅ Step 1: 安装 JDK 17
官网下载 并安装 Java 17,配置 JAVA_HOME 环境变量,终端输入以下命令确认:
java -version
✅ Step 2: 下载并安装 IntelliJ IDEA
前往 JetBrains官网 下载社区版 IDE,解压后双击启动。
✅ Step 3: 配置 Maven
下载 Maven,解压,设置 MAVEN_HOME 和 PATH。测试是否安装成功:
mvn -v
在 IntelliJ 中导入 Maven 项目时,记得选择你本地的 Maven 路径。
✅ Step 4: 启动 Nacos 服务
Nacos 是阿里巴巴开源的服务发现和配置管理工具。
- 下载地址:GitHub Release
- 解压后进入 bin 目录,执行以下命令:
startup.cmd -m standalone # Windows sh startup.sh -m standalone # Linux / Mac - 打开浏览器访问
http://localhost:8848/nacos,默认账号密码为nacos/nacos
现在你的开发环境已经准备好啦!
核心概念:用最简单的话讲明白关键点

下面是几个你在学习微服务过程中必须掌握的核心概念:
🔹1. 服务注册与发现(Service Registration & Discovery)
每个微服务启动之后都要告诉一个地方:“我上线啦,我的IP是 xxx.xxx.xxx.xxx,端口是 8080,可以调我!”
这个“地方”就是注册中心(如 Nacos、Eureka)
✨打个比方:
就像你们公司要组织旅游,谁参加都要先去行政部登记姓名和手机号。行政部就成了“注册中心”。
代码示例(Spring Cloud Alibaba + Nacos):
# 在 application.yml 中添加:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
然后加上注解:
@EnableDiscoveryClient
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
启动后,服务会自动注册到 Nacos 控制台里。
🔹2. 负载均衡(Load Balancer)
当很多用户同时请求某个服务时,我们需要多个实例来分担压力。负载均衡器的作用就是决定请求该由哪一个实例处理。
✨打个比方:
学校食堂窗口排长队,来了三个阿姨炒菜,谁有空就去谁那里排队,这就是负载均衡。
Spring Cloud 默认使用 Ribbon 做负载均衡。
示例:使用 RestTemplate 实现客户端调用(自动负载均衡):
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
public String callOrderService() {
return restTemplate.getForObject("http://order-service/api/order", String.class);
}
上面的 order-service 就是服务名,Ribbon 会在 Nacos 中查找所有 order-service 的实例,并自动选择一个发起请求。
🔹3. 网关(API Gateway)
网关就像是整个系统的入口,所有的请求都要先经过它。它可以做统一鉴权、限流、路由等功能。
✨打个比方:
网关就像公司的前台小姐姐,你要进来办事之前,她要检查你是谁,要去哪个部门。
常用的网关框架是 Spring Cloud Gateway 或 Zuul
网关配置示例(application.yml):
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
这样 /api/user/** 的请求就会被转发给 user-service。
🔹4. 分布式配置中心(Config Center)
以前修改配置文件要重启服务,现在可以通过远程配置中心动态加载配置。
✨打个比方:
就像家里换了WiFi密码,全家人都不用重新买路由器,只要更新一下手机设置。
Nacos 支持作为配置中心,配置如下:
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
extension-configs:
- data-id: user-service.yaml
group: DEFAULT_GROUP
refresh: true
在 Nacos 中添加配置项后,应用重启或触发刷新后会自动获取新配置。
实战项目:从零开始打造一个“用户+订单”的微型电商系统


我们将创建两个微服务:
- User Service(用户服务)
- Order Service(订单服务)
- 使用 Nacos 做服务注册与配置中心
- 使用 Gateway 做统一 API 入口
🛠️ Step 1: 创建 User Service
创建一个 Spring Boot 项目,添加依赖:
<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>

添加 controller:
@RestController
@RequestMapping("/api/user")
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
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动后,在 Nacos 控制台可以看到注册的服务。
🛠️ Step 2: 创建 Order Service
结构类似,只是换掉 controller 内容:
@RestController
@RequestMapping("/api/order")
public class OrderController {
@GetMapping("/{id}")
public String getOrderById(@PathVariable Long id) {
return "Order ID: " + id;
}
}
application.yml:
server:
port: 8082
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
此时已有两个服务注册成功。
🛠️ Step 3: 创建 Gateway 网关服务
添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置 application.yml:
server:
port: 8090
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true
routes:
- id: user-route
uri: lb://user-service
predicates:
- Path=/api/user/**
- id: order-route
uri: lb://order-service
predicates:
- Path=/api/order/**
启动后访问:
http://localhost:8090/api/user/1http://localhost:8090/api/order/2
应该分别返回对应的结果,说明一切正常。
常见问题解答(FAQ)
❓Q1:为什么服务没有注册到 Nacos?
✅常见原因及解决方案:
- 检查
spring.cloud.nacos.discovery.server-addr是否正确 - 检查 Nacos 是否已启动(
http://localhost:8848是否能打开) - 查看控制台日志,是否有报错信息(如连接超时)
❓Q2:调用服务时报“UnknownHostException”怎么办?
✅可能是服务名写错了,或者是服务未注册,检查:
- 服务名称是否和
spring.application.name一致 - 服务是否确实注册到了 Nacos
- 是否添加了
@EnableDiscoveryClient注解
❓Q3:RestTemplate 怎么才能做负载均衡?
✅确保做了以下三点:
- 添加了
@LoadBalanced注解 - 引入了 Ribbon 或 LoadBalancer Starter
- 正确使用服务名而不是 IP 地址调用
例如:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
学习建议:下一步学什么?
掌握了基础微服务架构之后,建议继续深入以下几个方向:
🔸1. 服务熔断与降级(Hystrix or Sentinel)
避免因为某一个服务崩溃导致整个系统不可用。
推荐学习:Sentinel(阿里巴巴出品)
🔸2. 链路追踪(Sleuth + Zipkin)
当系统中有几十上百个服务时,定位问题是困难的。链路追踪可以帮你清晰看到请求经过了哪些服务。
🔸3. 安全认证(Spring Security + OAuth2)
保护接口免受非法访问,控制权限范围。
🔸4. 自动化部署(Docker + Kubernetes)
将你的微服务打包成镜像,使用 Kubernetes 管理集群部署。
🧠学习路线图:
单体架构 → RESTful API 设计 → Spring Boot 构建服务 → Nacos 注册中心
↓
微服务入门 → 负载均衡 → 网关路由 → 配置中心
↓
进阶 → 熔断降级 → 链路追踪 → 安全认证 → 容器化部署
🎯结语
微服务不是银弹,也不是一开始就要上。它是解决复杂系统的一种有效方式。本教程带你从零开始,一步步搭建了一个简单的微服务架构,希望你能从中获得信心,继续深入探索更大的世界!
如果你喜欢这篇教程,也欢迎收藏、点赞、留言提问,我们一起成长!
📌文末彩蛋:
想要完整的项目源码?可以在 GitHub 上新建一个项目仓库,我们下次详细讲解怎么上传和分享项目。
关注公众号【Java攻城狮日记】,回复“微服务实战”领取完整工程模板。

评论 0