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

杨刚_数据
2025-06-26 01:04
阅读 614

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

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

在开始学习微服务之前,我们先来理解一下“单体应用”和“微服务”的区别。

单体应用(Monolithic Application),指的是一个应用程序的所有功能都集中在一个项目中运行。比如,你开发了一个电商系统,订单、库存、用户管理等功能都在同一个代码库里,部署在一起。虽然简单直接,但当项目变得庞大时,这种结构容易变得臃肿,维护困难,更新一个功能可能要重启整个系统。

微服务架构(Microservices Architecture)是一种将一个大型应用程序拆分为多个小型、独立服务的设计方式。每个服务负责一个明确的业务功能,并可以独立地开发、部署和扩展。就像是一家大公司被拆分为多个部门——财务部、人事部、销售部,各自独立运作,只在需要协作时进行沟通。

微服务的优点包括:

  • 模块化清晰:每个服务只专注于一个任务。
  • 可独立部署与升级:一个小功能出问题,不会影响整个系统。
  • 技术多样性:不同服务可以用不同的语言、数据库等实现。
  • 易于扩展:可以根据需求单独扩展某些高频服务。

接下来我们将从零开始,手把手带你搭建一个简单的微服务项目,体验从单体应用到微服务架构的过渡过程。


环境准备:搭建你的第一个微服务开发环境

环境准备:搭建你的第一个微服务开发环境

为了顺利进行后续实战,我们需要准备好以下工具:

1. 安装 Java 或 Node.js(任选其一)

本教程以 Java 为例,使用 Spring Boot 框架构建微服务。

安装步骤:

  1. 下载并安装 JDK 17+
  2. 验证是否安装成功:
    java -version
    
  3. 安装 Maven 用于项目管理和依赖管理
  4. 验证 Maven 是否安装成功:
    mvn -v
    

2. 安装 Spring Boot CLI(推荐)

方便快速创建 Spring Boot 项目。

  1. 访问 Spring Boot CLI 官网
  2. 安装后验证:
    spring --version
    

3. 安装 IDE(推荐 IntelliJ IDEA 或 VS Code)

建议使用 IntelliJ IDEA Community Edition,对 Spring Boot 支持很好。

下载地址:JetBrains IntelliJ IDEA 下载页面


核心概念:什么是服务注册与发现?为什么需要它?

核心概念:什么是服务注册与发现?为什么需要它?

当你有多个微服务时,它们之间如何找到彼此?这就要用到 服务注册与发现机制(Service Registration and Discovery)。我们可以把它想象成电话簿或者公司内部通讯录——每个服务启动的时候都要去“登记”,其他服务想调用它时就可以查这个电话簿来找到它的位置。

常用的服务发现组件是:

  • Eureka Server(来自 Netflix)
  • Consul
  • Zookeeper

我们将在实战中使用 Spring Cloud 提供的 Eureka 来实现这一功能。

此外,还需要了解几个关键术语:

名称 解释说明
服务注册 微服务启动后向服务发现服务器“报到”,告诉它自己的 IP 和端口
服务发现 其他服务通过服务发现服务器查找目标服务的位置
负载均衡 如果某个服务有多个实例,调用方可以自动选择其中一个执行请求
熔断机制 当某个服务不可用或响应缓慢时,自动切换或停止调用,避免级联故障

接下来我们就用这些知识一步步构建我们的微服务系统。


实战项目:从零开始搭建两个微服务 + 服务发现中心

数据流转过程-1

实战项目:从零开始搭建两个微服务 + 服务发现中心

我们要做的项目是一个简单的图书借阅系统,包含两个核心服务:

  • 图书服务(Book Service):提供图书列表查询接口
  • 借阅服务(Loan Service):允许用户借书,并调用图书服务判断是否存在该书

我们将使用 Spring Boot + Spring Cloud 实现微服务架构,并加入服务注册与发现机制。

第一步:创建服务注册中心 —— Eureka Server

创建 Eureka Server 项目

spring init --dependencies=cloud-starter-netflix-eureka-server eureka-server

