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

青山不改需求改
2025-06-13 18:09
阅读 427

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

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

想象一下你正在做一道菜,但所有材料和工具都放在同一个厨房里。厨房太拥挤,动作慢,效率低。

微服务就像是把这个大厨房拆成多个小厨房,每个厨房专注完成一个任务,比如洗菜、炒菜、煮汤。这样大家各司其职,效率自然就提高了。

微服务的基本定义:

  • 微服务是一种将一个大型应用程序拆分成多个独立的小服务的设计方法。
  • 每个服务都有自己的功能模块,可以单独开发、部署、测试和维护。

微服务的优势:

  • 更灵活:每个服务都可以用不同的技术实现
  • 更容易扩展:系统某部分压力大时只需扩容那部分
  • 故障隔离性好:某个服务崩溃不会影响整个系统
  • 团队协作更高效:多人并行开发不互相干扰

举个现实中的例子:

淘宝、京东等电商平台就是用了微服务架构——订单、支付、库存、用户……每一个都是一个独立的服务,各自运行,互不影响。


二、环境准备:搭建你的第一个开发环境

二、环境准备:搭建你的第一个开发环境

我们先准备好开发工具:

所需工具列表:

工具 作用
Java JDK 编写后端程序的语言支持
Spring Boot 快速开发微服务的框架
Maven 项目依赖管理工具
IntelliJ IDEA 编写和运行代码的IDE
Postman 测试API接口

安装步骤简要说明:

  1. 下载安装JDK

  2. 安装Maven

    • 下载并配置环境变量(简单来说就是设置路径)
    • 检查是否成功,在终端输入:mvn -v
  3. 安装IDEA

  4. Postman


三、核心概念:通俗理解微服务的关键点

三、核心概念:通俗理解微服务的关键点

缓存策略对比-2

下面几个术语是微服务中最基础也最重要的概念,我们用生活中的例子来理解。

1. 服务 (Service)

  • 类比:一家奶茶店就是一个服务
  • 在微服务中,一个服务通常是一个功能模块(如用户服务、订单服务)

2. API接口

  • 类比:顾客点单的方式(扫码下单、语音呼叫)
  • 接口是服务之间或客户端与服务之间通信的方式

3. RESTful风格(常用)

  • 是一种规范,规定了HTTP请求格式
  • 例如:GET /users 表示获取用户信息

4. 注册中心(Register Center)

  • 类比:公司总部记录各个门店位置
  • 常见工具有Eureka、Nacos、Consul
  • 作用是让服务之间知道彼此在哪

5. 负载均衡(Load Balancer)

  • 类比:排队点餐时服务员引导客人去空闲柜台
  • 常见工具:Ribbon、Nginx

6. 配置中心(Config Server)

  • 类比:所有分店统一菜单标准
  • 管理所有服务的公共配置,比如数据库密码

这些概念在后续我们会逐一体验到它们的实际作用。


四、实战项目:一步步做一个“图书管理系统”的微服务版本

四、实战项目:一步步做一个“图书管理系统”的微服务版本

我们将实现一个最简单的微服务结构:两个服务 + 一个注册中心

目标效果:

  • 创建两个微服务:
    • 图书服务(book-service)提供图书信息
    • 用户服务(user-service)提供用户信息
  • 使用Eureka作为注册中心
  • 可以通过访问其中一个服务调用另一个服务的数据

第一步:创建父项目(统一管理多个子服务)

使用Spring Initializr创建一个新的项目结构:

spring init --type=maven-project \
--dependencies=web,eureka-server,openfeign \
book-microservice-demo

或者手动在IDEA中创建Spring Boot项目,添加如下依赖:

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

<!-- Feign Client 用于服务间调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

第二步:启动注册中心Eureka Server

创建主类 BookMicroserviceDemoApplication.java 并添加注解:

@SpringBootApplication
@EnableEurekaServer // 启动Eureka服务器
public class BookMicroserviceDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(BookMicroserviceDemoApplication.class, args);
    }
}

