微服务架构设计实战:从单体到分布式

产品经理别看我
2025-06-17 18:53
阅读 722

开篇:什么是微服务?它能做什么?

开篇:什么是微服务?它能做什么?

在学习“微服务”之前,我们先想一个问题:

你用过淘宝、抖音或者京东这样的大网站吧?你知道它们的代码结构是什么样的吗?

这些大型应用,不是一个人写的。也不是一个团队在一个项目里完成的。而是很多个小系统组合在一起工作的成果。这,就是所谓的 微服务架构(Microservices Architecture)

简单来说,微服务就是把一个巨大的系统,拆分成多个小的服务(Service),每个服务只负责一项任务,比如用户注册是一个服务,商品展示是一个服务,订单处理又是另一个服务。

这样做的好处是:

  • 每个团队只需要维护自己负责的那个服务
  • 系统更容易扩展和维护
  • 即使某一个小服务出问题,也不至于让整个系统崩溃

这篇文章,我会带着你一步步从零开始,了解微服务的概念,并通过一个简单项目来实践它的搭建过程。哪怕你是编程新手也没关系,我会像教小学生一样慢慢讲。


环境准备:你需要装好哪些工具?

环境准备:你需要装好哪些工具?

🛠️ 工具清单(推荐版本)

工具名 推荐版本 说明
Java JDK 17+ 后端开发语言
Maven 3.8.x Java项目的构建工具
Spring Boot 2.7.x 或 3.x 快速搭建Java Web服务
IntelliJ IDEA 社区版/Ultimate 写Java程序最常用的IDE
Postman 最新版 测试API接口的小工具
Docker 可选 容器化部署工具

💡 如果你用的是Mac或Windows,推荐安装 IntelliJ IDEA Community Edition 免费版本即可。


🔧 安装步骤简述(详细步骤略)

1. 安装JDK

你可以去官网下载 OpenJDK:Adoptium 然后配置环境变量 JAVA_HOMEPATH

2. 安装Maven

解压后配置环境变量即可使用命令行执行 mvn -v 查看版本

3. 安装Spring Boot

其实不需要单独安装,只需要新建一个项目时引入Spring Boot Starter依赖就行

4. 安装Postman

直接去官网下载安装包,一键安装,打开就能用

5. 安装Docker(可选)

初学者暂时可以不装,但后面我们会用它来做服务容器化部署


核心概念:让你不再怕术语!

核心概念:让你不再怕术语!

微服务架构示意图-2

我们来看几个微服务中非常重要的名词:


1. 📦 服务(Service)

就像一家公司有不同的部门一样,一个软件系统也可以被拆分成多个服务。每个服务都做一件事,比如:

  • 用户服务(User Service):处理用户注册、登录等
  • 商品服务(Product Service):展示商品信息
  • 订单服务(Order Service):下单、支付、发货等流程

🌟 所以说:“微服务 = 一堆小程序合起来做成一个大系统”


2. 🔁 服务通信(Inter-service Communication)

既然有多个服务,它们之间怎么说话呢?比如说,下单的时候要验证用户是否存在,这就需要订单服务调用用户服务了。

常用方式有两种:

  • REST API(最常见)
  • gRPC(高性能,进阶才学)

我们今天会用 REST API 来实现服务之间的沟通


3. 🧭 服务发现(Service Discovery)

想象一下你新加入了一个公司,你要怎么找到各个部门在哪?

在微服务中也是一样,每个服务运行在哪台服务器上(IP地址和端口)不一定固定,所以我们需要一种机制来记录谁在哪里 —— 这就是 服务发现

我们今天会用 Eureka Server 来实现这个功能


4. ⚙️ 配置中心(Configuration Center)

有些数据不能写死在代码里,比如数据库连接、第三方密钥等。我们需要一个集中管理配置的地方,这就是 配置中心

我们今天会使用 Spring Cloud Config Server


5. ⚡ 负载均衡(Load Balancer)

如果某个服务有很多实例在运行,请求怎么分配给它们?我们要平均分配,避免某一台忙死,其他闲着 —— 这就是负载均衡。

我们会使用 Ribbon + RestTemplate 来实现


✅ 总结列表:核心概念速览

名词 解释
服务 拆分成的小程序
服务通信 不同服务之间交流
服务发现 知道服务跑在哪台机器上
配置中心 管理全局参数
负载均衡 请求合理分配到不同服务器上

实战项目:手把手带你做一个简单的电商微服务系统

实战项目:手把手带你做一个简单的电商微服务系统

现在我们来做一个最小可运行的电商微服务系统。

项目目标:

创建三个服务:

  1. 用户服务(user-service)
  2. 商品服务(product-service)
  3. 订单服务(order-service)

