Nacos Spring Cloud 集成

Spring Cloud 工程接入 Nacos 是最常见的用法:加两个 starter、写几行配置,注册、发现、配置中心、动态刷新就全有了。本章给出可直接照抄的接入步骤。

引入依赖

在 pom.xml 中加入 Nacos 的注册与配置两个 starter(以下代码需放入 Spring Cloud 工程的 pom.xml):

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

版本必须与 Spring Cloud Alibaba 配套:引入 spring-cloud-alibaba-dependencies BOM 统一管理版本,并按官方版本对照表选择与 Spring Boot/Spring Cloud 匹配的组合,不要自行随手写版本号。

接入注册中心

在 application.properties 里配置应用名与 Nacos 地址:

spring.application.name=order-service
server.port=8080
spring.cloud.nacos.discovery.server-addr=localhost:8848
# spring.cloud.nacos.discovery.namespace=dev      # 多环境时指向对应命名空间

启动应用后,控制台"服务管理"里就能看到 order-service 及其实例。老版教程常在启动类加 @EnableDiscoveryClient 开启注册,新版 Spring Cloud 已由自动装配默认开启,注解可省略(写上也无妨),启动类保持常规写法即可。

服务调用与负载均衡

引入 spring-cloud-starter-loadbalancer 后,用 OpenFeign 或 RestTemplate 按服务名调用即可:

// RestTemplate 需先注册为 Bean,再按服务名调用,由 Nacos 解析真实地址
String result = restTemplate.getForObject(
        "http://user-service/api/user/1", String.class);

注册中心为 Nacos 时,默认负载均衡策略按实例权重随机选择(NacosLoadBalancer),权重调整无需重启调用方。

接入配置中心(bootstrap 方式)

Spring Cloud 2020 之后默认不再读取 bootstrap 文件,需先引入 spring-cloud-starter-bootstrap,再写 bootstrap.properties:

spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
# 默认 dataId 规则:{spring.application.name}.{file-extension}
# 即读取 order-service.properties;配了 profile 时优先读 order-service-dev.properties

dataId 命名对应第 7 章的规范:{应用名}-{环境}.{后缀}。工程里不要自己再放同名 properties,以 Nacos 为准。

共享与扩展配置

多个应用都要读的公共配置,用 shared-configs(老版本叫 extension-configs)引入:

# 所有应用共享的公共配置
spring.cloud.nacos.config.shared-configs[0].data-id=common.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
# spring.cloud.nacos.config.shared-configs[0].refresh=true   # 是否支持动态刷新

加载顺序为 shared-configs → 扩展配置 → 应用自身 dataId,同名键后者覆盖前者,应用自己的配置优先级最高。

动态刷新演示

配置一改、接口值即变,靠 @RefreshScope 实现(以下代码需放入 Spring 工程):

@RefreshScope
@RestController
public class TimeoutController {
    @Value("${timeout:5000}")
    private int timeout;

    @GetMapping("/timeout")
    public int timeout() {
        return timeout;   // 在 Nacos 改 timeout 并发布后,无需重启即返回新值
    }
}

控制台发布新值后,客户端长轮询感知变更并触发上下文刷新,整个过程无需重启应用。

小结

Spring Cloud 接 Nacos 三步走:pom 加 discovery/config 两个 starter(版本与 Spring Cloud Alibaba 配套)→ application.properties 配 server-addr 完成注册 → bootstrap.properties 按 dataId 规则接入配置中心。此后服务互调、配置动态刷新都由 Nacos 驱动,剩下就是写好业务代码。

笔记加载中…