1.1 引入依赖
引入依赖spring-cloud-starter-alibaba-nacos-discovery
、spring-cloud-starter-alibaba-nacos-config
<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>
1.2 添加Nacos配置
登陆Nacos:http://localhost:8848/nacos, 找到配置列表
中hssa命名空间,在其下面添加配置
1.2.1 项目配置
DataId配置规则:服务名 + 环境名 + 配置文件后缀【$(prefix)-$(spring.profile.active).$(file-extension)
】,以虾酱系统(shrimp-paste)
为例,我们可配置成以下方式:shrimp-paste、shrimp-paste.properties、shrimp-paste-dev.properties、shrimp-paste-prod.properties、shrimp-paste-test.properties
,其中以shrimp-paste优先级最高,shrimp-paste配置内容复制shrimp-paste\shrimp-paste-web\src\main\resources\application-test.properties
中内容即可
1.2.2 公共redis配置
其中redisson.properties
为所有项目公共扩展配置
#序列化方式(默认为JsonJackson)
redisson.codec=org.redisson.client.codec.stringCodec
#密码
redisson.password=redisPwd
#指定集群模式
redisson.model=cluster
#最大重试次数
redisson.retry-attempts=3
#空闲连接PING间隔时间(0为关闭该功能)
redisson.ping-connection-interval=3000
# 集群节点
redisson,multiple-server-config.nodeAddresses=192.168.1.1:30360,192.168.1.1:30361
#主节点连接池最小连接数
redisson.multiple-server-config.master-connection-minimum-idle-size=8
#主节点连接池最大连接数
redisson,multiple-server-config.master-connection-pool-size=32
#从节点连接池最小连接数
redisson,multiple-server-config.slave-connection-minimum-idle-size=8
#从节点连接池最大连接数
redisson.multiple-server-config.slave-connection-pool-size=32
#主从节点是否参与查询,默认只有从节点参与查询
redisson.multiple-server-config.read-mode=slave
1.3 更改项目配置
1.3.1 添加bootstrap配置文件
在目录shrimp-paste\shrimp-paste-web\src\main\resources、shrimp-paste\shrimp-paste-web\src\test\resources
目录下添加bootstrap.properties文件,文件内容如下
# 服务名称
spring.application.name=shrimp-paste
# 注册与发现
# 注册中心地址
spring.cloud.nacos.discovery.server-addr = localhost:8848
# 命名空间Id
spring.cloud.nacos.discovery.namespace = b2371ce7-1b72-46c3-aad7-98296ea2e99d
# 账号
spring.cloud.nacos.discovery.username = nacos
# 密码
spring.cloud.nacos.discovery.password = nacos
# 配置中心
# 注册中心地址
spring.cloud.nacos.config.server-addr = localhost:8848
# 命名空间Id
spring.cloud.nacos.config.namespace = b2371ce7-1b72-46c3-aad7-98296ea2e99d
# 账号
spring.cloud.nacos.config.username = nacos
# 密码
spring.cloud.nacos.config.password = nacos
# 分组[默认DEFAULT_GROUP]
spring.cloud.nacos.config.group = SHRIMP_PASTE_GROUP
# data-id后缀[默认properties]
spring.cloud.nacos.config.file-extension = properties
# 默认开启
spring.cloud.nacos.config.refresh-enabled = true
# 拓展配置[扩展配置数字越大优先级越高]
spring.cloud.nacos.config.extension-configs[0].data-id = redisson.properties
spring.cloud.nacos.config.extension-configs[0].group = SHRIMP_PASTE_COMMON_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh = true
1.4 环境变量使用
以上方式在各个环节中部署非常不方便,不管什么环境都是同一个配置非常不方便,因此我们可以使用环境变量方式解决此问题,配置调整为如下方式
# 注册与发现
# 注册中心地址
spring.cloud.nacos.discovery.server-addr = ${NACOS_SERVER_ADDR:localhost:8848}
# 命名空间Id
spring.cloud.nacos.discovery.namespace = ${NACOS_NAMESPACE:b2371ce7-1b72-46c3-aad7-98296ea2e99d}
# 账号
spring.cloud.nacos.discovery.username = ${NACOS_USERNAME:nacos}
# 密码
spring.cloud.nacos.discovery.password = ${NACOS_PASSWORD:nacos}
1.5 启动原理
1.5.1 配置启动类
文件spring-cloud-starter-alibaba-nacos-config-2.2.7.RELEASE.jar!\META-INF\spring.factories
配置启动类
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,\
com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer
org.springframework.boot.env.PropertySourceLoader=\
com.alibaba.cloud.nacos.parser.NacosJsonPropertySourceLoader,\
com.alibaba.cloud.nacos.parser.NacosXmlPropertySourceLoader
org.springframework.context.ApplicationListener=\
com.alibaba.cloud.nacos.logging.NacosLoggingListener
1.5.2 加载配置
NacosConfigBootstrapConfiguration
该类使用@ConditionalOnProperty(
name = {“spring.cloud.nacos.config.enabled”},
matchIfMissing = true
)注解控制配置中心的开启和关闭,该类主要负责加载配置并向spring容器注册NacosConfigProperties
和NacosPropertySourceLocator
(读取配置属性)
1.5.3 NacosPropertySourceLocator
NacosPropertySourceLocator使用NacosPropertySourceBuilder.ConfigService加载配置
核心代码data = this.configService.getConfig(dataId, group, this.timeout);
private List<PropertySource<?>> loadNacosData(String dataId, String group, String fileExtension) {
String data = null;
try {
data = this.configService.getConfig(dataId, group, this.timeout);
if (StringUtils.isEmpty(data)) {
log.warn("Ignore the empty nacos configuration and get it based on dataId[{}] & group[{}]", dataId, group);
return Collections.emptyList();
}
if (log.isDebugEnabled()) {
log.debug(String.format("Loading nacos data, dataId: '%s', group: '%s', data: %s", dataId, group, data));
}
return NacosDataParserHandler.getInstance().parseNacosData(dataId, data, fileExtension);
} catch (NacosException var6) {
log.error("get data from Nacos error,dataId:{} ", dataId, var6);
} catch (Exception var7) {
log.error("parse data from Nacos error,dataId:{},data:{}", new Object[]{dataId, data, var7});
}
return Collections.emptyList();
}
加载配置文件部分日志如下
2023-07-11 13:09:41.555 WARN [] [] [main] WARN com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[shrimp-paste.properties] & group[SHRIMP_PASTE_GROUP]
2023-07-11 13:09:41.564 WARN [] [] [main] WARN com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[shrimp-paste-dev.properties] & group[SHRIMP_PASTE_GROUP]
2023-07-11 13:09:41.575 WARN [] [] [main] WARN com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[shrimp-paste-prod.properties] & group[SHRIMP_PASTE_GROUP]
2023-07-11 13:09:41.585 WARN [] [] [main] WARN com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[shrimp-paste-test.properties] & group[SHRIMP_PASTE_GROUP]
2023-07-11 13:09:41.587 INFO [] [] [main] INFO org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-shrimp-paste-test.properties,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shrimp-paste-prod.properties,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shrimp-paste-dev.properties,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shrimp-paste.properties,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shrimp-paste,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-redisson.properties,SHRIMP_PASTE_COMMON_GROUP'}]
2023-07-11 13:09:41.652 INFO [] [] [main] INFO org.springframework.boot.SpringApplication : The following profiles are active: dev,prod,test
1.6 刷新配置
NacosConfigAutoConfiguration
该类想容器注册NacosContextRefresher
负责刷新配置,配置文件刷新日志如下
2023-07-11 13:05:19.669 INFO [] [] [nacos.client.cachedata.internal.notifier] INFO org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-shrimp-paste-prod.properties,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shrimp-paste.properties,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shrimp-paste,SHRIMP_PASTE_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-redisson.properties,SHRIMP_PASTE_COMMON_GROUP'}]
2023-07-11 13:05:19.858 INFO [] [] [nacos.client.cachedata.internal.notifier] INFO org.springframework.boot.SpringApplication : The following profiles are active: prod
2023-07-11 13:05:19.876 INFO [] [] [nacos.client.cachedata.internal.notifier] INFO org.springframework.boot.StartupInfoLogger : Started application in 1.128 seconds (JVM running for 132.472)
2023-07-11 13:05:22.987 INFO [] [] [nacos.client.cachedata.internal.notifier] INFO org.springframework.cloud.endpoint.event.RefreshEventListener : Refresh keys changed: []
1.7 健康检查
NacosConfigEndpointAutoConfiguration
该类注册NacosConfigEndpoint
(actuator端点)和NacosConfigHealthIndicator
(健康检查)