微服务架构设计实战:从单体到分布式(零基础友好版)

王华
2025-06-20 05:18
阅读 633

开篇:微服务是啥?它能干嘛?

开篇:微服务是啥?它能干嘛?

你可能已经听说过“微服务”这个词,但第一次看到的时候是不是有点懵?其实它并不可怕。我们先用一个生活中的例子来理解:

想象一下,你去一家大超市买东西,所有的商品都放在一起。水果、饮料、日用品都在同一个地方摆着,找东西很不方便。这就是单体应用——所有功能都堆在一起。

而“微服务”就像是把这家超市分成多个小商店,每家只卖一种类型的商品(比如水果店、饮品店、日用品店)。这样顾客就很容易找到自己需要的东西,而且某一家出问题也不会影响其他店的正常营业。

简单来说,微服务架构就是把一个大系统拆分成多个小型、独立的服务,每个服务负责一部分业务功能,并通过网络通信协作工作

这种结构有很多优点,比如更容易扩展、便于维护、团队可以分工合作等。现在大型互联网公司,如京东、淘宝、Netflix、亚马逊这些企业,大部分系统都是采用微服务架构开发的。


环境准备:搭建属于你的“微服务开发基地”

负载均衡配置-1

环境准备:搭建属于你的“微服务开发基地”

学习微服务的第一步是准备好开发环境。虽然听起来复杂,但其实只要按照步骤来,一切都会变得很简单。

1. 安装 Java(JDK)

微服务常用的语言之一是 Java,所以我们需要安装 Java 开发工具包(JDK)。

如果出现类似下面的内容,说明安装成功了:

openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment ...
OpenJDK 64-Bit Server VM ...

2. 安装 IDE

IDE 是集成开发环境,就像编程用的“写字板”,推荐使用 IntelliJ IDEA 或 VS Code。

3. 安装 Spring Boot CLI(可选)

Spring Boot 是目前最流行的微服务开发框架。

你可以访问官网 https://spring.io/projects/spring-boot#overview 学习更多内容。

如果你使用的是 IDE,可以直接新建 Spring Boot 项目;否则也可以下载 CLI 工具。

4. 安装 Docker(用于部署服务)

Docker 可以帮助我们将服务“打包”运行,不需要每次都手动配置服务器。


核心概念:什么是“服务”,它们之间怎么沟通?

核心概念:什么是“服务”,它们之间怎么沟通?

在正式动手写代码前,我们要了解几个关键的概念。

1. 服务(Service)

每一个“服务”就是一个小程序,专注于做一件事,比如:

  • 用户管理服务:处理用户注册、登录;
  • 订单服务:处理下单、支付;
  • 商品服务:显示商品信息和库存。

这些服务之间是独立运行的,互不干扰。

2. REST API

服务之间通常通过 HTTP 协议交流,也就是网页浏览的那种方式。最常见的交流方式是 REST 风格的接口。

举个例子:

当你在浏览器输入 https://www.baidu.com 按下回车后,就会向百度的服务器发送一个请求。服务器收到后,返回网页内容给你看。

在微服务里,A 服务要调用 B 服务的数据,也是一样的流程。

3. 注册中心(Service Registry)

微服务多了之后,服务之间不知道对方在哪里怎么办?这就需要一个“地图”一样的东西记录谁是谁。

常见的注册中心有 Eureka(Netflix)、Consul、Nacos 等。

比如,A服务启动时会告诉注册中心:“我是订单服务,运行在IP 192.168.1.5:8080。”
B服务想调用A服务时,只需要问问注册中心“A服务在哪?”就可以拿到地址。

4. 负载均衡(Load Balancer)

假如A服务部署了三个实例在不同机器上,怎么决定该访问哪一个?这时就需要负载均衡器来帮忙。

常见方案:Ribbon、Spring Cloud LoadBalancer。

5. 网关(API Gateway)

所有服务的外部访问请求都必须经过网关,它可以实现权限控制、路由转发等功能。

常见网关框架:Zuul、Spring Cloud Gateway、Kong。


实战项目:做一个简单的微服务系统

让我们来实战一个非常简单的微服务系统吧!目标是做一个:

图书借阅系统

包含两个服务:

  • 图书服务(Book Service):提供书籍列表
  • 借阅服务(Borrow Service):查询某本书是否被借出

