前言
版本信息
- java版本:17.0.8
- maven版本:3.9.2
- 系统版本:win11 64位
- spring-cloud版本:2021.0.4
- spring-boot版本:2.6.12
项目使用的是spring-boot-dependencies
,不是spring-boot-starter-parent
。
集成nacos
新建spring-boot
项目
使用Spring Initializr创建spring-boot
项目,下载打开,删除除了pom.xml
和.gitignore
以外的所有文件。
将以下内容覆盖pom.xml
原有内容:
pom
<?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>
<groupId>com.example</groupId>
<artifactId>spring-cloud-learning</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>spring-cloud-learning</name>
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.26</lombok.version>
<log4j.version>1.2.17</log4j.version>
<fastjson2.version>2.0.14</fastjson2.version>
<fastjson.version>1.2.49</fastjson.version>
<hutool-all.version>5.7.13</hutool-all.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<jjwt.version>0.9.0</jjwt.version>
<nimbus-jose-jwt.version>9.23</nimbus-jose-jwt.version>
<tencentcloud-sdk-java.version>3.1.270</tencentcloud-sdk-java.version>
<spring-boot.version>2.6.12</spring-boot.version>
<spring-boot-maven-plugin.version>2.7.3</spring-boot-maven-plugin.version>
<spring-cloud-oauth2.version>2.2.5.RELEASE</spring-cloud-oauth2.version>
<mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version>
<pagehelper-spring-boot.version>1.3.0</pagehelper-spring-boot.version>
<spring-boot-test.version>2.6.12</spring-boot-test.version>
<spring-boot-security.version>2.6.12</spring-boot-security.version>
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
<alibaba.nacos.version>1.4.2</alibaba.nacos.version>
<spring-cloud.version>2021.0.4</spring-cloud.version>
<!-- 覆盖SpringBoot中okhttp3的旧版本声明,解决MinIO 8.3.x的依赖冲突 -->
<okhttp3.version>4.8.1</okhttp3.version>
<!-- spring-boot原本的okhttp版本 -->
<okhttp.version>3.14.9</okhttp.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp3.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<!--
https://start.spring.io/actuator/info
cloud版本一定要和boot版本匹配
必须以这种方式集成cloud-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot-test.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba -->
<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>
<version>${spring-boot-maven-plugin.version}</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
这样我们就完成了将spring-boot
改造成spring-cloud
项目了。
创建 nacos-provider 服务提供者
在上文讲到 nacos
有服务发现的功能,在这里需要两个角色
nacos-provider
: 注册进入 nacos-server, 对外暴露服务nacos-consumer
: 注册进入 nacos-server, 调用nacos-provider
的服务。
创建 nacos-provider
模块
由于使用了多模块聚合项目,这里直接添加spring-cloud-starter-alibaba-nacos-discovery
依赖:
pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
配置 yml 文件
配置 yml 首先需要知道每个参数代表的含义,下面是配置列表:
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr |
Nacos Server 启动监听的ip地址和端口 | |
服务名 | spring.cloud.nacos.discovery.service |
${spring.application.name} |
注册的服务名 |
权重 | spring.cloud.nacos.discovery.weight |
1 |
取值范围 1 到 100,数值越大,权重越大 |
网卡名 | spring.cloud.nacos.discovery.network-interface |
当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 | |
注册的IP地址 | spring.cloud.nacos.discovery.ip |
优先级最高 | |
注册的IP地址类型 | spring.cloud.nacos.discovery.ip-type |
IPv4 |
可以配置IPv4和IPv6两种类型,如果网卡同类型IP地址存在多个,希望制定特定网段地址,可使用spring.cloud.inetutils.preferred-networks 配置筛选地址 |
注册的端口 | spring.cloud.nacos.discovery.port |
-1 |
默认情况下不用配置,会自动探测 |
命名空间 | spring.cloud.nacos.discovery.namespace |
常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 | |
AccessKey | spring.cloud.nacos.discovery.access-key |
当要上阿里云时,阿里云上面的一个云账号名 | |
SecretKey | spring.cloud.nacos.discovery.secret-key |
当要上阿里云时,阿里云上面的一个云账号密码 | |
Metadata | spring.cloud.nacos.discovery.metadata |
使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 | |
日志文件名 | spring.cloud.nacos.discovery.log-name |
||
集群 | spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
Nacos集群名称 |
接入点 | spring.cloud.nacos.discovery.endpoint |
地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | |
是否集成Ribbon | ribbon.nacos.enabled |
true |
一般都设置成true即可 |
是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled |
true | 可以设置成false来关闭 watch |
接下来配置 yml 文件:
yml
server:
port: 9001
spring:
main:
allow-bean-definition-overriding: true
application:
## 指定服务名称,在nacos中的名字
name: nacos-provider
cloud:
nacos:
discovery:
# nacos的服务地址,nacos-server中IP地址:端口号
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
开启服务发现
在启动类添加@EnableDiscoveryClient
开启服务发现的功能:
java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
编写测试接口
作为服务提供者,需要提供接口给服务消费者,下面是随意编写的测试接口:
java
package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/nacos")
public class NacosController {
@GetMapping(value = "/test")
public String test(){
return "成功访问服务者接口111";
}
}
启动项目
项目启动成功后,访问 nacos
控制台 -> 服务管理 -> 服务列表,可以看到 nacos-provider
已成功注册进来:
创建 nacos-consumer
服务消费者
既然已经有了服务提供者,那么相应的就需要消费者去消费暴露出来的接口,nacos-consumer
的创建步骤与nacos-provider
类似。
创建 nacos-consumer
模块
引入依赖:
pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
配置 yml 文件
yml
server:
port: 9002
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
# nacos的服务地址
server-addr: 192.168.159.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
# 调用的微服务名称,这里指服务提供者,nacos服务列表里注册的服务名
service-url:
nacos-provider: nacos-provider
开启服务发现
同样在启动类添加@EnableDiscoveryClient
开启服务发现:
java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
编写测试接口
在 Spring Cloud Nacos 2021 以后就没有在默认使用 Ribbon 作为负载均衡器了,而且在Cloud官网中也推荐使用LoadBalancer 作为负载均衡器,对此先引入依赖:
- 引入
LoadBalancer
依赖:
pom
<!--loadbalancer负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 创建
RestTemplate
,如下:
java
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
/**
* 注入 RestTemplate
*
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 编写接口调用
nacos-provider
服务暴露出来的接口:
java
package com.example.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/consumer")
public class NacosController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@Value("${service-url.nacos-provider}")
private String serviceUrl;
@GetMapping("/getMessage")
public String test(){
//使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceUrl);
//调用 nacos-provider 的接口
String url = String.format("http://%s:%s/nacos/test",serviceInstance.getHost(),serviceInstance.getPort());
return restTemplate.getForObject(url,String.class);
}
}
启动项目
启动 nacos-consumer
服务,可以看得到服务提供者与服务消费者都已经注册进来:

接下来要做的事情是调用 nacos-consumer
的接口,输入地址:http://localhost:9002/consumer/getMessage 成功调用
nacos-provider
接口。
Nacos Config 服务配置中心
创建nacos-config
模块
Nacos 不只有服务注册与发现的功能,还拥有配置管理的功能, 下面是配置管理的参数列表及代表的含义:
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.config.server-addr |
Nacos Server 启动监听的ip地址和端口 | |
配置对应的 DataId | spring.cloud.nacos.config.name |
先取 prefix,再取 name,最后取 spring.application.name | |
配置对应的 DataId | spring.cloud.nacos.config.prefix |
先取 prefix,再取 name,最后取 spring.application.name | |
配置内容编码 | spring.cloud.nacos.config.encode |
读取的配置内容对应的编码 | |
GROUP | spring.cloud.nacos.config.group |
DEFAULT_GROUP |
配置对应的组 |
文件扩展名 | spring.cloud.nacos.config.fileExtension |
properties |
配置项对应的文件扩展名,目前支持 properties 和 yaml(yml) |
获取配置超时时间 | spring.cloud.nacos.config.timeout |
3000 |
客户端获取配置的超时时间(毫秒) |
接入点 | spring.cloud.nacos.config.endpoint |
地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | |
命名空间 | spring.cloud.nacos.config.namespace |
常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 | |
AccessKey | spring.cloud.nacos.config.accessKey |
当要上阿里云时,阿里云上面的一个云账号名 | |
SecretKey | spring.cloud.nacos.config.secretKey |
当要上阿里云时,阿里云上面的一个云账号密码 | |
Nacos Server 对应的 context path | spring.cloud.nacos.config.contextPath |
Nacos Server 对外暴露的 context path | |
集群 | spring.cloud.nacos.config.clusterName |
配置成Nacos集群名称 | |
共享配置 | spring.cloud.nacos.config.sharedDataids |
共享配置的 DataId, "," 分割 | |
共享配置动态刷新 | spring.cloud.nacos.config.refreshableDataids |
共享配置中需要动态刷新的 DataId, "," 分割 | |
自定义 Data Id 配置 | spring.cloud.nacos.config.extConfig |
属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId , group 以及 refresh |
- 引入依赖
从 SpringCloud 2020 版本开始bootstrap
文件便失效了,需要手动导入相应的依赖:
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- bootstrap 文件生效 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.properties/yml
文件优先级高于 application.properties/yml
。
配置 yml 文件
在 bootstrap.yml
添加以下配置:
yml
server:
port: 9003
spring:
application:
name: nacos-config
# 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
profiles:
active: dev
cloud:
nacos:
config:
# nacos的地址,作为配置中心
server-addr: 127.0.0.1:8848
## 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
file-extension: properties
management:
endpoints:
web:
exposure:
# yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
dataId 的含义
dataId 是一个配置的唯一标识,格式如下:
bash
${prefix}-${spring.profiles.active}.${file-extension}
prefix
:前缀,默认是spring.cloud.nacos.config.prefix
的值,再是spring.cloud.nacos.config.name
的值, 最后是spring.application.name
的值。spring.profiles.active
: 即为当前环境对应的 profile。当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
。file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
Nacos 添加配置
在 Nacos
中 添加一个 user.age
配置,如下图:

填写完后点击发布保存配置,如下图:

获取 Nacos 配置
新建一个 entity
用于接收配置:
java
package com.example.enity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
public class ConfigUser {
@Value("${user.age}")
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
新建一个 controller
, 用于测试:
java
package com.example.controller;
import com.example.enity.ConfigUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/config")
public class NacosConfigController {
@Autowired
private ConfigUser configUser;
@GetMapping("/test")
public String test() {
return "current user age is:" + configUser.getAge();
}
}
启动项目,访问 http://localhost:9003/config/test 接口,成功读取到配置信息:

动态刷新配置
我们肯定不想每次配置完都重启项目,想要实现动态刷新需要添加注解@RefreshScope
,将注解标注在对应的类上,如下:
java
package com.example.enity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@RefreshScope // 支持动态刷新配置
public class ConfigUser {
@Value("${user.age}")
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
重启项目完毕,修改 Nacos
中的 user.age=20
,然后访问接口:

发现配置自动更新了。
多环境隔离(NameSpace)
正常的业务开发分为以下三个环境:
- dev:本地开发环境
- test:测试环境
- prod:生产环境
虽然 dataId
能够唯一的区分每一个配置文件,但是当微服务配置多了,很难查找每个环境的配置,因此有了 NameSpace
即命名空间来隔离每个环境的配置。
我们创建了以下三个命名空间:

注意:上图中的命名空间ID
是系统自动生成的唯一 ID,后续指定不同的Namespace
就用这个 ID。
Nacos
默认的命名空间是 public
, 在 test
命名空间添加 user.age=20
的配置,如下图:

bootstrap.yml
修改配置如下:
yml
server:
port: 9003
spring:
application:
name: nacos-config
# 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
profiles:
active: test
cloud:
nacos:
config:
# nacos的地址,作为配置中心
server-addr: 192.168.159.1:8848
# 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
file-extension: properties
# 命名空间ID
namespace: e08e898c-1d86-422e-9120-ff19cf5c78f5
management:
endpoints:
web:
exposure:
# yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
配置完毕,重启项目访问 http://localhost:9003/config/test 接口,如下:

成功读取配置。
不同业务隔离(Group)
不同的微服务可能有着不同的配置,例如商品系统与订单系统通过分库分别访问不同的数据库,意味着有不同的数据库配置,此时就需要根据Group
即组进行配置的区分,例如Goods_Group
、Order_Group
, 默认的是 DEFAULT_GROUP
。
在 nacos
添加配置user.age=40
,命名空间为test
, 分组为Goods_Group
:

在 bootstrap.yml
指定分组,配置如下:
yml
spring:
application:
name: nacos-config
# 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
profiles:
active: test
cloud:
nacos:
config:
# nacos的地址,作为配置中心
server-addr: 127.0.0.1:8848
# 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
file-extension: properties
# 指定命名空间ID
namespace: e08e898c-1d86-422e-9120-ff19cf5c78f5
# 指定分组
group: Goods_Group
重启项目后再次访问 http://localhost:9003/config/test 接口,如下:

读取配置成功。
共享配置
当微服务数量增多,一般会有相同的配置,那如何把相同的配置提取出来实现共享呢?
在 Nacos
添加 share-config1.properties
及share-config2-properties
配置,如下:

注意:
dataId
的后缀一定要为properties
或yml
。
share-config1.properties
的配置为user.name=lin
share-config2.properties
的配置为user.age=50
- 新建
nacos-config-share
模块 引入依赖:
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- bootstrap 文件生效 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.yml
配置如下:
yml
server:
port: 9004
spring:
application:
name: nacos-config-share
cloud:
nacos:
config:
# nacos的地址,作为配置中心
server-addr: 127.0.0.1:8848
## 共享配置,List集合,可以配置多个
shared-configs:
## dataId:配置文件的dataId,必须带有后缀
- dataId: share-config1.properties
## refresh:指定是否能够动态刷新,默认是false
refresh: true
- dataId: share-config2.properties
## 指定配置文件的分组,默认是DEFAULT_GROUP
group: Goods_Group
# 命名空间ID
namespace: e08e898c-1d86-422e-9120-ff19cf5c78f5
management:
endpoints:
web:
exposure:
# yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
可以看到:
- 通过
spring.cloud.nacos.config.shared-configs[n].data-id
来支持多个共享 Data Id 的配置。 - 通过
spring.cloud.nacos.config.shared-configs[n].group
来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。 - 通过
spring.cloud.nacos.config.shared-configs[n].refresh
来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。
新建 entity
,用于接收共享配置,如下:
java
package com.example.enity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@RefreshScope
public class ConfigUser {
@Value("${user.name}")
private String name;
@Value("${user.age}")
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
新建controller
,用于接收共享配置,如下:
java
package com.example.controller;
import com.example.enity.ConfigUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/config")
public class NacosConfigShareController {
@Autowired
private ConfigUser configUser;
@GetMapping("/test")
public String test() {
return "current user name is:" + configUser.getName() + " , and age is:" + configUser.getAge();
}
}
启动项目,访问 http://localhost:9004/config/test, 如下:

成功访问到 share-config1.properties
及 share-config2.properties
的共享配置。
到这里 Nacos
的基本用法介绍完毕,了解更多详细信息参考官方Nacos config文档。