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

郑雨泽
2025-06-14 03:38
阅读 356

开篇:什么是微服务,它用来做什么?

开篇:什么是微服务,它用来做什么?

你有没有用过像“淘宝”、“京东”这样的大网站?它们功能非常丰富、用户数巨大。如果这些系统是用传统的单体架构(也就是所有代码写在一个程序里)来开发,那这个程序会变得超级复杂、难以维护。

为了解决这个问题,就有了一个叫 “微服务架构” 的方案。你可以简单理解为:把一个大系统拆成几个小系统,每个小系统只管自己那一块,比如用户管理、订单处理、商品展示等。

这些小系统可以各自独立运行、部署、升级,彼此之间通过网络进行通信。这样做的好处是:

  • 更容易维护
  • 出问题更容易定位和修复
  • 可以根据需求单独扩展某一部分的功能

今天,我们就从零开始,带你一步步实现一个简单的微服务项目!


环境准备:搭建你的开发环境

环境准备:搭建你的开发环境

我们需要的工具有:

1. 安装 Java(JDK)

Java 是编写后端服务的常用语言。我们选择使用 Spring Boot 框架来搭建我们的微服务。

安装完成后,在命令行输入:

java -version

看到类似以下输出说明安装成功:

openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment ...

2. 安装 Maven

Maven 是一个 Java 项目的构建工具,能帮助我们下载依赖、打包项目。

解压后配置环境变量(如 PATH)。然后在命令行中输入:

mvn --version

出现版本信息就 OK 啦。

3. 安装 IntelliJ IDEA(推荐)

这是目前最流行的 Java 开发工具。

安装之后打开它,就能愉快地写代码啦!


核心概念:微服务中的关键词解释(通俗易懂)

数据库设计模型-1

核心概念:微服务中的关键词解释(通俗易懂)

为了方便理解,我会尽量用生活中的例子来类比。

1. 单体应用 vs 微服务

类比 单体应用 微服务
做饭方式 一锅炖 分开做
优点 简单易上手 易维护、灵活
缺点 越来越难管理 需要协调多个模块

举个例子,就像你在厨房做饭,原本是把菜、肉、汤都放在一起煮,现在改成分别炒菜、炖汤、烤鸡翅一样。

2. REST API(网络请求接口)

想象你去餐厅点餐,你说“我要一份番茄炒蛋”,服务员听到了就给你安排厨师做这道菜。这里的“点餐”动作就是一种接口(API),它告诉你怎么和服务沟通。

在微服务中,A服务想获取B服务的数据,就要通过 HTTP 请求调用 B 提供的 REST 接口。

3. Eureka 注册中心(服务中心)

假设你开了一家连锁店,每一家分店都要向总部登记。Eureka 就是一个登记处,所有的微服务启动后都要来这里注册自己的地址,别的服务就可以通过这个中心找到它们。

4. Feign(远程调用客户端)

Feign 是一种简化远程调用的方式。你可以把它理解成“自动拨号器”——你想打给另一个服务的时候,只需要说一句“我要调用用户服务”,Feign 就会帮你完成整个过程。

5. Gateway(网关)

网关相当于一个门口保安。你要访问某个服务,先得经过网关。它可以控制谁可以进、不能进;还可以统一处理认证、限流等功能。


实战项目:动手做一个“用户 + 订单”微服务系统

我们来做一个小系统,包含两个服务:

  • 用户服务(UserService)
  • 订单服务(OrderService)

这两个服务之间需要互相通信。

第一步:创建父工程(Spring Initializr)

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

填写信息如下:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版本(如 3.1.x)
  • Group: com.example
  • Artifact: microservice-demo
  • Dependencies:
    • Spring Web
    • Spring Cloud Discovery Client
    • Spring Cloud OpenFeign
    • Spring Cloud Gateway

点击【Generate】下载压缩包,解压导入 IntelliJ IDEA。

第二步:创建子模块(用户服务)

右键项目 → New → Module → Maven Module
取名为 user-service

添加基础代码:

pom.xml 添加内容:

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

创建主启动类:

// src/main/java/com/example/userservice/UserServiceApplication.java
@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

添加 Controller 示例:

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

    @GetMapping("/{id}")
    public String getUserById(@PathVariable Long id) {
        return "User ID: " + id;
    }

}

配置 application.yml 文件:

server:
  port: 8081

spring:
  application:
    name: user-service

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

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

同样新建一个 Maven Module,取名 order-service

添加代码结构与上面类似:

Controller 示例:

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

    @Autowired
    private UserServiceClient userServiceClient;

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

Feign 客户端定义:

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

配置文件:

server:
  port: 8082

spring:
  application:
    name: order-service

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

第四步:启动注册中心(Eureka Server)

新建一个模块 eureka-server。

pom.xml 中添加:

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

主类加注解:

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

API接口文档-2

配置文件:

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/

启动后,访问 http://localhost:8761,能看到注册页面。

第五步:启动所有服务,测试访问

依次启动顺序建议:

  1. Eureka Server
  2. User Service
  3. Order Service

测试访问:

你会看到结果是:

Orders for: User ID: 1

说明两个服务之间已经可以正常通信了!


常见问题:新手容易遇到的问题解答

❓Q1:为什么 Feign 调用失败?

  • 检查是否加入了 @EnableFeignClients 注解
  • 是否开启了负载均衡(例如是否用了 spring-cloud-starter-loadbalancer
  • 是否服务已经注册成功(查看 Eureka 页面)

❓Q2:Eureka 启动报错怎么办?

  • 检查端口是否冲突
  • 查看控制台日志,确认配置是否正确
  • 网络设置是否允许本机访问

❓Q3:如何查看服务注册情况?

启动 Eureka 服务器后,访问 http://localhost:8761,可以看到已注册的服务列表。


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

你现在掌握了微服务的基本搭建和调用,接下来可以学习这些方向:

✅ 进阶内容清单:

  1. 使用 Zuul 或 Gateway 实现路由控制
  2. 学习配置中心 Config Server
  3. 实践链路追踪 Sleuth + Zipkin
  4. 使用 Docker 容器化部署
  5. Kubernetes 部署集群管理
  6. 服务熔断 Hystrix 和降级策略

📘 学习资源推荐:


希望这篇教程能让你轻松入门微服务的设计与实践。记住一句话:编程不是背公式,而是动手练出来的!坚持敲代码,每天进步一点点 😄

如果你喜欢,请继续关注更多实用教程分享!

评论 0

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