进入文件夹后打开 EurekaServerApplication.java,添加注解启用 Eureka 服务:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer  // 启用 Eureka 服务注册中心
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

然后修改配置文件 application.properties

server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

启动后访问 http://localhost:8761,你会看到 Eureka 控制台界面。

第二步:创建图书服务(Book Service)

生成项目:

spring init --dependencies=web,cloud-starter-netflix-eureka-client book-service

编写图书实体类 Book.java

public class Book {
    private String id;
    private String title;

    // 构造方法、Getter 和 Setter 略
}

创建控制器 BookController.java

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

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

@RestController
@RequestMapping("/books")
public class BookController {
    
    @GetMapping
    public List<Book> getAllBooks() {
        return Arrays.asList(
            new Book("1", "Java编程思想"),
            new Book("2", "Spring实战")
        );
    }
}

最后,在主类 BookServiceApplication.java 添加注解并设置服务名:

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

修改 application.properties

server.port=8081
spring.application.name=book-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

启动后刷新 Eureka 页面,你会看到 book-service 出现在服务列表中。

第三步:创建借阅服务(Loan Service)

生成项目:

spring init --dependencies=web,cloud-starter-netflix-eureka-client,cloud-starter-openfeign loan-service

这里我们使用 Feign 做服务间通信。

创建 Feign Client 接口调用图书服务:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "book-service")
public interface BookServiceClient {
    @GetMapping("/books")
    List<Book> getBooks();
}

创建 Loan Controller:

@RestController
@RequestMapping("/loans")
public class LoanController {

    private final BookServiceClient bookServiceClient;

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

    @GetMapping("/available-books")
    public List<Book> getAvailableBooks() {
        return bookServiceClient.getBooks();
    }
}

主类添加注解并配置属性:

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

修改 application.properties

server.port=8082
spring.application.name=loan-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

测试 API

访问如下地址查看效果:

🎉 到此为止,我们完成了两个微服务之间的通信和注册发现机制!


常见问题解答(FAQ)

Q1:为什么访问不到服务?

A:检查端口是否冲突,服务是否注册成功。可以在 Eureka 控制台查看注册状态。

Q2:服务找不到怎么办?

A:确保服务名称一致(如 application.name)、Feign 注解是否开启、网络是否通顺。

Q3:Feign 报错怎么处理?

A:检查 Feign 的依赖是否正确引入,Feign client 接口是否被扫描到,日志信息是否有提示。

Q4:能否用 Python/Node.js 写微服务?

A:当然可以!你可以使用 Flask(Python)或 Express(Node.js)配合 Consul/Eureka 做服务发现。


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

完成本次实践后,你可以继续深入学习以下方向:

1. 增强容错能力:学习熔断器(Hystrix)和服务降级

  • 可以防止一个服务崩溃导致整个系统瘫痪
  • 提高系统的鲁棒性

2. 统一接口网关(API Gateway)

  • 使用 Zuul / Spring Cloud Gateway 集中管理路由和权限
  • 避免前端反复请求多个服务

3. 分布式事务处理

  • 如何保证多个服务操作数据一致性
  • 可学习 Saga 模式或两阶段提交协议(2PC)

4. 使用 Docker 容器化部署微服务

  • 每个服务打包为一个容器,便于快速部署和隔离
  • 可学习 Docker + Kubernetes 构建企业级云原生架构

推荐学习资源:

  • 《Spring Microservices in Action》英文原版书籍
  • B站视频:Spring Cloud 教程合集
  • GitHub 示例项目:spring-cloud-sample

总结

本篇教程带你从零开始搭建了两个微服务,并实现了服务注册与发现的基本流程。你现在已掌握:

  • 微服务的核心理念
  • 如何搭建 Spring Boot + Spring Cloud 项目
  • 如何让两个服务互相通信
  • 常见问题的排查思路

微服务是现代软件工程的重要组成部分,它能让团队更灵活地协作,也能更好地应对高并发和复杂业务的需求。希望你继续保持好奇心,勇于实践,未来的架构师就是你!

如果你喜欢这篇文章,请点赞收藏分享给更多初学者。感谢阅读 🙌

评论 0

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