Skip to content

SpringCloud


一、跳转链接




  • Spring Cloud Alibaba 系列:

二、分布式概念基础


2.1 微服务


  • 微服务架构风格,就像是把一个 单独的应用程序 开发为 一套小服务 , 每个 小服务 运行在 自己

    的 进程 中, 并使用轻量级机制通信, 通常是 HTTP API 。这些服务围绕业务能力来构建,并通过

    完全自动化部署机制来独立部署。这些服务 可使用不同的编程语言去编写,已经不同的数据存储技术,

    并保持最低限度的集中式管理


2.2 集群&分布式&节点


只要是一群机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;

《分布式系统原理与范型》定义:

  • “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
  • 分布式系统(distributed system) 是建立在网络之上的软件系统

  • " 分布式 是指将 计算任务或数据 分布在不同的节点上协同完成"
  • " 集群 指的是 多台服务器逻辑上组成一个整体,对外提供 相同的服务 "

  • 例如:京东是一个分布式系统,众多业务运行在不同的机器 ,所有业务构成一个大型的 业务集群

    每一个小的业务,比如 用户系统 ,访问压力大的时候,一台服务器是不够的。我们就应该将用户系统

    部署到多个服务器,也就是 每一个业务系统也可以做集群化

txt
┌─────────────────────────────────────────────────────────┐
│                    京东整体架构                           │
│              (这是一个分布式系统)                        │
├─────────────────────────────────────────────────────────┤
│                                                         │
│   ┌─────────────┐    ┌─────────────┐    ┌───────────┐   │
│   │  用户服务    │◄───│  订单服务    │◄───│  库存服务  │   │
│   │  (User)     │    │  (Order)    │    │ (Stock)   │   │
│   └──────┬──────┘    └─────────────┘    └───────────┘   │
│          │                                              │
│          ▼                                              │
│   ┌─────────────┐  ← 这个"节点"本身又是集群               │
│   │  用户服务集群 │    (3台服务器,负载均衡)              │
│   │ [U1][U2][U3] │                                      │
│   └─────────────┘                                       │
│                                                         │
│   分布式:User/Order/Stock 之间是分布式的(不同业务)       │
│   集群:U1/U2/U3 之间是集群的(相同业务)                   │
│                                                         │
└─────────────────────────────────────────────────────────┘

  • 节点:集群中的一个服务器

2.3 远程调用


  • 远程调用( 远程过程调用 Remote Procedure Call : RPC

  • 在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用

    我们称为远程调用。SpringCloud 中使用 HTTP + JSON 的方式完成远程调用

  • 在远程调用中,我们直接使用的工具是 SpringCloud OpenFeign

微信截图_20260310123043

2.4 负载均衡


  • 分布式系统中,A 服务需要调用 B 服务, B 服务在多台机器中都存在,A 调用任意一个服务器均可完成功能。

    为了使每一个服务器都不要太忙或太闲,我们可以 负载均衡 的调用每一个服务器,提高网站的健壮性。


常见的负载均衡算法

  • 1). 轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,

    直到最后一个,然后循环回来第一个继续轮询 ...

  • 2). 最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式

  • 3). 散列:根据请求源的 IP 的散列( hash )来选择要转发的服务器。这种方式可以

    一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求

    用户能连接到和之前相同的服务器可以采取这种方式

微信截图_20260310213046

2.5 服务注册/发现 & 注册中心


  • A 服务调用 B 服务,A 服务并不知道 B 服务当前在哪几台服务器有,哪些正常的,哪些服务已经

    下线了。为了解决这个问题可以引入注册中心;

微信截图_20260310215652

2.6 配置中心


  • 每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上,我们经常

    需要变更配置,我们可以让每个服务在配置中心获取自己的配置。

  • 配置中心用来集中管理微服务的配置信息

微信截图_20260310213630

2.7 服务熔断&服务降级


  • 在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,

    有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。

微信截图_20260310213945
  • 1). 服务熔断:设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,

    后来的请求不再去调用这个服务。本地直接返回默认的数据

  • 2). 服务降级:在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。

    降级:某些服务不处理或简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】


2.8 API 网关


  • 在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,

    同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等

    丰富的功能,帮助我们解决很多 API 管理的难题。

微信截图_20260310214528

版本选择


微信截图_20260310215611

Nacos


【2.xx】安装


  • Nacos ( /nɑ:kəʊs/ ) 是 Dynamic Naming and Configuration Service 的首字母简称,

    一个更易于构建云原生应用的 动态服务发现、配置管理和服务管理平台

  • 官网:https://nacos.io/docs/next/quickstart/quick-start/

  • 安装:

    • 下载安装包:【2.4.3】
    • 启动命令:startup.cmd -m standalone

【3.xx】安装



  • /nacos/bin 目录下 cmd 输入命令 startup.cmd -m standalone 启动(standalone 单机模式,非集群模式)

  • 随后启动程序会提示您输入 3个 鉴权相关配置

    (Nacos 从 3.0.0 版本开始默认启用控制台鉴权功能,因此如下 3 个鉴权相关配置必须填写)如下所示:

