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

慢慢写代码
2025-06-18 06:58
阅读 782

一、开篇:什么是微服务?为什么要学它?

一、开篇:什么是微服务?为什么要学它?

你可能听说过“微服务”这个词,但不一定清楚它是做什么的。简单来说,微服务是一种软件开发方法,它的核心思想是:把一个大应用拆成多个小应用,每个小应用都独立运行、部署和扩展。

我们拿吃饭来打个比方:

  • 传统做法(单体架构):一家餐馆只做一道菜——大盘鸡拌面炒饭!虽然方便管理,但一旦出错(比如米饭糊了),整个菜品就废了。

  • 微服务架构:这家店现在变成一个小食堂,分成炒饭组、炒面组、炖菜组……各自负责自己的任务,就算某一个小组出问题,其他部分还能照常运作。

微服务的优势:

  • 每个模块独立,更灵活
  • 容易维护和部署
  • 易于团队协作(各干各的)
  • 可以根据不同需求横向扩展某个功能(比如用户登录太慢,可以专门多部署几个登录服务)

所以,当你开发一个越来越大的项目时,微服务就是帮你解决复杂度的利器


二、环境准备:搭建属于你的微服务实验田

二、环境准备:搭建属于你的微服务实验田

在开始写代码之前,我们需要先准备好开发工具。以下是初学者需要安装的基本环境:

1. 编程语言:Java + Spring Boot(推荐)

Java 是企业级应用最常用的语言之一,Spring Boot 是构建微服务的黄金组合!

安装步骤:

  1. 下载并安装 JDK 17+
  2. 安装 IntelliJ IDEA(社区版免费)
  3. 创建一个 Spring Boot 新项目(用Spring Initializr生成初始项目)

2. 微服务通信必备:REST API + JSON

  • REST 是一种常见的前后端交互方式
  • 我们会使用 Spring Web 模块创建 HTTP 接口

3. 数据库:H2 Database(轻量级,适合学习)

  • 不需要额外安装,直接依赖即可
  • 内存中运行,重启数据会丢失,适合测试用

4. 注册中心 & 网关:Spring Cloud Netflix Eureka + Gateway

  • Eureka:服务注册与发现
  • Gateway:统一入口,路由请求到各个服务

✨添加 Maven 依赖示例(pom.xml):

<!-- Spring Boot Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- H2 Database -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

<!-- Eureka Client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

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

⚠️注意:别忘了在主类上加注解启用 Eureka 和 Gateway!


三、核心概念:这些术语听上去很酷,其实很简单!

数据库设计模型-1

三、核心概念:这些术语听上去很酷,其实很简单!

刚开始学微服务的同学最容易被一堆专业术语搞得一头雾水。下面我用最简单的方式解释几个最重要的概念:

1. 单体 vs 微服务

单体架构 微服务架构
所有代码在一个项目中 拆成多个小项目
部署一起更新 各自独立部署
出错影响整条链路 故障隔离,风险小

2. 服务注册与发现(Eureka)

想象一下你在一个公司里上班,新同事进来了,你咋知道他坐哪呢?肯定是去前台问:“XXX在哪?”

在微服务中,这个“前台”就是 Eureka Server。每个微服务启动后都会去注册自己,其他服务通过名字找到它。

3. API 网关(Gateway)

所有请求先经过网关,由它决定发给谁处理。有点像公司的保安:你找哪个部门?他说完电话帮你转接。

例如:

  • /user/** → User Service
  • /product/** → Product Service

4. 负载均衡(Load Balancing)

如果一个服务启动多个实例,网关或调用者要决定请求发给哪一个,这就是负载均衡。常见策略有轮询(round robin)、随机等。

5. 服务间通信(Feign / RestTemplate)

微服务之间如何互相调用?可以用 Feign 或 RestTemplate 发送 HTTP 请求,就像浏览器访问网页那样。


四、实战项目:手把手带你搭起第一个微服务系统

负载均衡配置-2

四、实战项目:手把手带你搭起第一个微服务系统

我们将用 Spring Boot + Spring Cloud 来搭建一个基础的微服务系统,包括:

  • 用户服务(User Service)
  • 产品服务(Product Service)
  • 注册中心(Eureka Server)
  • 网关服务(API Gateway)

第一步:创建 Eureka Server

1. 初始化一个 Spring Boot 项目

  • 项目名:eureka-server
  • 添加依赖:Eureka Server

2. 在 application.yml 中配置

server:
  port: 8761

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

3. 在主类加上注解

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

启动后访问:http://localhost:8761 查看服务注册情况。


第二步:创建 User Service

1. 创建 Spring Boot 项目

  • 名字:user-service
  • 依赖:Web, Eureka Client

2. 配置 application.yml

server:
  port: 8081

spring:
  application:
    name: user-service

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

3. 创建一个简单的 Controller

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

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

启动之后,在 Eureka 页面中可以看到 “user-service” 已注册。


第三步:创建 Product Service(结构相同)

application.yml:

server:
  port: 8082

spring:
  application:
    name: product-service

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

ProductController.java:

@RestController
@RequestMapping("/product")
public class ProductController {

    @GetMapping("/{id}")
    public String getProduct(@PathVariable String id) {
        return "Product ID: " + id;
    }
}

第四步:配置网关(Gateway)

1. 创建 gateway-service

  • 依赖:Gateway + Eureka Client

2. application.yml:

server:
  port: 8000

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-route
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1

        - id: product-route
          uri: lb://product-service
          predicates:
            - Path=/product/**
          filters:
            - StripPrefix=1

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

lb:// 表示负载均衡方式访问对应服务

测试访问:


五、常见问题答疑区(FAQ)

Q1:启动服务时报错说找不到 Eureka?

  • 答:请确保 Eureka Server 已启动,并检查端口是否为 8761

Q2:调用服务时报 404?

  • 答:确认服务名称是否正确(spring.application.name),网关路径是否有误

Q3:为什么要用网关?

  • 答:避免客户端直接对接很多服务,提高统一性和安全性,后续还可以做权限校验、限流等功能

Q4:如何查看已注册的服务?


六、学习建议:下一步该学啥?

恭喜你完成了第一个微服务项目的搭建!这是走向大型系统的第一步。接下来你可以继续深入以下几个方向:

学习路线建议:

阶段 学习内容 工具/框架
进阶阶段 服务容错(降级、熔断) Hystrix
实战增强 分布式事务 Seata、Saga 模式
性能优化 限流、负载均衡 Sentinel、Ribbon
安全保障 统一认证授权 Spring Security + OAuth2
日志追踪 分布式链路追踪 Sleuth + Zipkin
部署上线 容器化部署 Docker + Kubernetes

结语:迈出第一步,就是成功的一半!

学习微服务不是一蹴而就的过程,但只要你跟着一步步实践,就能慢慢掌握这个强大而实用的技术体系。

记住一句话:“微服务的核心,不在于技术本身,而在于如何合理划分业务边界。”

祝你在编程路上越走越远!如果你喜欢这种风格的教程,欢迎持续关注~

评论 0

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