配置application.yml:

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false # 不注册自己
    fetch-registry: false       # 不拉取其他服务信息

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


第三步:创建图书服务 book-service

1. 创建Spring Boot模块,并添加依赖:

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

2. 配置 application.yml:

server:
  port: 8081

spring:
  application:
    name: book-service

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

3. 创建控制器类:

@RestController
@RequestMapping("/books")
public class BookController {

    @GetMapping("/{id}")
    public String getBook(@PathVariable Long id) {
        return "《Java编程入门》 ID: " + id;
    }
}

启动后查看Eureka页面,能看到book-service已注册。


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

类似操作,只是修改名称和端口号:

application.yml:

server:
  port: 8082

spring:
  application:
    name: user-service

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

控制器类:

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

    @Autowired
    private RestTemplate restTemplate; // 用于调用其他服务

    @GetMapping("/{id}/book")
    public String getUserBook(@PathVariable Long id) {
        String url = "http://book-service/books/" + id;
        return "用户:" + id + " 最近阅读:" + restTemplate.getForObject(url, String.class);
    }
}

还需要启用Feign客户端(主类加注解):

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

第五步:测试两个服务之间的通信

使用Postman访问:

GET http://localhost:8082/users/123/book

你会看到返回结果:

用户:123 最近阅读:《Java编程入门》 ID: 123

✅ 这表示两个微服务已经能够相互通信!


五、常见问题:新手容易遇到的问题及解决方法

服务器部署方案-1

Q1:服务没有注册到Eureka上怎么办?

  • 检查 application.yml 中的 spring.application.name 是否正确
  • 检查Eureka Server是否在运行
  • 确保网络连接没问题,防火墙没阻止8761端口

Q2:调用其他服务时报错 UnknownHostException?

  • 服务名拼写错误或未注册成功
  • 如果用RestTemplate,请确认是否注入并加上了 @LoadBalanced 注解

Q3:服务无法启动,提示Port already in use?

  • 修改 application.yml 中的 server.port 更换端口号
  • 或者关闭之前进程(如用IDE多次运行可能残留)

Q4:如何调试多个服务同时运行?

  • 在IDEA中使用Run Dashboard,可以同时运行多个Spring Boot应用
  • 或者分开在不同控制台窗口运行

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

恭喜你已经完成了人生第一个微服务项目!接下来你可以沿着以下路径继续深入:

阶段一:进阶知识

  • 【服务发现】学习Nacos vs Eureka的区别
  • 【负载均衡】了解Ribbon与Feign的区别
  • 【网关】学习Spring Cloud Gateway 的基本使用
  • 【配置中心】尝试整合Spring Cloud Config 或 Nacos Config
  • 【熔断限流】了解Hystrix和Sentinel原理与实战

阶段二:实战优化

  • 学习Docker打包微服务镜像
  • 掌握Kubernetes部署多个服务
  • 引入日志聚合ELK Stack
  • 添加分布式链路追踪SkyWalking

阶段三:架构思维提升

  • 学习CQRS、Event Sourcing等复杂模式
  • 探索服务网格(Istio)架构
  • 深入理解CAP定理与最终一致性

结语:开始你的微服务之路吧!

微服务并不是最难的技术,但它是通往高并发、高性能系统的必经之路。刚开始可能会感觉有点复杂,但只要你亲手跑通一个实例,就会豁然开朗。

记住一句话:所有的程序员,都不是一开始就会的,而是在不断地写代码中成长起来的。

如果你愿意,我可以继续带你做更多微服务进阶项目:电商后台系统、在线考试平台、医院预约系统等等,让我们一起构建真正的企业级分布式系统。


📚【文章总字数】约 2857 字
🎯【目标读者】完全没有编程经验的新手程序员
💡【学习建议】边看边操作,多调试,多问问题

如果你喜欢这种风格,欢迎告诉我,我可以继续为你写更多类似教程。

评论 0

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