SpringCloud
一、跳转链接
- ( 听课地址 ) 尚硅谷 7 h SpringCloud : https://www.bilibili.com/video/BV1UJc2ezEFU?spm_id_from=333.788.videopod.sections&vd_source=2fbb4b17075136a98e03423a799add2c
Maven仓库 : https://mvnrepository.com/Nacos官网 : https://nacos.io/docs/next/quickstart/quick-start/
Spring Cloud系列:- 官网:https://spring.io/projects/spring-cloud
- 远程调用:
OpenFeign - 网关:
Gateway
Spring Cloud Alibaba系列:- 官网:https://sca.aliyun.com/
- 注册中心 / 配置中心 :
Nacos - 服务保护:
Sentinel - 分布式事物:
Seata
二、分布式概念基础
2.1 微服务
微服务架构风格,就像是把一个 单独的应用程序 开发为 一套小服务 , 每个 小服务 运行在 自己
的 进程 中, 并使用轻量级机制通信, 通常是
HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务 可使用不同的编程语言去编写,已经不同的数据存储技术,
并保持最低限度的集中式管理
2.2 集群&分布式&节点
只要是一群机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;
《分布式系统原理与范型》定义:
- “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
- 分布式系统(
distributed system) 是建立在网络之上的软件系统
- " 分布式 是指将 计算任务或数据 分布在不同的节点上协同完成"
- " 集群 指的是 多台服务器逻辑上组成一个整体,对外提供 相同的服务 "
例如:京东是一个分布式系统,众多业务运行在不同的机器 ,所有业务构成一个大型的 业务集群 。
每一个小的业务,比如 用户系统 ,访问压力大的时候,一台服务器是不够的。我们就应该将用户系统
部署到多个服务器,也就是 每一个业务系统也可以做集群化;
┌─────────────────────────────────────────────────────────┐
│ 京东整体架构 │
│ (这是一个分布式系统) │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │
│ │ 用户服务 │◄───│ 订单服务 │◄───│ 库存服务 │ │
│ │ (User) │ │ (Order) │ │ (Stock) │ │
│ └──────┬──────┘ └─────────────┘ └───────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ← 这个"节点"本身又是集群 │
│ │ 用户服务集群 │ (3台服务器,负载均衡) │
│ │ [U1][U2][U3] │ │
│ └─────────────┘ │
│ │
│ 分布式:User/Order/Stock 之间是分布式的(不同业务) │
│ 集群:U1/U2/U3 之间是集群的(相同业务) │
│ │
└─────────────────────────────────────────────────────────┘- 节点:集群中的一个服务器
2.3 远程调用
远程调用( 远程过程调用
Remote Procedure Call:RPC)在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用 ,
我们称为远程调用。
SpringCloud中使用HTTP + JSON的方式完成远程调用在远程调用中,我们直接使用的工具是
SpringCloud OpenFeign

2.4 负载均衡
分布式系统中,A 服务需要调用 B 服务, B 服务在多台机器中都存在,A 调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太忙或太闲,我们可以 负载均衡 的调用每一个服务器,提高网站的健壮性。
常见的负载均衡算法:
1). 轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,
直到最后一个,然后循环回来第一个继续轮询 ...
2). 最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式
3). 散列:根据请求源的
IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求
用户能连接到和之前相同的服务器可以采取这种方式

2.5 服务注册/发现 & 注册中心
A 服务调用 B 服务,A 服务并不知道 B 服务当前在哪几台服务器有,哪些正常的,哪些服务已经
下线了。为了解决这个问题可以引入注册中心;

2.6 配置中心
每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上,我们经常
需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息

2.7 服务熔断&服务降级
在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,
有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。

1). 服务熔断:设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,
后来的请求不再去调用这个服务。本地直接返回默认的数据
2). 服务降级:在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。
降级:某些服务不处理或简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】
2.8 API 网关
在微服务架构中,
API Gateway作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等
丰富的功能,帮助我们解决很多 API 管理的难题。

版本选择

Nacos
【2.xx】安装
Nacos(/nɑ:kəʊs/) 是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的 动态服务发现、配置管理和服务管理平台。
安装:
- 下载安装包:【2.4.3】
- 启动命令:
startup.cmd -m standalone
【3.xx】安装
- 下载地址:https://nacos.io/download/nacos-server/?spm=5238cd80.47ee59c.0.0.189fcd36KETwOd
- 上面地址选择 【3.x】版本下载
- 下载后解压缩
/nacos/bin目录下cmd输入命令startup.cmd -m standalone启动(standalone单机模式,非集群模式)随后启动程序会提示您输入
3个鉴权相关配置(Nacos 从 3.0.0 版本开始默认启用控制台鉴权功能,因此如下 3 个鉴权相关配置必须填写)如下所示:
`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 密钥
VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=- 三个都设置好后就会自动启动了 ...
- 然后地址栏输入 :
http://localhost:8080/- 会重定向到:
http://localhost:8080/next/#/register- 在这个页面设置好初始化密码,用户名是
nacos - 然后会重定向到 :
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引入了8848和8080两个主要端口:
| 端口 | 用途 | 详细说明 | 访问示例 | 建议暴露范围 |
|---|---|---|---|---|
| 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配置的时候是 :
spring.cloud.nacos.server-addr=127.0.0.1:8848- 而且我们访问前端的控制台就是
http://127.0.0.1:8080
启动 Nacos 错误
在
startup.cmd中添加JVM参数单机模式部分修改为:
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"
)- 集群模式部分修改为:
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( 单机模式 ):
startup.cmd -m standalone- 导航栏地址栏(别漏
nacos):
http://localhost:8848/nacos注册中心
Nacos作为 注册中心 :

- 注册中心 - 服务注册:

- 注册中心 - 服务发现:

- 远程调用 - 基本流程

- 远程调用 - 下单场景

- 远程调用 - 实现步骤:

- 远程调用 - 面试题:

配置中心
Nacos作为配置中心:

【附录】
pom.xml( 最大父工程 的pom.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>- 依赖相关:
<!-- 服务发现-->
<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
# 服务名称
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- 插件:

- 可以快速给所有属性生成一个默认值

- 生成如下效果:

