微服务架构设计实战:从单体到分布式(面向零基础初学者)

Rebase迷路人
2025-06-19 17:38
阅读 514

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

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

我们先从一个简单的问题开始:

🤔 如果你现在要开发一个电商网站,比如“京东”或者“淘宝”,你会怎么写代码?

可能有人会说:“把所有的功能都放在一起写呗,比如商品展示、下单付款、用户注册……全都放在一个项目里。”

这就是单体架构。看起来很直观,也适合刚入门的朋友。但问题是——当系统越来越大时,维护起来会非常困难。

举个例子:如果你们公司的程序员有几十人同时在这个系统上修改代码,一不小心改错了地方,整个网站就崩溃了!

为了解决这个问题,大厂都采用了一种叫“微服务架构”的技术。

✅ 那么,微服务到底是什么?

通俗地讲:

微服务 = 拆分 + 独立部署 + 协同合作

你可以把一个大系统拆成多个小系统,每个小系统只做一件小事,例如:

  • 用户服务:处理注册、登录
  • 商品服务:管理商品列表和详情
  • 订单服务:处理下单、支付

这些小系统可以独立开发、测试、部署,互不干扰,又可以通过网络互相协作。

听起来是不是像在建一个“互联网上的小工厂”?每个人负责一个小部分,最后拼接成一个完整的大型系统。


二、环境准备:搭建你的第一个开发环境

二、环境准备:搭建你的第一个开发环境

在正式学习前,我们需要准备好一些工具和运行环境。别担心,跟着下面的步骤一步步来就可以了。

1. 安装 Java 开发环境(JDK)

微服务通常用 Java 实现,所以我们要先安装 Java 开发工具包(JDK)。

下载地址https://www.oracle.com/java/technologies/javase-downloads.html

选择最新的版本,比如 JDK 17 或 21,点击下载并安装。

✅ 安装完成后,在命令行输入以下命令验证是否成功:

java -version

如果你看到类似这样的输出,说明 JDK 安装成功:

openjdk version "17.0.9" 2023-10-17

2. 安装 Maven

Maven 是用来管理 Java 项目的依赖的工具。

官网下载地址https://maven.apache.org/download.cgi

解压后配置环境变量 MAVEN_HOMEPATH

同样,在命令行中输入:

mvn -v

如果显示 Maven 版本,说明安装成功。


3. 安装 Spring Boot 工具插件

Spring Boot 是目前最流行的构建微服务的框架之一。建议使用 IntelliJ IDEA 或 Eclipse 开发。

推荐你使用 IntelliJ IDEA 社区版,免费又好用,支持自动创建 Spring Boot 项目。

下载地址:https://www.jetbrains.com/idea/download/


4. 安装 Redis 和 MySQL(用于数据库)

后续我们会用到数据存储,这里需要先安装好这两个数据库服务。

MySQL 安装方法(Windows 示例):

可以从官方下载安装包或使用 XAMPP 快速搭建本地环境。

Redis 安装方法:

推荐使用 WSL(Windows Subsystem for Linux)来安装 Redis:

sudo apt update
sudo apt install redis

启动 Redis:

redis-server

三、核心概念讲解:通俗易懂的微服务知识

三、核心概念讲解:通俗易懂的微服务知识

为了让你更好地理解微服务架构的设计思路,我们来认识几个关键概念,并配合简单的例子说明。


1. 单体 vs 微服务

类型 描述
单体应用 所有代码都在同一个项目中,容易上手,不适合长期发展
微服务 拆分成多个小型服务,各自独立开发、部署,适合大型复杂系统

👉 想象你要组装一辆车。单体就像直接拼装所有零件;而微服务则是提前制造发动机、底盘、轮胎等部件,再组合在一起。


2. RESTful API

微服务之间是通过 HTTP 接口通信的。RESTful API 就是一种标准化的通信方式。

举个例子:

GET /api/users/1

就是调用获取用户ID为1的接口。

在 Spring Boot 中可以用注解来实现:

@RestController
@RequestMapping("/api")
public class UserController {
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "Tom");
    }
}

3. 服务注册与发现:Spring Cloud Eureka

多个服务上线之后,彼此怎么找到对方?这就需要用到“服务注册与发现”。

常用组件是 Eureka Server,相当于一个电话簿。

创建 Eureka Server(服务注册中心)

新建一个 Spring Boot 项目,添加以下依赖:

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

主类启用 Eureka:

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

服务器部署方案-1

配置 application.yml:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false

启动这个服务,访问:http://localhost:8761,就能看到服务注册页面啦!


4. 负载均衡:Ribbon

当你调用一个服务的时候,它可能有多个实例在运行。那么应该访问哪一个呢?

这时候就要用到负载均衡器 Ribbon。

假设你有一个订单服务,正在运行两个实例:order-service-1 和 order-service-2。

