微服务架构设计实战:从单体到分布式(适合零基础新手)

一只会写码的猫
2025-06-15 08:30
阅读 327

一、开篇:什么是微服务?为什么它那么火?

一、开篇:什么是微服务?为什么它那么火?

你有没有发现,现在很多大公司的系统看起来很“拆” —— 比如淘宝有订单模块、支付模块、用户模块、物流模块……这些其实都是单独开发、部署的小程序

这就是我们今天要学的主角 —— 微服务架构(Microservices Architecture)

✅ 一句话定义:

微服务是一种将一个大型应用拆分成多个独立小服务的设计方式,每个服务负责一块功能,并可以单独开发、测试和部署。

📌 举个生活中的例子:

想象你在做一道年夜饭:

  • 单体架构:你一个人做完所有的菜。一个人忙不过来,效率低。
  • 微服务架构:你把任务分配给家人,有人炒肉,有人煮汤,有人包饺子,大家各自干自己的任务,最后拼成一桌菜。

是不是感觉更高效了?


二、环境准备:开始写代码之前,先把工具准备好

二、环境准备:开始写代码之前,先把工具准备好

在我们真正动手搭建微服务之前,需要准备好以下工具和环境:

🔧 工具清单(Windows/macOS/Linux 都适用):

工具名称 版本建议 作用说明
Java JDK 17+ 运行 Java 程序的基础
Maven 3.8+ Java 包管理工具
IntelliJ IDEA 社区版/旗舰版 写代码的编辑器
Postman 最新版 接口调试工具
Docker(可选) 安装最新稳定版 容器化部署微服务

⚙️ 步骤简述(详细安装教程请参考官方文档):

  1. 下载并安装 Java JDK 17+
  2. 安装 Maven
  3. 下载并安装 IntelliJ IDEA
  4. 安装 Postman
  5. (可选)安装 Docker Desktop

✅ 小贴士:

  • Windows 用户可以直接用命令 java -versionmvn -v 来验证是否安装成功
  • Mac 用户可以用 Homebrew 快速安装 brew install maven

三、核心概念:几个关键术语,让你秒懂微服务世界

三、核心概念:几个关键术语,让你秒懂微服务世界

为了后面能顺畅地开发项目,我们先快速了解一下微服务架构中常见的几个关键词。

🌐 1. 服务注册与发现(Service Registry & Discovery)

假设你家里来了很多亲戚,大家都想帮你做饭。你需要知道谁会做什么菜。这时候就需要一个“名单”,告诉你每个服务在哪个位置(IP+端口),这就是服务注册中心

常用组件:Eureka(Spring Cloud)、Consul、Nacos

🔁 2. 负载均衡(Load Balancing)

如果有10个人都会炒肉,那应该让哪一个人去做呢?负载均衡就是用来决定请求发给哪一个实例。

常见实现:Ribbon、Spring Cloud LoadBalancer

🚪 3. API网关(API Gateway)

所有外部请求都要经过大门才能进来。这个大门就是网关,它可以做统一的身份验证、路由分发等操作。

常用组件:Zuul、Gateway(Spring Cloud Gateway)

💬 4. 分布式配置中心(Config Server)

以前配置都放在本地文件里,现在微服务变多了,配置也变多了。统一管理配置的服务器就是 Config Server。

Spring Cloud 提供了 Spring Cloud Config

🛡️ 5. 断路器(Circuit Breaker)

服务之间调用的时候,如果对方服务出问题,不能一直卡着,否则整个系统就崩溃了。断路器的作用是自动熔断,防止雪崩效应。

常用:Hystrix(已不推荐)、Resilience4j、Sentinel


四、实战项目:一步步做一个简单的微服务系统

四、实战项目:一步步做一个简单的微服务系统

现在我们进入最激动人心的部分 —— 动手做一个微服务系统!

我们将构建两个小服务和一个注册中心:

  • 服务A:用户服务(User Service)
  • 服务B:订单服务(Order Service)
  • 注册中心:Eureka Server

项目结构图:

.
├── eureka-server           # 注册中心
├── user-service            # 用户服务
└── order-service           # 订单服务

第一步:创建 Eureka Server(注册中心)

使用 Spring Initializr 创建项目:

访问 start.spring.io,选择如下配置:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 2.7.x 或以上
  • Dependencies: Spring Web, Eureka Server

下载项目后,在主类加上注解启用 Eureka:

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

修改 application.yml

server:
  port: 8761

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

启动项目,访问 http://localhost:8761 可看到 Eureka 的网页界面。


第二步:创建 User Service

还是用 Spring Initializr 创建一个新项目,添加依赖:

  • Spring Web
  • Eureka Discovery Client

主类添加注解:

@EnableEurekaClient
@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 getUser(@PathVariable Long id) {
        return "User ID: " + id;
    }
}

配置 application.yml

server:
  port: 8081

spring:
  application:
    name: user-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

启动之后刷新 Eureka 页面,就能看到服务注册进去了!


第三步:创建 Order Service(调用用户服务)

同样使用 Spring Initializr 创建项目,依赖不变。

Controller 示例:

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

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/{userId}")
    public String getOrderForUser(@PathVariable Long userId) {
        String url = "http://user-service/users/" + userId;
        return "Order for user: " + restTemplate.getForObject(url, String.class);
    }
}

别忘了加入 RestTemplate Bean:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

配置 application.yml

server:
  port: 8082

spring:
  application:
    name: order-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

启动后访问:

http://localhost:8082/orders/123

输出结果应为:

Order for user: User ID: 123

🎉 成功实现了一个完整的微服务调用!


五、常见问题解答(FAQ)

数据库设计模型-1

❓ Q1:Eureka 启动报错“Cannot determine local hostname”

💡 解决方法:设置 hosts 文件或强制指定 hostname:

在 application.yml 中添加:

eureka:
  instance:
    hostname: 127.0.0.1

❓ Q2:调用 user-service 报错:“UnknownHostException”

💡 解决方法:

  1. 确保 user-service 已注册到 Eureka。
  2. 查看是否开启 @EnableEurekaClient
  3. 检查是否遗漏了 @LoadBalanced 注解
  4. 看日志确认服务名是否正确

❓ Q3:Spring Boot 项目无法识别 application.yml?

💡 解决方法:

  • 确保 pom.xml 中有 spring-boot-starter-web 依赖
  • 检查 application.yml 文件路径是否正确(resources目录下)

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

恭喜你完成了你的第一个微服务项目!但这只是一个开始。

你可以沿着下面的学习路线继续前进:

🗺️ 学习进阶路线图:

  1. 学习 Spring Cloud Alibaba(推荐)

    • Nacos(服务注册&配置中心)
    • Sentinel(熔断限流)
    • Gateway(新一代 API 网关)
  2. 容器化部署(Docker + Kubernetes)

    • 了解 Docker 如何打包微服务
    • 学习使用 Kubernetes 部署多个服务
  3. 消息队列:Kafka / RocketMQ / RabbitMQ

    • 异步通信机制,解决服务间耦合问题
  4. 日志收集与监控:ELK / Prometheus + Grafana

  5. 服务链路追踪:Sleuth + Zipkin


结语:学了就有进步,做了就不难!

微服务听起来高大上,但只要我们一步一步走,把它拆开来看,其实就是很多小服务组合在一起的结果。你现在已经有能力做出一个完整的服务调用了!

继续加油,成为后端高手不是梦!


📌 下载源码地址(示例):https://github.com/example/microservice-demo

欢迎关注公众号获取后续更多内容!


如果你觉得这篇教程有用,请点赞分享让更多人看见~ 😊

评论 0

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