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

独立开发路上
2025-06-12 23:32
阅读 732

——写给零基础初学者的教程


一、开篇:什么是微服务?它有什么用?

一、开篇:什么是微服务?它有什么用?

你可能听说过“微服务架构”这个词。简单来说,微服务是一种将一个大型应用程序拆分成多个小模块来开发和部署的方法。这些小模块可以独立运行、独立部署,并通过网络互相通信。

举个例子:

想象你要开一家餐厅,一开始可能自己一个人做厨师、服务员、收银员、经理……这就是“单体应用”,所有功能都集中在一个地方。但随着餐厅越来越大,人手不够了,效率也变低了。这时候你就开始分工:一个负责厨房,一个负责前台接待,一个专门管账……每个岗位就是一个“微服务”。

微服务的核心特点:

  • 每个服务专注于完成一个业务
  • 每个服务可独立部署、升级
  • 服务之间通过网络通信(比如HTTP API)
  • 技术栈可以不同(Java、Python、Go等都可以混搭)

微服务适用于中大型项目,尤其是需要高可用性、快速迭代、团队多人协作的场景。

🎯 我们的目标是: 从0开始构建一个简单的“订单管理+用户管理”的两个微服务系统。最后实现它们之间的调用与协作。


二、环境准备:你需要安装哪些工具?

二、环境准备:你需要安装哪些工具?

在开始编码之前,我们需要准备好开发环境。请按照以下步骤操作。

✅ 工具清单:

  1. Java 8 或以上(我们使用Spring Boot,基于Java)
  2. Maven(项目依赖管理工具)
  3. IntelliJ IDEA 或 VS Code(推荐IDE)
  4. Postman(接口测试工具)
  5. Docker(用于容器化部署)
  6. Redis(缓存数据库)、MySQL(关系型数据库)

🛠 安装指南简要

如果你不熟悉命令行或某个工具的具体安装方法,可以在网上搜索关键词,如 Java 8 install Windows,都能找到图文并茂的教程。

1. Java & Maven

# 查看是否安装成功
java -version
mvn -v

2. IDE(推荐 IntelliJ IDEA 社区版)

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

3. Postman

官网:https://www.postman.com/downloads/ 安装后打开即可用来测试API接口。

4. Docker

Windows/Mac:安装 Docker Desktop
Linux:运行 sudo apt install docker.io

验证:

docker --version

三、核心概念:通俗解释微服务的关键术语

1. 单体 vs 微服务

特性 单体架构 微服务架构
部署方式 打成一个包,一起部署 每个服务单独部署
故障影响 出问题整个系统挂掉 一个服务出错不影响其他
扩展能力 需整体扩容 可以只扩展某个热点服务
团队协作 所有开发者都在一个代码库 各团队维护自己的服务

2. REST API 是什么?

REST(Representational State Transfer) 是一种网络通信的标准风格。它的基本形式就是通过 HTTP 方法(GET, POST, PUT, DELETE)来操作资源。

例如:

  • GET /users 获取所有用户
  • GET /users/1 获取ID为1的用户
  • POST /orders 创建新订单

3. 服务注册与发现(Service Discovery)

多个微服务启动后怎么知道彼此的地址?这就需要服务注册中心。常见的工具有 Eureka、Consul、Nacos 等。我们后面会用 Spring Cloud 的 Eureka 来演示。

4. 负载均衡(Load Balancing)

当一个服务有多个实例时(比如用户服务跑在三个机器上),我们要能随机选择其中一个提供服务。Spring Cloud Ribbon 就是用来做这件事的。

5. 分布式事务(选学)

一个订单创建后,同时要扣库存,这两个操作不在同一个服务里,如何保证一致性?这就要用到分布式事务解决方案,比如 Saga 模式、TCC、Seata 等。这个我们先不深入。


四、实战项目:一步步搭建两个微服务(用户服务 + 订单服务)

我们将使用 Spring Boot 和 Spring Cloud 构建两个简单的微服务。

项目结构说明:

user-service       --> 用户管理服务(提供查询用户信息的接口)
order-service      --> 订单服务(创建订单,关联用户)
eureka-server      --> 服务注册中心(帮助服务互相查找)

我们分四步来完成这个项目。


第一步:创建 Eureka 注册中心