在 Spring Boot 中使用方式如下:

@Autowired
private LoadBalancerClient loadBalancer;

public String callOrderService() {
    ServiceInstance instance = loadBalancer.choose("ORDER-SERVICE");
    String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/orders";
    // 使用 restTemplate 请求
    return restTemplate.getForObject(url, String.class);
}

四、实战项目:一步步开发一个电商微服务系统

接下来我们将实践一个简单的电商系统,包含三个微服务:

  1. 用户服务(User Service)
  2. 商品服务(Product Service)
  3. 订单服务(Order Service)

整体结构图如下:

+------------------+     +------------------+     +------------------+
|   User Service   |     | Product Service  |     | Order Service    |
+------------------+     +------------------+     +------------------+
          \                       |                        /
           \                      |                       /
            \                     v                      /
             \-------------------------------------------+
                                |
                         +--------------+
                         | Eureka Server|
                         +--------------+

第一步:创建 Eureka 注册中心(如前所述)

略过具体步骤,已经在第三部分详细介绍了。


第二步:创建 User Service

新建 Spring Boot 项目,添加 Eureka Client 依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

添加 Controller:

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

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "Tom");
    }

    private static class User {
        Long id;
        String name;

        // getter/setter
    }
}

配置 application.yml:

server:
  port: 8081
spring:
  application:
    name: USER-SERVICE
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

启动后访问 http://localhost:8761,应该能看到 USER-SERVICE 注册成功。


第三步:创建 Product Service

同理,创建 Product Service 项目:

server:
  port: 8082
spring:
  application:
    name: PRODUCT-SERVICE
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

Controller 示例:

@GetMapping("/products/{id}")
public Product getProduct(@PathVariable Long id) {
    return new Product(id, "iPhone", 5999D);
}

第四步:创建 Order Service 并调用其他服务

添加 RestTemplate 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置 RestTemplate Bean:

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

调用其他服务的示例:

@GetMapping("/orders/{id}")
public Map<String, Object> getOrder(@PathVariable Long id) {
    String userUrl = "http://USER-SERVICE/users/" + id;
    String productUrl = "http://PRODUCT-SERVICE/products/1";

    User user = restTemplate.getForObject(userUrl, User.class);
    Product product = restTemplate.getForObject(productUrl, Product.class);

    Map<String, Object> result = new HashMap<>();
    result.put("user", user);
    result.put("product", product);
    return result;
}

这样你就实现了多个微服务之间的通信!


五、常见问题解答

作为一个刚入门的开发者,在学习微服务过程中可能会遇到很多困惑,以下是几个新手常问的问题。


Q1:微服务一定要用 Spring Boot 吗?

不是必须的,Spring Boot 是当前主流的选择,因为它集成了很多生态组件。当然也可以用 Go、Python、Node.js 构建微服务,只是生态成熟度不同。


Q2:微服务之间通信用什么协议?

最常用的是 HTTP + JSON,比如我们上面用到的 RestTemplate 就是这种方式。此外还有 gRPC、Apache Thrift 等更高效的远程通信方式。


Q3:我应该先学 Spring Boot 还是 Spring Cloud?

建议顺序:

  1. 先掌握 Spring Boot 的基本用法;
  2. 再学习 Spring Cloud 提供的微服务组件,如 Eureka、Feign、Zuul、Config Server 等。

Q4:微服务项目如何调试?

可以通过三种方式:

  • 在 IDE 中直接启动多个服务;
  • 使用 Docker 容器化部署;
  • 使用本地 Kubernetes 或 Minikube 模拟线上环境。

六、学习建议:下一步该怎么走?

恭喜你完成了微服务的入门学习!但要成为一个真正的后端工程师,还需要继续深入探索。

下面是几个建议的学习路径:


✅ 学习路线图:

  1. 巩固 Spring Boot 基础

    • 数据库操作(MyBatis、JPA)
    • 安全机制(Spring Security)
    • 异常处理与日志
  2. 进阶 Spring Cloud 技术栈

    • Feign(简化接口调用)
    • Config Server(集中管理配置)
    • Gateway / Zuul(路由管理)
    • Sleuth / Zipkin(链路追踪)
  3. 学习容器化与编排

    • Docker 入门与实战
    • Kubernetes(K8s) 核心概念与使用
  4. 参与开源项目 & 模拟真实业务场景

    • GitHub 上找微服务练习项目
    • 自己尝试搭建一个博客/电商系统

结语

从单体到微服务,不仅仅是技术的改变,更是思维方式的转变。希望这篇教程能够帮助你迈出第一步,勇敢踏上微服务之路。

记住一句话:

“复杂的事情,总要从简单做起。”

祝你在后端开发的路上越走越远!


📚 参考资料推荐

🚀 加油!我们下期见~

评论 0

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