我们将使用 Spring Boot 来编写这两个服务,并让它们进行通信。


第一步:创建 Book Service

1. 使用 Spring Initializr 创建项目

访问:https://start.spring.io/

填写以下内容:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 3.x
  • Group: com.example
  • Artifact: book-service
  • Dependencies: Spring Web, Spring Data JPA

点击 “Generate” 下载项目压缩包。

解压后导入 IDE(IntelliJ 或 VS Code)

2. 编写主程序 BookServiceApplication.java

package com.example.bookservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

3. 创建控制器 BookController.java

package com.example.bookservice.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {

    @GetMapping
    public List<String> getAllBooks() {
        return Arrays.asList("Java编程思想", "算法导论", "Effective Java");
    }
}

4. 启动服务并测试

运行 BookServiceApplication.java,然后打开浏览器输入:

http://localhost:8080/books

你应该能看到返回的书籍列表!


第二步:创建 Borrow Service

重复上面第1步,修改 artifact 为 borrow-service

1. 修改 application.properties 设置端口

server.port=8081

2. 创建 BorrowController.java

package com.example.borrow.controller;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("/borrow")
public class BorrowController {

    private final RestTemplate restTemplate = new RestTemplate();

    @GetMapping("/{book}")
    public String checkBorrowStatus(@PathVariable String book) {
        // 请求图书服务获取书籍列表
        String url = "http://localhost:8080/books";
        List<String> books = restTemplate.getForObject(url, List.class);

        if (books != null && books.contains(book)) {
            return book + " 存在于库中。";
        } else {
            return book + " 不在库中。";
        }
    }
}

3. 运行 Borrow Service 并测试

先启动 Book Service(确保在 8080 端口),再运行 BorrowServiceApplication.java

访问:

http://localhost:8081/borrow/Java编程思想

你会看到返回结果:

Java编程思想 存在于库中。

✅ 到这一步,我们的第一个微型微服务系统就已经完成啦!


常见问题解答(FAQ)

系统架构设计图-2

Q1:为什么我访问不了另一个服务?

A:检查对方服务是否运行,IP 和端口是否正确。可以在本机 ping 或使用 telnet 测试连接性。

Q2:REST 是什么?和 WebService 有什么区别?

A:REST 是基于 HTTP 的轻量级通信方式,WebService 通常是 SOAP 协议,更重一些。现在基本都用 REST 了。

Q3:服务越来越多,怎么避免混乱?

A:可以用注册中心统一管理服务地址,再加上 API 网关统一入口管理。

Q4:为什么每个服务要独立运行?

A:这是为了降低耦合。比如图书服务挂掉,不影响用户登录服务继续运行。

Q5:我要学哪个语言更适合做微服务?

A:Java、Go、Node.js 都很适合。Java 企业级生态完善,Go 性能好,Node.js 快速易上手。


学习建议:下一步该怎么进阶?

恭喜你完成了第一个微服务实战!以下是进阶路线图:

🟢 入门阶段完成 ✅

你现在掌握了:

  • 微服务的基本概念
  • 如何创建两个服务并让它们通信
  • 用到了 Spring Boot + REST 调用

🔵 第一步:引入服务注册中心(Eureka/Nacos)

尝试将服务注册到 Eureka 或 Nacos 中,实现服务自动发现。

🟠 第二步:添加 API 网关

学习使用 Zuul 或 Spring Cloud Gateway 给系统加一个统一入口。

🟡 第三步:服务间通信优化

尝试使用 OpenFeign、Ribbon 替代硬编码调用,提升可维护性和性能。

🔴 高级阶段:熔断限流 & 分布式事务

  • 熔断限流工具:Hystrix / Resilience4j
  • 分布式事务:Seata、Saga 模式、TCC 模式

写在最后:你已经在路上了!

微服务是一个很大的话题,但别怕,它其实是由一个个小知识组合起来的。你现在已经迈出了第一步,有了方向感和实践能力。接下来要做的就是一点点往上爬。

如果你喜欢这个教程,请收藏起来慢慢看,有问题随时欢迎留言提问。愿你在后端开发的道路上越走越远!


🔚 教程结束,期待你在微服务世界里闯出一片天!🚀

评论 0

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