新建一个 Spring Boot 项目 eureka-server,选择 Spring Initializr(https://start.spring.io

添加依赖:

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

配置 application.yml

server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

主类加上注解:

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

启动后访问 http://localhost:8761 看到 Eureka 控制台。


第二步:创建用户服务 user-service

同样用 Spring Initializr 新建项目,添加如下依赖:

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

配置 application.yml

server:
  port: 8081
spring:
  application:
    name: user-service
eureka:
  client:
    serviceUrl:
      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 注册成功!


第三步:创建订单服务 order-service

同样初始化一个 Spring Boot 项目,添加依赖:

<!-- Web & Eureka Client -->
<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>

配置文件:

server:
  port: 8082
spring:
  application:
    name: order-service
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

现在,我们要让订单服务调用用户服务获取用户信息。

引入 Feign 远程调用组件:

添加依赖:

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

主类加注解启用 Feign:

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

编写 Feign 接口(相当于远程调用用户服务):

@FeignClient(name = "user-service")
public interface UserServiceClient {
    @GetMapping("/users/{id}")
    String getUserById(@PathVariable("id") Long userId);
}

然后写一个订单控制器:

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

    @Autowired
    UserServiceClient userServiceClient;

    @GetMapping("/user/{userId}")
    public String getOrderDetail(@PathVariable Long userId) {
        String userInfo = userServiceClient.getUserById(userId);
        return "Order for user: " + userInfo;
    }
}

运行后访问:http://localhost:8082/orders/user/1
你会看到输出类似:Order for user: User ID: 1

✅ 到这里为止,两个服务已经能够相互通信!这就是微服务的基本雏形。


第四步(进阶):打包成 Docker 镜像并运行(非必须)

如果你想要真正部署你的服务,你可以把每个服务打成 Docker 镜像。

例如,针对 user-service 编写 Dockerfile:

FROM openjdk:8-jdk-alpine
COPY target/user-service.jar userservice.jar
ENTRYPOINT ["java", "-jar", "userservice.jar"]

构建镜像:

docker build -t user-service .

运行容器:

docker run -p 8081:8081 user-service

你也可以为 Eureka Server 写一个 Dockerfile,并用 docker-compose.yml 一次性启动所有服务。


五、常见问题解答(FAQ)

1. 启动时报错 Application is already running on port XX 怎么办?

👉 可能是你之前没关闭程序,或者端口被占用了。可以换一个端口号重新运行,比如修改 application.yml 中的 server.port


2. 访问用户服务返回 404?

👉 确保你正确写了 controller 的路径。比如:

@GetMapping("/users/1")  // 必须用 get 请求访问

如果浏览器访问返回空白页面,建议改用 Postman 测试更准确。


3. 订单服务无法调用用户服务?

👉 检查点如下:

  • 是否开启了 Feign(@EnableFeignClients
  • 是否在 Eureka 上注册成功
  • 用户服务是否真的运行起来了(检查日志)
  • Feign接口的 name 和服务名是否一致(大小写敏感)

4. 如何查看服务之间的调用链路?

👉 可以集成 Zipkin、SkyWalking 等分布式追踪系统,后续学习推荐加入。


六、学习建议:接下来该学什么?

恭喜你完成了第一个微服务项目!但这只是起点。以下是后续推荐的学习路径:

🚀 基础延伸方向:

  1. 【API 网关】学习 Spring Cloud Gateway 或 Zuul,统一管理服务请求入口。
  2. 【服务熔断】学习 Hystrix / Resilience4j,处理服务故障时的优雅降级。
  3. 【日志聚合】ELK Stack(Elasticsearch + Logstash + Kibana)
  4. 【配置中心】Nacos / Spring Cloud Config,统一管理各服务配置。

📦 容器与编排方向:

  1. 学习 Kubernetes(简称 K8s)集群管理
  2. 使用 Helm 管理应用部署模板
  3. 了解 Service Mesh(如 Istio)高级特性

💻 实战进阶项目推荐:

  • 构建一个完整的电商平台(商品服务、购物车服务、支付服务)
  • 改造现有单体项目为微服务架构
  • 给你的项目加上 JWT 登录鉴权机制

结语:微服务不是万能药

微服务架构虽然强大,但也带来了新的复杂性。它并不是所有项目的必选项。作为初学者,最重要的是先理解其设计理念和适用场景,再逐步掌握相关的技术细节。

当你亲手完成一次两个服务的交互通信,就会发现:“哦,原来微服务也没那么神秘!” —— 这就是进步的第一步。

继续加油,成为架构高手的路上,我们一直在同行。


🎯 如果你觉得这篇教程对你有帮助,请点赞分享。我会继续输出更多适合零基础同学的技术入门文章。

评论 0

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