Spring Cloud 组件
微服务
微服务 把一个大型单体应用按照业务领域拆分成多个”单一职责”的小服务,每个服务独立开发、独立部署、独立扩缩容。
优点:
- 微服务架构中,修改”服务1”不会影响”服务2”,团队可以并行开发。且在分布式系统中,某个服务的故障不会导致整个系统雪崩。
- 外部调用方不需要知道后端有多少个微服务,只需要一个统一入口。同时在入口处进行身份认证、权限校验、限流等安全操作。
- 将所有服务的配置集中存储,支持多环境隔离、灰度发布,且大部分配置修改后可实时生效,无需重启服务。
客户端层:Web、移动端、第三方系统都只与 API 网关交互,不直接访问内部服务。
网关层(API Gateway):统一入口,负责路由分发、身份认证、限流熔断和负载均衡,是整个系统对外的”门面”。
服务层:每个微服务围绕单一业务职责构建(用户、商品、订单、支付、通知)。服务间既有同步调用(如订单调用支付),也有异步通信(通过消息队列)。
消息层(事件总线):Kafka/RabbitMQ 实现服务间异步解耦。订单创建后发布事件,通知服务订阅并发送短信/邮件,两者互不依赖。
数据层:每个服务拥有独立数据库(Database per Service 模式),技术栈可自由选择。高频读取数据通过 Redis 缓存加速。
基础设施层:服务注册中心负责服务发现,链路追踪(Jaeger)记录跨服务调用,Prometheus + Grafana 做监控,配置中心统一管理配置,Kubernetes 负责容器编排与弹性伸缩。
Spring Cloud
Java中常用的微服务框架是Spring Cloud(基于SpringBoot)。
服务注册中心(Nacos)
服务启动后要主动向系统注册自身,让系统中其他服务能够发现自己,自己也可以调用其他服务。(每个服务的地址是不能写死的,方便新增或卸载服务)
目前常用的服务注册框架是 Nacos,微服务启动时向 Nacos 注册自己的元数据(IP、端口、权重、健康状态等),调用方通过服务名获取实例列表并进行负载均衡。
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个用于动态服务发现、配置管理和服务管理平台。在 Spring Cloud Alibaba 生态中,它取代了 Eureka + Config + Bus 的组合,成为注册中心与配置中心的“二合一”核心组件。
特性 Nacos Eureka Consul Apollo 注册中心 ✅ ✅ ✅ ❌ 配置中心 ✅ ❌ ✅ (弱) ✅ 健康检查 TCP/HTTP/MySQL/自定义 客户端心跳 TCP/HTTP/gRPC/TTL 客户端心跳 动态推送 ✅ (gRPC/长轮询) ❌ (轮询) ✅ (全量) ✅ (长轮询) 多环境隔离 Namespace+Group ❌ Datacenter Cluster+Namespace 社区活跃度 ✅ 活跃 ⚠️ 停更 ✅ 活跃 ✅ 活跃 适用场景 Spring Cloud Alibaba 首选 老项目维护 多语言/Service Mesh 纯配置中心需求
graph LR
A[Service A] -->|1. 注册| B(Nacos Server)
C[Service B] -->|1. 注册| B
C -->|2. 订阅 ServiceA| B
B -->|3. 推送实例列表| C
C -->|4. 本地缓存+负载均衡调用| A
- 客户端启动后通过 OpenAPI 向 Server 注册。
- 调用方订阅目标服务,Server 维护订阅关系。
- 当实例上下线或健康状态变化时,Server 通过 UDP/gRPC 推送变更到订阅者。
- 客户端本地维护服务缓存,即使 Nacos Server 宕机,短时间内仍可正常调用。
graph TD
A[服务提供者启动] --> B[向 Nacos 注册实例]
B --> C[Nacos 加入注册表]
C --> D{发送心跳?}
D -- 是 --> E[更新最后心跳时间]
E --> D
D -- 否 --> F{超15秒?}
F -- 是 --> G[标记为不健康]
F -- 否 --> D
G --> H{超30秒?}
H -- 是 --> I[删除实例]
H -- 否 --> D
I --> J[推送变更通知]
J --> K[消费者更新缓存]
配置
Nacos Client (Springboot开发项目)
build.gradle
1
2
3
4
// nacos 服务发现
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
// nacos 配置中心
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
application.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server:
port: 8085
spring:
application:
name: service1
config:
import: optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}?group=${spring.cloud.nacos.config.group}&namespace=
cloud:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
discovery:
namespace: public
group: DEFAULT_GROUP
config:
namespace: public
group: DEFAULT_GROUP
file-extension: yaml
# 默认 DataId: service1.yaml
refresh-enabled: true
Nacos Server (本质是一个Spring Boot Web 应用)
功能:
- HTTP API
- 配置中心
注册中心
- 控制台
为了方便,使用Docker启动Nacos Server
创建 docker-compose.yml (测试使用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
nacos:
image: nacos/nacos-server:v3.2.2
container_name: nacos
environment:
MODE: standalone
NACOS_AUTH_TOKEN: 'SecretKey012345678901234567890123456789012345678901234567890123456789'
NACOS_AUTH_IDENTITY_KEY: "serverIdentity"
NACOS_AUTH_IDENTITY_VALUE: "security"
ports:
- "8848:8848" # HTTP API
- "9848:9848" # gRPC client → server (服务注册、心跳)
- "9849:9849" # gRPC server → client (配置/服务推送)
- "8080:8080" # Web 控制台
启动:docker compose up -d
docker-compose.yml (生产使用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
services:
mysql:
image: mysql:10
container_name: nacos-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: nacos_config
ports:
- "3306:3306"
nacos:
image: nacos/nacos-server:v3.2.2
container_name: nacos
environment:
MODE: standalone
NACOS_AUTH_TOKEN: 'SecretKey012345678901234567890123456789012345678901234567890123456789'
NACOS_AUTH_IDENTITY_KEY: "serverIdentity"
NACOS_AUTH_IDENTITY_VALUE: "security"
ports:
- "8848:8848"
- "8080:8080"
- "9848:9848" # 客户端 gRPC(可选,但推荐)
- "9849:9849" # 集群通信(单机模式不需要)
volumes:
# 配置文件(需提前创建)
- ./conf/application.properties:/home/nacos/conf/application.properties
- ./logs:/home/nacos/logs
- ./data:/home/nacos/data
depends_on:
- mysql
Docker Compose 命令
- 启动:
docker compose -f xxx.yml up -d- 停止:
docker compose -f xxx.yml down- 查看:
docker compose -f xxx.yml ps- 重启:
docker compose -f xxx.yml restart
Nacos端口
| 端口 | 作用 |
|---|---|
| 8848 | HTTP API (如配置管理、服务注册等 OpenAPI) |
| 8080 | Web控制台 |
| 9848 | 客户端 gRPC(用于 Nacos 客户端与服务端之间的 高性能 gRPC 连接) |
| 9849 | 集群通信(用于 Nacos 集群节点之间的 内部通信,单机模式(standalone)下通常不使用) |
nacos-discovery提供了服务发现功能,可以将自身服务注册到nacos server,也可以获取已经注册的服务。
nacos-config提供配置文件,注册的服务可以从nacos server中动态获取最新的配置文件。
Spring Cloud Alibaba Nacos Discovery
核心功能:
| 功能 | 说明 |
|---|---|
| 服务注册 | 服务启动时自动将 IP + 端口注册到 Nacos |
| 服务发现 | 调用方通过服务名查询可用实例列表 |
| 健康检查 | Nacos 定期心跳检测,自动剔除下线实例 |
客户端部分配置,具体配置查询官网
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
spring:
application:
name: service1 # 注册到 Nacos 的服务名(重要)
cloud:
nacos:
# 公共配置(config 和 discovery 共用)
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
discovery:
# ---- 基础配置 ----
server-addr: 127.0.0.1:8848 # 可单独指定,覆盖上面的公共配置
namespace: # 命名空间 ID,public 留空
group: DEFAULT_GROUP # 分组
# ---- 实例配置 ----
ip: 192.168.1.100 # 指定注册的 IP(多网卡时使用)
port: 8085 # 默认取 server.port
weight: 1 # 负载均衡权重,越大被调用概率越高
# ---- 实例类型 ----
ephemeral: true # true=临时实例(默认) false=永久实例
# ---- 元数据(自定义标签) ----
metadata:
version: v1
zone: shanghai
# ---- 心跳配置 ----
heart-beat-interval: 5000 # 心跳发送间隔(ms),默认 5000
heart-beat-timeout: 15000 # 心跳超时时间(ms),默认 15000
# ---- 其他 ----
enabled: true # 是否开启注册,false 则不注册
register-enabled: true # 是否注册自身(false=只订阅不注册)
注:namespace和group用于多环境隔离:
- Namespace(命名空间)→ 隔离环境,如 dev 命名空间ID: xxx-dev。
- Group(分组)→ 隔离业务模块,如 ORDER_GROUP。
Spring Cloud Alibaba Nacos Config
核心功能:
1. 集中化配置管理 将应用配置统一存储在 Nacos 服务器,而非分散在各个服务的本地文件中,实现”一处修改,全局生效”。
2. 动态刷新(热更新) 配置修改后,无需重启应用即可实时生效。配合 @RefreshScope 注解,Bean 会自动重新加载新配置,或者通过@ConfigurationProperties 只更新具体属性。
3. 多环境配置隔离 通过 namespace + group + Data ID 三级隔离,轻松管理 dev / test / prod 等不同环境的配置。
4. 配置版本管理与回滚 Nacos 保存历史版本,支持一键回滚到任意历史配置。
客户端部分配置,具体配置查询官网
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
server:
port: 8085
spring:
application:
name: user-service # 服务名,也是 Nacos 中 Data ID 的前缀
cloud:
nacos:
# ============ 配置中心 (Config) ============
config:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
namespace: public # 命名空间 ID(对应环境隔离)
group: DEFAULT_GROUP # 分组,默认 DEFAULT_GROUP
file-extension: yaml # 配置文件格式:yaml 或 properties
refresh-enabled: true
# 共享配置(多服务复用的公共配置)
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true # 是否支持动态刷新
# 扩展配置(优先级高于 shared-configs)
extension-configs:
- data-id: datasource.yaml
group: DEFAULT_GROUP
refresh: true
# ============ 注册中心 (Discovery) ============
discovery:
server-addr: 127.0.0.1:8848
namespace: dev
group: DEFAULT_GROUP
# 激活环境(影响 Data ID 拼接规则)
profiles:
active: dev
客户端配置需要动态修改,需要使用@ConfigurationProperties 或 @RefreshScope
1
2
3
4
5
6
7
8
9
10
11
12
13
// @RefreshScope 配置动态更新示例
@RestController
@RefreshScope // 👈 关键:添加此注解,使该 Bean 支持配置动态刷新
public class TestController {
@Value("${app.user.name}")
private String name;
@RequestMapping("/username")
public String getName() {
return name;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// @ConfigurationProperties 配置动态更新示例
// UserProperties.java
@Component
@ConfigurationProperties(prefix = "app.user")
@Data
public class UserProperties {
private String name; // 自动绑定 app.user.name,天然支持动态刷新,无需 @RefreshScope
}
// TestController.java
@RestController
public class TestController {
@Autowired
private UserProperties userProperties;
@RequestMapping("/username")
public String getName() {
return userProperties.getName();
}
}
Spring Cloud Alibaba Nacos AI Registry
Nacos AI Registry 是 Spring AI Alibaba 提供的 AI 资产注册中心,用于统一管理企业内部的 Skill、Agent、Prompt 等 AI 资源。开发者可以将 AI 资产发布到 Nacos Registry 中,实现版本管理、注册发现、下载分发和变更订阅。应用运行时可以从 Nacos 获取这些 AI 资产,并动态组装到 Spring AI Agent、ChatClient 或 MCP 工具链中,实现 AI 能力的集中治理与热更新。它本身不负责执行 Agent 或调用大模型,而是充当 AI 资产仓库和注册中心的角色。
- 通过Nacos控制台上传,下载 AI 资产
- 应用服务可在代码中获取Nacos server发布的 AI 资产
1
2
3
4
dependencies {
// Spring AI Alibaba Nacos Skill Registry Starter
implementation 'com.alibaba.cloud.ai:spring-ai-alibaba-starter-nacos-skill-registry'
}
1
2
3
4
5
6
7
8
9
10
spring:
ai:
nacos:
skill:
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
# 可选:如果 Nacos 开启了鉴权
username: nacos
password: nacos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 配置类
@Configuration
public class NacosSkillConfig {
@Bean
public SkillMaintainerService skillMaintainerService(NacosSkillRegistryProperties properties) {
AiMaintainerService aiService = AiMaintainerFactory.createAiMaintainerService(properties);
return aiService.skill();
}
}
// 业务类
@Service
public class OrderAgentService {
@Resource
private SkillMaintainerService skillService;
private volatile Skill currentSkill;
@PostConstruct
public void init() {
currentSkill = skillService.load("order-query");
skillService.subscribe("order-query", event -> {
currentSkill = skillService.load("order-query");
});
}
public void handleOrderQuery(String userId) {
Skill skill = currentSkill;
// agentExecutor.execute(skill, Map.of("userId", userId));
}
}
| 资源类型 | 作用 | 类比理解 |
|---|---|---|
| MCP | 模型上下文协议,标准化工具接入 | API 网关 |
| Agent | AI 智能体,承载任务与工作流 | 微服务实例 |
| Prompt | 驱动 Agent 的指令模板 | 配置文件 |
| Skill | 可复用的能力包,封装具体动作 | 公共组件 |
