【Nacos】配置中心
目录
- 为什么需要配置中心?
- 快速上手
- 添加配置
- 获取配置
- 配置中心详解
- 设置命名空间
- Data Id
- 可能出现的问题
- 读取不到配置项
- No spring.config.import property has been defined
- NacosServer地址配置错误
除了注册中心和负载均衡之外,Nacos还是一个配置中心,具备配置管理的功能
Namespace的常用场景之一是不同环境的配置区分隔离.例如开发测试环境和生产环境的配置隔离
为什么需要配置中心?
当前项目的配置都在代码中,会存在以下问题
- 配置文件修改时,服务需要重新部署.微服务架构中,一个服务可能有成百个实例,个部署比较麻烦,且容易出错
- 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易冲突
配置中心就是对这些配置项进行统一管理.通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件,提高效率的同时,也降低了出错的风险
快速上手
通过接下来的操作,我们来初步认识Nacos配置中心的使用
参考文档:Nacos Spring Cloud 快速开始 Nacos config
添加配置
在Nacos控制台添加配置项: 配置管理 -> 配置列表 -> 创建配置
🔥注意:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的.默认是public也就是服务管理命名空间配置配置管理的命名空间
新建配置项
配置内容
nacos.config=public
说明:
- DataID设置为项目名称
- 配置内容的数据格式,目前只支持properties和yam类型
- 设置配置内容
获取配置
引入NacosConfig依赖
<dependency>
<groupId>comalibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--Springcoud2020.*之后版本需要引入bootstrap-->
<dependency>
<groupId>org·Springframeworkcloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置bootstrap.properties
微服务启动前,需要先获取nacos中配置,并与application.ym配置合并.在微服务运行之前,Nacos要求必须使用bootstrap.properties配置文件来配置NacosServer地址
spring·application.name=product-service
spring.cloud.nacos.config.server-addr=120.26.87.94:10020
或者使用bootstrap.yml
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 120.26.87.94:10020
spring·application.name
需要和nacos配置管理的DataID一致
spring·cloudnacos·configserver-addr
为NacosServer的地址
🔥注意:配置中心和注册中心的配置是隔离的
Nacos 配置中心:spring.cloud.nacos.config.server-addr
Nacos 注册中心:spring·cloud.nacosdiscovery·server-addr
我们这里来编写程序用来进行接口的调用
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope//配置热更新
@RestController
public class NacosController {
@Value("${nacos.config}")
private String nacosConfig;
@RequestMapping("/getConfig")
public String getConfig(){
return "从nacos获取配置项nacos.config: "+nacosConfig;
}
}
- @Value注解用于读取配置
- @RefreshScope配置热更新
接口测试
启动程序,访问接口:http://127.0.0.1:9090/getConfig
再在Nacos控制台修改一下配置,再次访问接口
配置中心详解
设置命名空间
Nacos配置管理的命名空间和服务列表的命名空间是分别设置的.默认是public
Nacos命名空间配置依然在bootstrap.properties
中进行配置
spring.cloud.nacos.config.namespace: fe1ccbc5-00b6-423e-bb48-6b699010641a
对应的yml文件配置:
spring:
cloud:
nacos:
config:
namespace: fe1ccbc5-00b6-423e-bb48-6b699010641a #配置中心的命名空间
命名空间的Id也可以观察到:
Data Id
DataId格式介绍:
在NacosSpringcloud中,dataId的完整格式如下:
${prefix}-${spring·profiles.activet}.${file-extension}
- prefix 默认为spring.application.name的值,也可以通过配置项
spring·coud·nacosconfig·prefix
来配置 - spring·profiles.active即为当前环境对应的profile.当spring·profiles.active为空时,对应的连接符也将不存在,datald的拼接格式变成
${prefix}.${file-extension}
- file-exetension为配置内容的数据格式,可以通过配置项
spring·cloud.nacos·config·file-extension
来配置。目前只支持properties和yaml类型.默认为properties.
在bootstrap.yml中添加spring·profiles.active 值
spring:
profiles:
active: dev
微服务启动时,会从Nacos读取多个配置文件:
${prefix}-${spring·profiles.activet}.${file-extension}
${prefix}.${file-extension}
${prefix}
通过观察日志我们也可以直观地看到
这三个日志文件的优先级:
product-service-dev.properties > product-service.properties > product-service
简单理解就是名字越长,优先级越高
简单进行一下配置:
别忘了进行配置文件的更改:
spring:
application:
name: product-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 120.26.87.94:10020
namespace: fe1ccbc5-00b6-423e-bb48-6b699010641a #配置中心的命名空间
再来访问接口:
删掉product-service-dev.properties再进行访问
删掉product-service.properties再访问
注意:
bootstrap.yml设置的配置格式必须和nacos控制台配置的数据格式保持一致
不设置配置格式(spring.cloud.nacos.config.file-extension)时,默认为properties
可能出现的问题
读取不到配置项
可能原因:
- 配置错误:检查配置DataID,配置格式,配置空间等
- 未引入依赖
No spring.config.import property has been defined
***************************
APPLICATION FAILED TO START
***************************
Description:
No spring.config.import property has been defined
Action:
Add a spring.config.import=nacos: property to your configuration.
If configuration is not required add
spring.config.import=optional:nacos: instead.
To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.
原因:bootstrap.properties是系统级的资源配置文件,用于程序执行更加早期配置信息读取.但是Springcloud2020.之后的版本把bootstrap禁用了,导致在读取文件的时候读取不到而报错,所以需要重新导入bootstrap包进来就可以了
NacosServer地址配置错误
报错信息如下:
2025-1-30T17:12:53.070+08:00 ERROR 14356 --- [t.remote.worker]
c.a.n.c.remote.client.grpc.GrpcClient : Server check fail, please check
server 127.0.0.1 ,port 11020 is available , error ={}
java.util.concurrent.ExecutionException:
com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io
exception
at
com.alibaba.nacos.shaded.com.google.common.util.concurrent.AbstractFuture.ge
tDoneValue(AbstractFuture.java:566) ~[nacos-client-2.2.1.jar:na]
at
com.alibaba.nacos.shaded.com.google.common.util.concurrent.AbstractFuture.ge
t(AbstractFuture.java:445) ~[nacos-client-2.2.1.jar:na]
// ...
Caused by: com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException:
UNAVAILABLE: io exception
at
com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.java:539)
~[nacos-client-2.2.1.jar:na]
at
com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClos
e(ClientCalls.java:544) ~[nacos-client-2.2.1.jar:na]
at
com.alibaba.nacos.shaded.io.grpc.internal.DelayedClientCall$DelayedListener$
3.run(DelayedClientCall.java:471) ~[nacos-client-2.2.1.jar:na]
// ...
Caused by:
com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChann
el$AnnotatedConnectException: Connection refused: no further information:
/127.0.0.1:11020
Caused by: java.net.ConnectException: Connection refused: no further
information
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
at
java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:
946) ~[na:na]
可能原因:
我们可能设置了错误的Nacos Server地址,检查一下是否填写了正确的Server地址