Lecture01-SpringCloud-微服务架构与SCA生态

文章目录

    [toc]

    单词词性音标含义
    microservicen./ˈmaɪkrəʊˌsɜːvɪs/微服务(把一个大型应用拆成多个独立运行、独立部署的小服务)
    monolithicadj./ˌmɒnəˈlɪθɪk/单体应用(所有功能打包在同一个进程里)
    registryn./ˈredʒɪstri/注册中心(服务把自己注册进来、其他服务从这里发现它)
    discoveryn./dɪˈskʌvəri/发现(客户端从注册中心查到服务实例地址的过程)
    gatewayn./ˈɡeɪtweɪ/网关(系统统一入口,负责路由、鉴权、限流)
    confign./kənˈfɪɡ/配置(集中管理各服务的配置项,可动态刷新)
    resilientadj./rɪˈzɪliənt/有韧性的(系统在部分故障时仍能提供服务的能力)
    ecosystemn./ˈiːkəʊsɪstəm/生态(围绕一个平台的一系列组件、工具、规范的总和)

    Lecture01-SpringCloud-微服务架构与SCA生态

    目标:理解"为什么要微服务、微服务带来哪些新问题",认识 Spring Cloud Alibaba 生态全景与本课程技术栈版本,搭建统一的父工程骨架。

    1、从单体到微服务

    1、单体应用(Monolithic)

    传统开发把用户、商品、订单、库存等功能都放在同一个应用里,打包成一个 jar/war 部署:

    ┌─────────────────────── 单体应用 ───────────────────────┐
    │  Controller   │  Service   │  DAO   │  …全部在一个进程  │
    └───────────────────────┬──────────────────────┘
                            ▼
                      一个数据库 + 一个部署包
    

    优点:开发简单、部署简单、调试方便,适合小项目。

    痛点(业务变大后越来越明显):

    • 代码臃肿:几百万行挤在一个包里,改一处可能影响全部。
    • 部署耦合:改一个小功能要整体重新发布。
    • 扩展困难:只有某个模块流量大,却必须整机扩容。
    • 技术栈锁定:全项目只能用同一套语言/框架。

    2、微服务架构(Microservices)

    把单体应用按业务边界拆成多个独立进程,每个服务单独开发、单独部署、单独扩容:

             ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐
             │ 用户服务 │  │ 商品服务 │  │ 订单服务 │  │ 库存服务 │
             └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘
                  └─────────────┼────────────┘
                                ▼
                         (各自独立数据库)
    

    特点:服务独立部署、独立扩容、独立技术栈;服务间通过网络调用通信。

    模块之间存在两种关系:

    • 依赖:业务模块(用户、商品、订单、购物车……)依赖非业务模块(实体类、工具类、基础配置、AOP 切面……)
    • 调用:业务模块之间互相调用(订单模块调用用户模块获取用户的详细信息、订单模块调用商品模块获取商品详细信息……) 业务模块互相调用必须通过网络基于 HTTP 协议实现

    单一架构和分布式架构之间最核心的分水岭就是模块之间是否存在基于网络的相互调用;

    如果只是拆分模块,但是没有模块之间的远程相互调用,那就是伪分布式

    提问:分布式和微服务之间是什么关系?

    回答:分布式是一个大类,微服务是分布式的一种,微服务代表分布式的新技术;

    类比:分布式相当于汽车这个品类;微服务相当于新能源汽车这个品类

    提问:微服务和 SpringBoot 之间是什么关系?

    回答:一个 SpringBoot 工程基于服务器启动起来,就是一个微服务;

    具体来说『微服务』是一个理论概念,重点强调分布式架构中具体的每一个服务可以独立部署运行、小团队快速开发;

    Spring 公司开发的 SpringBoot 就是『微服务』这个理念最经典、最好、最优秀的具体产品实现

    提问:SpringBoot 和 SpringCloud 之间是什么关系?

    回答:SpringBoot 负责开发一个个具体的微服务,SpringCloud 负责微服务治理

    从环境搭建的角度来说,SpringCloud 需要基于 SpringBoot 提供的基础环境

    SpringBoot 可以不依赖 SpringCloud;但是 SpringCloud 必须依赖 SpringBoot

    SpringBoot 开发的一个微服务就像是一家公司;SpringCloud 是管理公司的ZF


    3、微服务带来的"四大新问题"

    拆完不等于完事,微服务引入了单体没有的麻烦:

    问题说明解决方案(对应组件)
    ① 服务之间怎么互相找到?实例地址动态变化,不能写死 IP服务注册与发现(Nacos)
    ② 配置散落各服务,怎么统一管?每个服务一堆配置,改起来麻烦配置中心(Nacos Config)
    ③ 服务之间怎么调用?HTTP 调用要写一堆模板代码OpenFeign + 负载均衡
    ④ 请求从哪个口进来、怎么统一收口?前端要记所有服务地址,权限散落网关(Gateway)

    此外还有容错(某服务挂了怎么办)→ Sentinel;分布式事务(跨服务扣库存+下单不一致)→ Seata。


    2、Spring Cloud Alibaba 生态全景

    Spring Cloud 是一套微服务开发的统一抽象模型;Spring Cloud Alibaba(SCA)是阿里巴巴基于这套模型提供的具体实现,组件都来自阿里巴巴真实生产实践。

    microservice-arch

    组件作用本课程
    RestTemplate最基础的 HTTP 直连调用(Spring 自带,非 SCA 组件)实操(L02)
    Nacos服务注册与发现 + 配置中心(一站式)实操(L03/L04)
    OpenFeign声明式 HTTP 服务调用实操(L05)
    LoadBalancer客户端负载均衡实操(L06)
    Gateway统一网关入口实操(L07)
    Sentinel限流、熔断、降级概念(L09)
    Seata分布式事务概念(L10)

    关键词记忆:"注册靠 Nacos、调用靠 Feign、均衡靠 LB、收口靠 Gateway、防护靠 Sentinel、一致靠 Seata"。


    3、技术栈与版本对应

    本课程按官方版本说明确定版本基线(与 Redis 课 SpringBoot 4 一致):

    组件版本说明
    JDK21(最低 17)Spring Boot 4 基线要求
    Spring Boot4.0.x本班已学
    Spring Cloud2025.1.x适配 Spring Boot 4.0.x/4.1.x
    Spring Cloud Alibaba2025.1.0.0适配 Spring Boot 4.0.x / Spring Cloud 2025.1.x
    Nacos / Sentinel / Seata3.1.x / 1.8.9 / 2.5.0SCA 2025.1.0.0 对应组件版本

    容易踩坑:版本必须配套。Spring Boot 4 只能用 Spring Cloud 2025.1.x + SCA 2025.1.x;Spring Boot 3.5 才是 SCA 2025.0.x。别混搭,否则启动报错。


    4、搭建统一父工程(Maven)

    微服务通常是多模块工程:一个父 pom 统一管版本,下面多个子服务模块。

    1、父工程 pom(聚合 + 依赖管理)

    <?xml version="1.0" encoding="UTF-8"?>
    <project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example</groupId>
        <artifactId>cloud-parent</artifactId>
        <version>1.0.0</version>
        <packaging>pom</packaging>
    
        <!-- 统一 Spring Boot 版本 -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>4.0.0</version>
            <relativePath/>
        </parent>
    
        <!-- 统一管理 Spring Cloud / SCA 依赖版本 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>2025.1.2</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>2025.1.0.0</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <modules>
            <module>user-service</module>
            <module>order-service</module>
            <!-- …后续章节逐个添加 -->
        </modules>
    </project>
    

    原理:dependencyManagement 只锁定版本、不引入依赖;子模块用到哪个组件就显式写 <dependency>(不写版本号)。


    2、一个最小子服务(user-service)

    <!-- user-service/pom.xml -->
    <project>
        <parent>
            <groupId>com.example</groupId>
            <artifactId>cloud-parent</artifactId>
            <version>1.0.0</version>
        </parent>
    
        <artifactId>user-service</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    </project>
    
    # user-service/src/main/resources/application.yml
    server:
      port: 8081
    
    spring:
      application:
        name: user-service
    
    @SpringBootApplication
    public class UserServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserServiceApplication.class, args);
        }
    }
    

    启动后访问 http://localhost:8081 即可。


    5、课堂练习

    1. 在你的虚拟机确认 JDK、Maven 版本:java -version、mvn -version。
    2. 照着第四节搭一个 cloud-parent 父工程 + user-service 子模块,成功启动并访问 8081。
    3. 说明:为什么 dependencyManagement 里 Spring Cloud 和 SCA 的版本必须配套?(提示:与 Spring Boot 4 的对应关系)

    6、本讲小结

    • 微服务把单体按业务拆成独立进程,带来注册发现、配置、调用、网关四大问题。
    • Spring Cloud Alibaba 用 Nacos / OpenFeign / LoadBalancer / Gateway / Sentinel / Seata 一一解决。
    • 版本必须配套:Spring Boot 4.0.x ↔ Spring Cloud 2025.1.x ↔ SCA 2025.1.x。
    • 父工程 dependencyManagement 统一管版本,子服务显式引依赖。

    7、本节验证

    • 说出单体 vs 微服务的区别及微服务带来的"四大新问题" ✅
    • 说出 Spring Cloud Alibaba 生态核心组件(Nacos/OpenFeign/Gateway/Sentinel/Seata)各自解决什么问题 ✅
    • 掌握技术栈与版本对应关系 ✅
    • 会搭建统一父工程(聚合 + 依赖管理),创建最小子服务 ✅
    end