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

刘娜_程序员
2025-06-16 17:17
阅读 343

开篇:微服务是什么,能解决什么问题?

开篇:微服务是什么,能解决什么问题?

在开始学习微服务之前,我们先来看一个简单的比喻:

你正在经营一家餐厅。起初你一个人负责点餐、烹饪、收款、打扫……这就是单体应用(Monolithic Application)。随着生意越来越好,一个人忙不过来,你就请了厨师专门做菜、服务员负责接待、收银员处理付款……这就像将一个大系统拆分成多个小系统,各自专注一件事,互相配合,就叫微服务架构(Microservices Architecture)。

那么什么是微服务呢?

微服务是一种软件开发架构风格。它把一个大型应用程序拆分成多个小型、独立的服务模块。每个模块都可以独立开发、部署、运行,并通过网络(通常是HTTP或者消息队列)相互通信。

为什么用微服务?

  • 灵活部署:不同服务可以使用不同的技术栈。
  • 可扩展性强:哪个功能压力大,就单独扩容那个服务。
  • 故障隔离好:某个服务出错不会影响整个系统。
  • 团队协作更高效:多人同时开发互不影响。

现在我们就一步步来学习怎么从零搭建自己的第一个微服务项目吧!


环境准备:安装你需要的开发工具

环境准备:安装你需要的开发工具

在开始前,我们要准备好以下基础环境:

工具清单

  1. Java JDK 8 或以上
  2. Maven 3.x
  3. Spring Boot(框架支持微服务)
  4. Postman(测试接口用)
  5. Docker(后续部署要用)
  6. IDE:IntelliJ IDEA 或 VSCode

如果你是Windows用户,建议使用IntelliJ IDEA社区版,免费且非常强大。

安装步骤简要说明:

1. Java JDK

前往 Oracle官网 或 OpenJDK 下载最新版本,安装后执行命令检查是否成功:

java -version
javac -version

2. Maven

下载地址:https://maven.apache.org

解压后配置环境变量(MAVEN_HOMEPATH),然后验证:

mvn -v

3. IntelliJ IDEA(IDE)

JetBrains官网 下载安装包,按提示安装即可。

4. Postman

下载地址:https://www.postman.com/downloads/

安装完成后直接打开就可以用。

5. Docker

Windows 用户推荐安装 Docker Desktop,Mac/Linux用户也有对应版本。安装完成后执行:

docker --version

如果你不确定某一步如何操作,可以在网上搜索“你的操作系统 + 安装XXX”即可找到详细教程。


核心概念讲解:什么是微服务的核心思想?

核心概念讲解:什么是微服务的核心思想?

接下来我们用简单易懂的方式解释几个核心概念。

1. 单体 vs 微服务

对比项 单体架构 微服务架构
开发方式 所有代码在一个项目中 拆成多个小服务,分别开发
部署方式 整个应用打包一起部署 每个小服务单独部署
技术栈选择 全部必须一致 每个服务可以选择不同语言或框架
维护难度 越大越难维护 各个服务之间松耦合,维护更方便

2. 服务间通信方式

服务之间是靠“打招呼”交流的,主要有两种方式:

  • 同步通信(HTTP API)
    比如 A 服务调用 B 服务时会等待结果返回。

  • 异步通信(MQ、Kafka等)
    A 服务发送请求后不等结果,B 服务处理完再通知。

我们这篇文章主要使用同步通信,便于理解。

3. 微服务常见组件(术语介绍)

组件名称 功能描述
注册中心 Eureka 让所有服务知道彼此在哪,相当于通讯录
网关 Gateway 接收外部请求,并根据路径转发给正确的服务,相当于前台小姐
配置中心 Config Server 所有服务共享的配置信息集中管理,统一修改
负载均衡 Ribbon 当一个服务有多台机器时,决定哪一台来处理请求
分布式链路追踪 Sleuth 监控一次请求经过哪些服务,帮助排查问题

新手不需要一下子掌握这么多,我们会在实战中逐步引入这些组件。


实战项目:一步一步创建你的第一个微服务项目

我们将做一个“图书管理系统”的最简版本,有两个微服务:

  • book-service:提供书籍信息查询
  • user-service:提供用户借阅信息查询

