跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Cloud 微服务架构概述与工程搭建实战

从单体架构到微服务,系统经历了分布式拆分与服务治理的演变。梳理了不同架构的特点与差异,对比了 Spring Cloud Netflix 与 Alibaba 的技术选型,并演示了基于 Maven 多模块工程的初始化流程,包括依赖管理、数据库初始化及服务启动配置,为构建 Spring Cloud 微服务项目奠定基础。

山野来信发布于 2026/3/25更新于 2026/10/2480 浏览
Spring Cloud 微服务架构概述与工程搭建实战

Spring Cloud 架构图

1. 系统架构的演进

1.1 单体架构

所谓单体,就是把所有功能模块(用户、订单、支付等)打包在一个进程中,共用一个数据库。

单体架构示意图

优势很明显:

  • 技术栈统一:开发、测试、部署流程简单。
  • 初期开发快:模块间直接调用,沟通成本低。
  • 性能高:本地方法调用,无网络开销。
  • 部署单一:只需维护一个应用实例。

但随着业务增长,缺点也暴露无遗:

  • 代码复杂度高:库变得庞大且耦合严重,难以维护。
  • 技术栈固化:引入新框架或语言困难。
  • 扩展性差:无法针对特定模块独立伸缩,只能整体扩容,成本高。
  • 部署风险大:任何微小修改都需重新构建整个应用,上线慢且风险高。
  • 可靠性隐患:单个模块 Bug 可能导致整个系统崩溃。

1.2 集群与分布式架构

为了解决单点故障和性能瓶颈,我们开始拆分。

  • 分布式:按业务维度将单体拆分成多个独立子系统,部署在不同服务器上,通过网络协作。本质是'拆分'。
  • 集群:将相同的单体应用部署在多台服务器上,通过负载均衡对外服务。本质是'复制'。

分布式与集群对比

带来的好处:

  • 高可用与高性能:负载均衡分担压力,故障可转移。
  • 初步解耦:物理分离,技术栈可按需选择。
  • 数据库优化:支持分库分表、读写分离。

代价也不小:

  • 治理复杂:需要管理服务地址、调用关系、负载均衡策略。
  • 通信不可靠:网络调用面临超时、重试、断连等问题。
  • 数据一致性难保:从单机数据库变为分布式,事务处理变难。
  • 运维压力大:成百上千的服务实例,监控、日志、配置收集都变得繁琐。

1.3 微服务架构

微服务是分布式架构的更精细实践,强调将应用拆分为一组微小、自治的服务。

微服务架构

注意区分:分布式侧重压力分散,微服务侧重能力分散与专业化分工。

2. Spring Cloud 概览

2.1 三者关系

  • 微服务:是一种架构思想,强调拆分,但本身不提供工具落地。
  • Spring Cloud:提供了一套构建微服务的标准解决方案,涵盖服务发现、远程调用、负载均衡、配置管理、API 网关等核心组件。
  • Spring Boot:构建单个微服务的基础框架,通过自动配置、起步依赖快速创建独立运行的应用。

2.2 技术选型

Spring Cloud 是一套规范,具体实现主要有以下几种方案:

组件角色Spring Cloud NetflixSpring Cloud AlibabaSpring Cloud 官方原生
服务发现EurekaNacosConsul / Zookeeper
负载均衡RibbonRibbon / Spring Cloud LoadBalancerSpring Cloud LoadBalancer
远程调用FeignFeign / RestTemplateOpenFeign
熔断降级HystrixSentinelResilience4j
API 网关Zuul 1.xSpring Cloud GatewaySpring Cloud Gateway
配置中心Spring Cloud ConfigSeataSpring Cloud Config / Consul / Nacos

站在 Java 视角类比,Spring Cloud 像是一堆 Interface,而 Netflix 和 Alibaba 则是不同的实现类。

2.3 版本对应

建议参考官方文档获取最新稳定版信息:

  • Spring Cloud
  • Spring Cloud Alibaba

3. 父子工程搭建实战

3.1 项目结构

典型的 Maven 多模块结构如下:

项目结构

3.2 依赖管理与 POM 解析

父工程 (spring-cloud-blog)

