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

码上见山
2025-06-15 18:27
阅读 665

开篇:什么是微服务?它能做什么?

开篇:什么是微服务?它能做什么?

在软件开发的世界里,随着业务越来越复杂,传统的“单体应用(Monolithic Application)”会变得臃肿、难以维护。比如一个电商系统,原本只是一个简单的购物网站,后来功能越来越多——用户注册登录、商品管理、订单处理、支付、物流追踪、评论系统……如果这些功能都写在一个程序里,改一个小功能都可能牵一发而动全身。

这时候,“微服务架构(Microservices Architecture)”就应运而生了。你可以把它理解成:把一大锅汤分成多个小碗,每碗只装一种食材,需要哪个拿哪个,互不干扰。

微服务的特点是:

  • 每个服务独立运行
  • 每个服务有自己数据库
  • 服务之间通过网络通信(通常是 HTTP 或消息队列)
  • 可以用不同技术栈实现不同的服务

微服务适合中大型项目,尤其是需要高可用性、可扩展性的系统,如电商平台、在线教育平台、金融风控系统等。


环境准备:搭建你的微服务开发环境

环境准备:搭建你的微服务开发环境

我们要用 Spring Boot + Spring Cloud Alibaba 来演示如何构建微服务系统。

安装清单:

  1. JDK 17(推荐使用 OpenJDK)
  2. IntelliJ IDEA(社区版即可)
  3. Maven(版本 >= 3.6)
  4. Nacos Server(用于服务注册与配置中心)

安装步骤:

✅ Step 1: 安装 JDK 17

官网下载 并安装 Java 17,配置 JAVA_HOME 环境变量,终端输入以下命令确认:

java -version

✅ Step 2: 下载并安装 IntelliJ IDEA

前往 JetBrains官网 下载社区版 IDE,解压后双击启动。

✅ Step 3: 配置 Maven

下载 Maven,解压,设置 MAVEN_HOMEPATH。测试是否安装成功:

mvn -v

在 IntelliJ 中导入 Maven 项目时,记得选择你本地的 Maven 路径。

✅ Step 4: 启动 Nacos 服务

Nacos 是阿里巴巴开源的服务发现和配置管理工具。

  1. 下载地址:GitHub Release
  2. 解压后进入 bin 目录,执行以下命令:
    startup.cmd -m standalone    # Windows
    sh startup.sh -m standalone  # Linux / Mac
    
  3. 打开浏览器访问 http://localhost:8848/nacos,默认账号密码为 nacos/nacos

现在你的开发环境已经准备好啦!


核心概念:用最简单的话讲明白关键点

核心概念:用最简单的话讲明白关键点

下面是几个你在学习微服务过程中必须掌握的核心概念:

🔹1. 服务注册与发现(Service Registration & Discovery)

每个微服务启动之后都要告诉一个地方:“我上线啦,我的IP是 xxx.xxx.xxx.xxx,端口是 8080,可以调我!”

这个“地方”就是注册中心(如 Nacos、Eureka)

✨打个比方:

就像你们公司要组织旅游,谁参加都要先去行政部登记姓名和手机号。行政部就成了“注册中心”。

代码示例(Spring Cloud Alibaba + Nacos):

# 在 application.yml 中添加:
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

然后加上注解:

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

启动后,服务会自动注册到 Nacos 控制台里。


🔹2. 负载均衡(Load Balancer)

当很多用户同时请求某个服务时,我们需要多个实例来分担压力。负载均衡器的作用就是决定请求该由哪一个实例处理。

✨打个比方:

学校食堂窗口排长队,来了三个阿姨炒菜,谁有空就去谁那里排队,这就是负载均衡。

Spring Cloud 默认使用 Ribbon 做负载均衡。

示例:使用 RestTemplate 实现客户端调用(自动负载均衡):

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

@Autowired
private RestTemplate restTemplate;

public String callOrderService() {
    return restTemplate.getForObject("http://order-service/api/order", String.class);
}

上面的 order-service 就是服务名,Ribbon 会在 Nacos 中查找所有 order-service 的实例,并自动选择一个发起请求。


🔹3. 网关(API Gateway)

网关就像是整个系统的入口,所有的请求都要先经过它。它可以做统一鉴权、限流、路由等功能。

✨打个比方:

网关就像公司的前台小姐姐,你要进来办事之前,她要检查你是谁,要去哪个部门。

常用的网关框架是 Spring Cloud GatewayZuul

网关配置示例(application.yml):

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**