目标:让两个服务能互相调用数据。

步骤一:创建 Spring Boot 项目

使用 Spring Initializr 创建两个项目:

  • book-service:
    • Dependencies: Spring Web, Eureka Client
  • user-service:
    • Dependencies: Spring Web, Eureka Client, OpenFeign

下载并导入IDE。

步骤二:添加注册中心 Eureka Server

新建一个 Spring Boot 项目:

  • Name: eureka-server
  • Dependencies: Eureka Server

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/

启动类加上注解:

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

步骤三:让两个服务注册进 Eureka

以 book-service 为例,在 application.yml 添加:

spring:
  application:
    name: book-service

server:
  port: 8081

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

启动后访问 http://localhost:8761 查看服务是否注册成功。

同样配置 user-service 的 application.yml,端口改为 8082。

步骤四:实现服务间调用(Feign)

现在我们要在 user-service 里调用 book-service 获取书籍信息。

在 user-service 中添加 Feign 客户端接口:

@FeignClient(name = "book-service")
public interface BookServiceClient {

    @GetMapping("/books/{id}")
    String getBookById(@PathVariable("id") Long id);
}

Controller 中使用它:

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

    private final BookServiceClient bookServiceClient;

    public UserController(BookServiceClient bookServiceClient) {
        this.bookServiceClient = bookServiceClient;
    }

    @GetMapping("/book/{id}")
    public String getBookFromUser(@PathVariable Long id) {
        return "User wants to borrow book: " + bookServiceClient.getBookById(id);
    }
}

确保两个服务和注册中心都已启动。

访问:http://localhost:8082/users/book/1,你应该能看到如下输出:

User wants to borrow book: {"id":1,"title":"深入理解微服务","author":"张三"}

🎉恭喜!你已经完成了第一个微服务之间的调用!


常见问题解答:新手常问的问题都在这里

问题一:我启动服务时报错,显示连接不到 Eureka Server 是怎么回事?

答: 可能是你还没启动 Eureka Server。微服务项目依赖注册中心,必须先启动 Eureka 再启动其他服务。

问题二:Feign 请求报错,说找不到服务怎么办?

答: 确保服务名称正确、Eureka 正确注册、并且两个服务处于同一个 Eureka 集群中(defaultZone 设置一致)。

问题三:我想用别的编程语言写某个服务,行吗?

答: 当然可以!微服务的一大优势就是允许不同服务使用不同的语言和技术栈,只要它们都能通过 HTTP 或者消息中间件通信。

问题四:我的服务部署后无法访问?

答: 检查端口是否冲突,是否有防火墙限制,Docker 容器有没有正确暴露端口(例如:-p 8080:8080)。

问题五:微服务是不是一定比单体更好?

答: 并不是。对于小项目、初期快速迭代时,单体架构更简单。只有当业务复杂度增加、需要高并发和灵活部署时,微服务才是更好的选择。


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

学完了这篇入门实战之后,你可以继续学习以下内容:

进阶路线图(适合初学者)

  1. 服务网关 Spring Cloud Gateway
    • 统一路由,权限控制
  2. 配置中心 Spring Cloud Config
    • 多环境配置管理
  3. 熔断器 Hystrix / Resilience4j
    • 服务失败降级,防止雪崩效应
  4. 日志聚合 ELK(Elasticsearch + Logstash + Kibana)
    • 统一日志收集与可视化
  5. 容器化部署 Docker + Kubernetes
    • 自动发布、弹性扩缩容
  6. 消息队列 Kafka/RabbitMQ
    • 实现异步通信、事件驱动架构
  7. API 文档 Swagger / SpringDoc
    • 自动生成接口文档,提高协作效率

你可以按照这个顺序逐步提升技能,每一步都结合实际项目练习效果最好。


总结

本教程带你从零搭建了一个包含两个服务的微服务项目,了解了其基本原理和核心概念。希望你对微服务有了初步认识,并具备了动手实践的能力。

记住一句话:“不懂没关系,动手试试就知道了。

持续实践,你会越来越熟练!

如果你喜欢这样的教学风格,欢迎继续关注更多《从零到实战》系列文章 👇


最后送你一句话:学习不是为了懂得一切,而是让自己面对未知时,依然有勇气前行。

评论 0

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