Post

Spring Cloud 组件

Spring Cloud 组件

微服务

微服务 把一个大型单体应用按照业务领域拆分成多个”单一职责”的小服务,每个服务独立开发、独立部署、独立扩缩容。

优点:

  • 微服务架构中,修改”服务1”不会影响”服务2”,团队可以并行开发。且在分布式系统中,某个服务的故障不会导致整个系统雪崩。
  • 外部调用方不需要知道后端有多少个微服务,只需要一个统一入口。同时在入口处进行身份认证、权限校验、限流等安全操作。
  • 将所有服务的配置集中存储,支持多环境隔离、灰度发布,且大部分配置修改后可实时生效,无需重启服务。

image-20260528180513740

客户端层: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 的组合,成为注册中心配置中心的“二合一”核心组件。

特性NacosEurekaConsulApollo
注册中心
配置中心✅ (弱)
健康检查TCP/HTTP/MySQL/自定义客户端心跳TCP/HTTP/gRPC/TTL客户端心跳
动态推送✅ (gRPC/长轮询)❌ (轮询)✅ (全量)✅ (长轮询)
多环境隔离Namespace+GroupDatacenterCluster+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端口

端口作用
8848HTTP API (如配置管理、服务注册等 OpenAPI
8080Web控制台
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:                     # 命名空间 IDpublic 留空
        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 网关
AgentAI 智能体,承载任务与工作流微服务实例
Prompt驱动 Agent 的指令模板配置文件
Skill可复用的能力包,封装具体动作公共组件
This post is licensed under CC BY 4.0 by the author.