父工程主要职责是统一管理版本,不引入具体业务依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>spring-cloud-blog</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>modules</module>
    </modules>
    
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <java.version>17</java.version>
        <mybatis.version>3.0.3</mybatis.version>
        <mysql.version>8.0.33</mysql.version>
        <spring-cloud.version>2025.0.0</spring-cloud.version>
        <spring-cloud-alibaba.version>2025.0.0.0</spring-cloud-alibaba.version>
        <spring-boot.version>3.5.0</spring-boot.version>
        <common-core.version>1.0-SNAPSHOT</common-core.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringBoot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- MyBatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- MySQL 驱动 -->
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <version>${mysql.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

关键点说明:

  • properties:全局变量定义区,集中管理重复配置值,方便后续引用 ${variable}。
  • dependencyManagement:Maven 依赖版本管理中心。这里只管理版本号,不实际引入依赖。子模块继承后,引入相关组件时无需再写 <version>。
  • BOM 导入:type=pom 且 scope=import 表示将外部 POM 文件中的依赖列表导入当前项目的版本管理。这样做的目的是采用 Spring Cloud 官方 BOM 作为版本基准,确保所有组件版本一致,避免冲突。
子模块 (modules)

子模块继承父 POM,负责具体的业务依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 继承父 POM -->
    <parent>
        <groupId>org.example</groupId>
        <artifactId>spring-cloud-blog</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <artifactId>modules</artifactId>
    <packaging>pom</packaging>
    
    <modules>
        <module>order-service</module>
        <module>product-service</module>
    </modules>
    
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>core</artifactId>
            <version>${common-core.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

3.3 构建数据模型

在 core 模块下定义订单和商品的实体类,使用 Lombok 简化代码。

@Data
public class OrderInfo {
    private Integer id;
    private Integer userId;
    private Integer productId;
    private Integer num;
    private Integer price;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
    private ProductInfo productInfo;
}
@Data
public class ProductInfo {
    private Integer id;
    private String productName;
    private Integer productPrice;
    private Integer status;
    private Date createTime;
    private Date updateTime;
}
初始化数据库

我们需要准备两张表,分别对应订单服务和产品服务。

-- 订单服务数据库
create database if not exists cloud_order charset utf8mb4;
use cloud_order;
drop table if exists order_detail;
create table order_detail (
    `id` int primary key auto_increment comment '订单 id',
    `user_id` bigint(20) not null comment '用户 ID',
    `product_id` bigint(20) null comment '产品 id',
    `num` INT(10) null default 0 comment '下单数量',
    `price` bigint(20) not null comment '实付款',
    `delete_flag` tinyint(4) null default 0,
    `create_time` datetime default now(),
    `update_time` datetime default now()
);
insert into order_detail (user_id, product_id, num, price)
values (2001, 1001, 1, 99), (2002, 1002, 1, 30), (2001, 1003, 1, 40),
       (2003, 1004, 3, 58), (2004, 1005, 7, 85), (2005, 1006, 7, 94);

-- 产品服务数据库
create database if not exists cloud_product charset utf8mb4;
use cloud_product;
drop table if exists product_detail;
create table product_detail (
    `id` int primary key auto_increment comment '产品 id',
    `product_name` varchar(128) null comment '产品名称',
    `product_price` bigint(20) not null comment '产品价格',
    `state` tinyint(4) null default 0 comment '产品状态 0-有效 1-下架',
    `create_time` datetime default now(),
    `update_time` datetime default now()
);
insert into product_detail (id, product_name, product_price, state)
values (1001, "T 恤", 101, 0), (1002, "短袖", 30, 0), (1003, "短裤", 44, 0),
       (1004, "卫衣", 58, 0), (1005, "马甲", 98, 0), (1006, "羽绒服", 101, 0),
       (1007, "冲锋衣", 30, 0), (1008, "袜子", 44, 0), (1009, "鞋子", 58, 0),
       (10010, "毛衣", 98, 0);

3.4 配置文件编写

订单服务 (application.yml)
server:
  port: 8000
spring:
  application:
    name: order-service
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    configuration:
      map-underscore-to-camel-case: true # 自动驼峰转换
商品服务 (application.yml)
server:
  port: 9000
spring:
  application:
    name: product-service
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    configuration:
      map-underscore-to-camel-case: true

3.5 启动项目

子服务会继承父工程的依赖。创建对应的启动类即可运行。

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

至此,基础的微服务工程骨架已搭建完成,后续可以在此基础上接入注册中心、配置中心等组件。

目录

  1. 1. 系统架构的演进
  2. 1.1 单体架构
  3. 1.2 集群与分布式架构
  4. 1.3 微服务架构
  5. 2. Spring Cloud 概览
  6. 2.1 三者关系
  7. 2.2 技术选型
  8. 2.3 版本对应
  9. 3. 父子工程搭建实战
  10. 3.1 项目结构
  11. 3.2 依赖管理与 POM 解析
  12. 父工程 (spring-cloud-blog)
  13. 子模块 (modules)
  14. 3.3 构建数据模型
  15. 初始化数据库
  16. 3.4 配置文件编写
  17. 订单服务 (application.yml)
  18. 商品服务 (application.yml)
  19. 3.5 启动项目

更多推荐文章

查看全部
  • RocketMQ 核心设计:消息存储架构解析
  • Hunyuan-MT-7B-WEBUI 企业级翻译部署与实战
  • Java 面试题及答案(208 道)
  • 线性 DP 五大经典模型:LIS、LCS、合唱队形、编辑距离详解
  • 基于 Docker 部署 One API 进行大模型接口管理与 Key 分发
  • Kafka vs RabbitMQ:消息中间件选型指南与 Java 代码实战
  • 15 款互联网行业必备 AI 工具深度评测与推荐
  • C++ STL 进阶:unordered_set 与 unordered_map 用法及底层模拟
  • C++ 类型转换与 IO 流核心解析
  • OpenAI Whisper 语音转文字完全使用指南
  • Python 兼职指南:常见接单类型与主流平台推荐
  • Java 智能开发工具解析:从代码生成到架构重塑
  • Qwen3-VL WEBUI 环境配置与部署实战
  • 闲置 Mac Mini 部署 OpenClaw 实现金融 AI 分析助手
  • Python 调用 IPIDEA API 实现 eBay 商品数据自动化采集
  • Python 机器人避障算法实战:掌握 5 种核心算法与智能路径规划
  • 30 岁程序员转行大模型:可行性分析与职业转型建议
  • RK3588 开发板 Android13 下解决 QGC 应用 APK 打包问题
  • GitHub Actions 下载工件指南:download-artifact 插件使用详解
  • 硬件开发中的 AI 工具:Schematik 与 Quilter 对比

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online