最终效果:下单时会调用用户服务和商品服务来获取信息


Step 1:搭建父项目并引入公共依赖

我们可以新建一个空的 Spring Boot 项目作为“父项目”,用来统一管理依赖版本。

<!-- pom.xml -->
<modules>
    <module>user-service</module>
    <module>product-service</module>
    <module>order-service</module>
    <module>eureka-server</module>
</modules>

<properties>
    <java.version>17</java.version>
    <spring-cloud.version>2021.0.6</spring-cloud.version>
</properties>

然后我们在子模块中分别创建四个独立的服务模块。


Step 2:搭建 Eureka Server(服务注册与发现)

Eureka 是 Netflix 提供的一个服务发现组件,用于帮助各服务相互找到彼此。

添加依赖:

<!-- eureka-server/pom.xml -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

然后启用 Eureka Server:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

配置文件 application.yml:

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 的界面


Step 3:创建 User Service(用户服务)

添加依赖:

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

主类加上注解:

@EnableEurekaClient
@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

配置 application.yml:

server:
  port: 8081

spring:
  application:
    name: user-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

添加一个简单的 Controller:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        return "User ID: " + id;
    }

}

启动后刷新 Eureka 页面,会看到 user-service 上线了 ✅


Step 4:创建 Product Service(商品服务)

跟 User Service 类似,这里就跳过重复部分。

Controller 示例:

@RestController
@RequestMapping("/products")
public class ProductController {

    @GetMapping("/{id}")
    public String getProduct(@PathVariable Long id) {
        return "Product ID: " + id;
    }

}

端口设为 8082,application.name 设为 product-service


Step 5:创建 Order Service(订单服务)

重点来了!这个服务要调用前面两个服务的数据。

添加 RestTemplate 和 LoadBalancer:

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

配置 RestTemplate Bean:

@Configuration
public class AppConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

OrderController 示例:

@RestController
@RequestMapping("/orders")
public class OrderController {

    private final RestTemplate restTemplate;

    public OrderController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/detail")
    public String getOrderDetail() {
        String user = restTemplate.getForObject("http://user-service/users/1", String.class);
        String product = restTemplate.getForObject("http://product-service/products/101", String.class);


![系统架构设计图-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025061718/cef67b15-7598-48a8-aa23-4ff4abc387bf.jpg)


        return "Order Detail:\n" + user + "\n" + product;
    }
}

配置 application.yml:

server:
  port: 8083

spring:
  application:
    name: order-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

现在启动全部服务,在浏览器访问:

👉 http://localhost:8083/orders/detail

你应该能看到如下内容:

Order Detail:
User ID: 1
Product ID: 101

🎉 成功啦!微服务之间的调用就这样实现了!


常见问题解答(FAQ)

❓Q1:为什么我访问不了 Eureka?

  • 检查是否加了 @EnableEurekaServer
  • 看有没有冲突端口(默认8761)
  • 查看日志是否有报错

❓Q2:RestTemplate 报错 UnknownHostException?

  • 检查服务名称是否正确(如 user-service)
  • 确保该服务已经成功注册到 Eureka
  • 检查是否加了 @LoadBalanced 注解

❓Q3:能不能不用 Spring Boot / Eureka?

当然可以!只是我们这篇文章是为了带入门。真实企业中还有更高级的方案如:

  • Consul 替代 Eureka
  • Feign Client 替代 RestTemplate
  • Spring Cloud Gateway 替代 Zuul 做网关

学习建议:下一步该学什么?

你现在掌握了基础微服务架构的核心原理和搭建方式,接下来可以逐步深入以下方向:

✅ 第一阶段(进阶技能):

  • 学会使用 Feign 做服务调用
  • 引入网关(API Gateway)控制所有流量入口
  • 使用 Nacos / Config Server 管理全局配置
  • 加入限流熔断机制(Sentinel / Hystrix)

✅ 第二阶段(生产级):

  • 使用 Docker 容器化部署微服务
  • 引入 Kubernetes 做集群管理
  • 加入链路追踪(Sleuth + Zipkin)
  • 学习消息队列(Kafka / RocketMQ)进行异步通信

结尾总结

在这篇文章中,我们一起完成了从零到一的微服务架构实战之旅。

我们学会了:

  • 什么是微服务
  • 如何搭建环境
  • 拆分多个服务模块
  • 实现服务之间的通信
  • 使用服务发现技术
  • 解决常见问题的方法

虽然这只是微服务世界的冰山一角,但它足以让你迈出第一步!

别怕复杂,每一个专业架构师,都是从 Hello World 开始的。加油,未来的后端工程师!🚀


如果你觉得这篇教程对你有帮助,请点赞、收藏、转发,让更多小伙伴少走弯路 ❤️

评论 0

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