微服务架构设计实战:从单体到分布式(新手友好教程)

代码小镇
2025-06-25 07:04
阅读 592

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

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

你有没有用过像淘宝、京东这样的网站?这些平台背后其实是很多个小程序在协同工作。比如:用户注册是一个程序,下单是一个程序,支付又是一个程序……

把这些小程序拆开来开发、部署,就是我们今天要学的——微服务架构(Microservices Architecture)

为什么不用一个大程序呢?

想象你要做一个大拼图,如果所有拼图片都在一起,别人想修改一块都会影响整体。而如果你把拼图分成几块,各自独立完成,修改起来就容易多了。

这就是微服务的最大优势:灵活、易维护、易扩展。


环境准备:搭建你的学习环境

环境准备:搭建你的学习环境

我们要用的是 Java + Spring Boot 来做微服务,因为这是目前最主流的技术栈之一。

步骤一:安装 Java 开发工具包(JDK)

java -version

确保输出中有类似 Java version "17" 这样的信息。

步骤二:安装 IntelliJ IDEA 社区版

步骤三:安装 Maven 和配置

验证安装:

mvn -v

看到 Maven 版本号就说明成功了。


核心概念:小白也能懂的专业术语

1. 单体应用 vs 微服务

单体应用 微服务
所有功能在一个项目里 拆成多个小项目
改一处可能全崩 某个服务坏了不影响其他
部署快但难扩展 可以单独部署每一个服务

2. RESTful API(接口通信方式)

就像两个人打电话沟通一样,每个服务之间是通过 HTTP 请求交换数据。比如:

GET /users/1

表示“我要查看 id 是 1 的用户”。

3. 注册中心(Eureka)

相当于通讯录。每个服务启动时都要去这里登记:“我叫 user-service,我可以处理用户请求”。

4. 网关(Gateway)

就像总入口。外部请求先到网关,再由网关分派到对应的服务上。

5. 配置中心(Spring Cloud Config)

统一管理所有服务的配置文件,比如数据库账号密码,避免重复写。


实战项目:从0开始搭建两个微服务和一个网关

缓存策略对比-1

目标:
我们将搭建两个服务:

  • user-service:负责用户管理
  • order-service:负责订单管理
    还有:
  • gateway-service:访问的唯一入口

第一步:创建父项目(Maven 多模块项目)

  1. 在 IDEA 中创建一个名为 microservice-demo 的 Maven 项目。
  2. 不需要选择模板,只保留空的 pom.xml 文件。
  3. 在这个父项目下,新建三个子模块:
    • user-service
    • order-service
    • gateway-service

第二步:添加 Spring Boot 依赖

父项目的 pom.xml 添加如下内容:

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>microservice-demo</artifactId>
    <version>1.0.0</version>
    <modules>
        <module>user-service</module>
        <module>order-service</module>
        <module>gateway-service</module>
    </modules>

    <packaging>pom</packaging>

    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2023.0.0</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

第三步:创建 user-service

1. 添加依赖 user-service/pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2. 创建启动类 UserServiceApplication.java

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

3. 创建 UserController

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

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

4. 在 application.yml 设置端口

server:
  port: 8081

现在你可以运行 UserServiceApplication,然后访问:

👉 http://localhost:8081/users/1
你应该看到输出:

User with ID: 1

第四步:创建 order-service(步骤类似)

同样添加 spring-boot-starter-web 依赖
创建控制器 OrderController:

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

    @GetMapping("/{id}")
    public String getOrder(@PathVariable Long id) {
        return "Order with ID: " + id;
    }
}

application.yml 中设置不同端口:

server:
  port: 8082

测试访问:
👉 http://localhost:8082/orders/100
结果:

Order with ID: 100

第五步:创建网关 gateway-service

1. 添加网关依赖

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

2. 配置网关路由

application.yml

server:
  port: 9090

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1

        - id: order-service
          uri: http://localhost:8082
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1

这样配置的意思是:

  • 访问 /api/users/123 -> 被转发到 user-service 的 /users/123
  • 访问 /api/orders/456 -> 被转发到 order-service 的 /orders/456

3. 启动并测试

运行 gateway-service,然后访问:

👉 http://localhost:9090/api/users/123
返回:

User with ID: 1

👉 http://localhost:9090/api/orders/456
返回:

Order with ID: 456

🎉 至此,两个服务 + 一个网关已经可以运行!


常见问题解答(FAQ)

Q1:出现 "Port already in use" 怎么办?

A:请确认别的服务没有占用相同的端口。比如 user-service 占用了 8081,就不能让另一个服务也用它。

Q2:访问网关报错 404,怎么回事?

A:请检查网关的路由配置是否正确,尤其是路径匹配部分,比如是不是写了 /api/users/**

Q3:怎么调用另一个服务?它们不能互相通信吗?

A:当然可以!后续你可以使用 RestTemplate 或 Feign 客户端实现服务间通信。

Q4:每次改完代码都要重启服务吗?

A:可以使用 DevTools 插件实现自动热重载,减少手动重启的烦恼。

Q5:微服务太多怎么管理配置?

A:可以用配置中心 Spring Cloud Config 或 Nacos 等。


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

恭喜你完成了第一个微服务项目 🎉
接下来你可以继续深入以下几个方向:

方向一:加入注册中心 Eureka(服务发现)

  • 每个服务启动后都注册自己到 Eureka
  • 网关不再硬编码地址,而是根据服务名自动查找

方向二:配置中心 Spring Cloud Config

  • 把所有配置抽取出去统一管理
  • 修改一次全局生效,不需逐个修改

方向三:增加负载均衡 Ribbon 或 LoadBalancer

  • 当一个服务启动多个实例时,自动分配请求

方向四:服务熔断 Hystrix(容错机制)

  • 如果某个服务挂了,不影响整个系统

方向五:消息队列 Kafka/RabbitMQ

  • 实现异步通信,提高系统效率

总结

在这篇教程中,你学会了:

  • 什么是微服务及其优势
  • 如何搭建基础开发环境
  • 拆分两个简单服务和配置网关
  • 解决常见问题的方法
  • 下一步该往哪学

微服务不是一天能学会的,但它也不像想象中那么难。只要一步步来,你就一定能掌握!

如果你觉得这篇文章对你有帮助,请点赞、收藏,并分享给还在困惑的小白朋友 💪


📌 文章结束,总字数:约2293字

评论 0

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