这样 /api/user/** 的请求就会被转发给 user-service。


🔹4. 分布式配置中心(Config Center)

以前修改配置文件要重启服务,现在可以通过远程配置中心动态加载配置。

✨打个比方:

就像家里换了WiFi密码,全家人都不用重新买路由器,只要更新一下手机设置。

Nacos 支持作为配置中心,配置如下:

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        extension-configs:
          - data-id: user-service.yaml
            group: DEFAULT_GROUP
            refresh: true

在 Nacos 中添加配置项后,应用重启或触发刷新后会自动获取新配置。


实战项目:从零开始打造一个“用户+订单”的微型电商系统

实战项目:从零开始打造一个“用户+订单”的微型电商系统

负载均衡配置-2

我们将创建两个微服务:

  • User Service(用户服务)
  • Order Service(订单服务)
  • 使用 Nacos 做服务注册与配置中心
  • 使用 Gateway 做统一 API 入口

🛠️ Step 1: 创建 User Service

创建一个 Spring Boot 项目,添加依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

API接口文档-1

添加 controller:

@RestController
@RequestMapping("/api/user")
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
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

启动后,在 Nacos 控制台可以看到注册的服务。


🛠️ Step 2: 创建 Order Service

结构类似,只是换掉 controller 内容:

@RestController
@RequestMapping("/api/order")
public class OrderController {
    @GetMapping("/{id}")
    public String getOrderById(@PathVariable Long id) {
        return "Order ID: " + id;
    }
}

application.yml:

server:
  port: 8082
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

此时已有两个服务注册成功。


🛠️ Step 3: 创建 Gateway 网关服务

添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置 application.yml:

server:
  port: 8090
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: user-route
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
        - id: order-route
          uri: lb://order-service
          predicates:
            - Path=/api/order/**

启动后访问:

  • http://localhost:8090/api/user/1
  • http://localhost:8090/api/order/2

应该分别返回对应的结果,说明一切正常。


常见问题解答(FAQ)

❓Q1:为什么服务没有注册到 Nacos?

✅常见原因及解决方案:

  • 检查 spring.cloud.nacos.discovery.server-addr 是否正确
  • 检查 Nacos 是否已启动(http://localhost:8848 是否能打开)
  • 查看控制台日志,是否有报错信息(如连接超时)

❓Q2:调用服务时报“UnknownHostException”怎么办?

✅可能是服务名写错了,或者是服务未注册,检查:

  • 服务名称是否和 spring.application.name 一致
  • 服务是否确实注册到了 Nacos
  • 是否添加了 @EnableDiscoveryClient 注解

❓Q3:RestTemplate 怎么才能做负载均衡?

✅确保做了以下三点:

  • 添加了 @LoadBalanced 注解
  • 引入了 Ribbon 或 LoadBalancer Starter
  • 正确使用服务名而不是 IP 地址调用

例如:

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

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

掌握了基础微服务架构之后,建议继续深入以下几个方向:

🔸1. 服务熔断与降级(Hystrix or Sentinel)

避免因为某一个服务崩溃导致整个系统不可用。

推荐学习:Sentinel(阿里巴巴出品)


🔸2. 链路追踪(Sleuth + Zipkin)

当系统中有几十上百个服务时,定位问题是困难的。链路追踪可以帮你清晰看到请求经过了哪些服务。


🔸3. 安全认证(Spring Security + OAuth2)

保护接口免受非法访问,控制权限范围。


🔸4. 自动化部署(Docker + Kubernetes)

将你的微服务打包成镜像,使用 Kubernetes 管理集群部署。


🧠学习路线图:

单体架构 → RESTful API 设计 → Spring Boot 构建服务 → Nacos 注册中心
↓
微服务入门 → 负载均衡 → 网关路由 → 配置中心
↓
进阶 → 熔断降级 → 链路追踪 → 安全认证 → 容器化部署

🎯结语

微服务不是银弹,也不是一开始就要上。它是解决复杂系统的一种有效方式。本教程带你从零开始,一步步搭建了一个简单的微服务架构,希望你能从中获得信心,继续深入探索更大的世界!

如果你喜欢这篇教程,也欢迎收藏、点赞、留言提问,我们一起成长!


📌文末彩蛋:
想要完整的项目源码?可以在 GitHub 上新建一个项目仓库,我们下次详细讲解怎么上传和分享项目。

关注公众号【Java攻城狮日记】,回复“微服务实战”领取完整工程模板。

评论 0

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