shell
`nacos.core.auth.plugin.nacos.token.secret.key` is missing, please set with Base64 string: ${your_input_token_secret_key}
nacos.core.auth.plugin.nacos.token.secret.key` Updated:
----------------------------------
`nacos.core.auth.server.identity.key` is missing, please set: ${your_input_server_identity_key}
`nacos.core.auth.server.identity.key` Updated:
----------------------------------
`nacos.core.auth.server.identity.value` is missing, please set: ${your_input_server_identity_key}
`nacos.core.auth.server.identity.value` Updated:
----------------------------------
  • 给它设置一个值。官方要求这个值 必须大于等于 32 个字符,如下官方示例的 Base64 密钥
shell
VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
  • 三个都设置好后就会自动启动了 ...

  • 然后地址栏输入 :
txt
http://localhost:8080/
  • 会重定向到:
txt
http://localhost:8080/next/#/register
  • 在这个页面设置好初始化密码,用户名是 nacos
  • 然后会重定向到 :
txt
http://localhost:8080/next/#/login
  • 输入用户名nacos 和刚刚设置的密码就能登录

  • 可以发现 3.x 引入了全新现代化的 UI 设计,主要采用了 React 19 + TypeScript + Vite + Tailwind CSS + Shadcn/ui 的现代前端架构不再是 2.x 那种相对老旧、统一的 Fusion Design 风格 ,

    新增大量 AI 功能 ( MCP、Agent、Prompt、Skill、Copilot )


  • !!! 需要注意的是:Nacos 3.x 引入了 88488080 两个主要端口:
端口用途详细说明访问示例建议暴露范围
8848核心服务端口(主端口)处理所有客户端请求,包括:
• 服务注册与发现
• 配置管理(Config
gRPC/OpenAPI 调用
• 节点间通信
http://127.0.0.1:8848
http://127.0.0.1:8848/nacos/v3/...
内网(推荐)
8080控制台端口(Console)专门提供 Web 控制台页面(新版 UI)
包含服务管理、配置管理、AI Registry 等前端界面
http://127.0.0.1:8080
http://127.0.0.1:8080/nacos
可根据需要控制
  • 也就是说,我们在 application.properties 配置的时候是 :
properties
spring.cloud.nacos.server-addr=127.0.0.1:8848
  • 而且我们访问前端的控制台就是 http://127.0.0.1:8080

启动 Nacos 错误


  • startup.cmd 中添加 JVM 参数

  • 单机模式部分修改为:

shell
if %MODE% == "standalone" (
    echo "nacos is starting with standalone"
    set "NACOS_OPTS=-Dnacos.standalone=true"
    if "%CUSTOM_NACOS_MEMORY%"=="" ( set "CUSTOM_NACOS_MEMORY=-Xms512m -Xmx512m -Xmn256m" )
    set "NACOS_JVM_OPTS=%CUSTOM_NACOS_MEMORY% --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/sun.net.util=ALL-UNNAMED"
)
  • 集群模式部分修改为:
shell
if %MODE% == "cluster" (
    echo "nacos is starting with cluster"
    if %EMBEDDED_STORAGE% == "embedded" (
        set "NACOS_OPTS=-DembeddedStorage=true"
    )
    if "%CUSTOM_NACOS_MEMORY%"=="" ( set "CUSTOM_NACOS_MEMORY=-Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" )
    set "NACOS_JVM_OPTS=-server %CUSTOM_NACOS_MEMORY% -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryEr	ror -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/sun.net.util=ALL-UNNAMED"
)

启动 Nacos


  • .../bin 目录下打开 cmd ( 单机模式 ):
shell
startup.cmd -m standalone

  • 导航栏地址栏(别漏 nacos):
http
http://localhost:8848/nacos

注册中心


  • Nacos 作为 注册中心 :
微信截图_20260310215652
  • 注册中心 - 服务注册:
微信截图_20260310220536
  • 注册中心 - 服务发现:
微信截图_20260310220543
  • 远程调用 - 基本流程
微信截图_20260310220215
  • 远程调用 - 下单场景
微信截图_20260310220227
  • 远程调用 - 实现步骤:
微信截图_20260310220746
  • 远程调用 - 面试题:
微信截图_20260310220758

配置中心


  • Nacos 作为配置中心:
微信截图_20260310220950

【附录】


  • pom.xml ( 最大父工程 的 pom.xml
xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>pom</packaging>
    <groupId>com.iraionly</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-demo</name>
    <description>cloud-demo</description>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud.version>2023.0.3</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
        </dependencies>
    </dependencyManagement>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  • 依赖相关:
xml
<!--        服务发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--        远程调用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!--        导入 web 依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--        导入测试依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!--        导入 lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<!--        引入负载均衡 loadbalancer 依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!--        nacos 配置中心依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

  • application.properties
properties
# 服务名称
spring.application.name=service-order
# 服务启动的端口号
server.port=8000
# nacos 启动的地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
# 根据 data_id 从 nacos 配置中心中导入对应配置
spring.config.import=nacos:service-order.properties

  • 插件:

微信截图_20260312103649
  • 可以快速给所有属性生成一个默认值
微信截图_20260312103919
  • 生成如下效果:
微信截图_20260312103953