nacos的配置中心
本章节主要是学习nacos的配置中心的使用,nacos里面可以存放配置文件,那么我们如何在项目里面使用(或者引入)这些配置文件呢?
什么是配置中心?
关于配置,在开发过程中大家都十分熟悉,服务器的正常启动都需要对应的配置文件去配置一些启动参数、变量信息、数据源信息、第三方链接信息等,不同服务器它的配置有所差别。在微服务项目中,多机器、多应用、多实例的情况下就会有大量的配置文件,这些配置文件相对分散,如果我们需要更改某个配置信息,那么我们需要到该服务下面去找配置文件,如果某个服务启动了多个实例,那么我们需要该每一个实例的配置文件,这将变得非常繁琐。
配置中心呢就是将这些文件集中起来统一管理,它将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
主要功能
集中化配置管理:
- 将分散在各个服务中的配置文件统一存储
- 提供统一的配置管理界面和API
动态配置更新:
- 支持运行时动态更新配置
- 配置变更后自动推送到相关服务
环境隔离:
- 支持不同环境(开发、测试、生产)的配置隔离
- 防止配置混淆和误操作
版本管理:
- 记录配置变更历史
- 支持配置回滚操作
配置中心的优势
- 降低维护成本:避免在多个服务中手动修改相同配置
- 提高可靠性:减少因配置错误导致的故障
- 增强灵活性:支持配置的动态调整,无需重启服务
- 安全性:敏感配置可以加密存储和传输
常见配置中心产品
- Nacos:阿里巴巴开源的配置中心和注册中心
- Spring Cloud Config:Spring Cloud官方的配置中心解决方案
- Apollo:携程开源的配置管理中心
- Consul:HashiCorp的分布式服务发现和配置管理工具
nacos配置中心简单介绍:
命名空间你可以看作是一个目录,一个目录下会有很多文件,每个文件也有对应的分组,其实分组也可以看作是子目录,某个命名空间下的某个分组下的某个配置文件。
命名空间的主要作用就是用来区分环境,在我们实际项目中比如数据源我们不可能都用正式环境的,也不会分成生产环境(prod),开发环境(dev),测试环境(test),不同环境配置的数据源不一样,所以我们想要使用不同环境的配置就只需要切换命名空间就可以了。
创建命名空间:(随便创建一个命名空间用于测试)
创建或导入配置文件:
nacos配置中心的简单使用
搜先我们创建一个service-provider项目,我使用的SpringBoot版本是3.2.0,spring cloud alibaba是2023.0.0,这些在父工程里面引入了对应的版本,此处省略,直接展示子工程service-provider的依赖导入
引入一些基础依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--Spring Cloud Alibaba Nacos discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.4</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version><exclusions><exclusion><artifactId>com.mybatis</artifactId><groupId>mybatis-spring</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.6.RELEASE</version></dependency>
首先我们看一下正常没有用配置中心的application.yml文件配置:
server:port: 9993spring:application:name: service-provider1data:redis:database: 1host: localhostport: 6379datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8username: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848namespace: 0f8cf46a-2f2b-4f43-934d-e4a511d47d91group: DEFAULT_GROUPusername: nacospassword: nacosloadbalancer:ribbon:enabled: falsenacos:enabled: true
logging:level:com.alibaba.cloud.nacos: debug
mybatis-plus:mapper-locations: classpath:mappers/**.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在我们使用nacos配置中心时需要引入一些必要依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></dependency><!--开启Spring Cloud 应用程序启动时加载bootstrap配置文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
nacos配置中心创建了两个配置文件service-provider1.yaml和redis-config.yaml文件如下
service-provider1:
redis-config:
如何在项目下引入这两个配置文件?
我们需要创建一个bootstrap.yml文件,配置如下:
spring.cloud.nacos.config是用来配置nacos配置中心的地址的 ,本地 bootstrap.yml 中至少需要保留连接Nacos的基本配置,其实spring.cloud.nacos.discovery也可以放到配置中心去.
这样就成功引入了service-provider1.yaml和redis-config.yaml文件,那有人会说redis-config确实是在extension-configs扩展配置那里引入了,service-provider1.yaml这么都没有引入?
那是因为bootstrap.yml里面没有配置spring.cloud.nacos.config.prefix,默认使用 spring.application.name 作为配置文件前缀,会到nacos配置中心里面读取与应用同名的配置文件,如果你想使用别的文件名可以通过配置spring.cloud.nacos.config.prefix来配置
一般情况呢一些服务特有的配置会放在应用同名的配置文件里面,像一些可以通用的配置比如说redis、dubbo的配置或者其他通用数据配置可以单独放在一个配置文件里面,这样其他服务也可以通过extension-configs或者share-configs来添加配置,个人认为extension-configs和share-configs没有太大区别。
小知识补充:
配置文件加载顺序:
无Nacos情境下 Spring Boot 的启动过程:
启动-->读取bootstrap.yml配置文件(本地没有就加载默认的)-->读取项目本地配置文件application.yml-->创建Spring容器-->加载Bean
有Nacos情境下 Spring Boot 的启动过程:
启动-->读取bootstrap.yml配置文件(本地没有就加载默认的)-->读取Nacos的配置文件-->读取项目本地配置文件application.yml-->创建Spring容器-->加载Bean
上面这样配置呢我们发现还是有一点问题,如果我们需要修改nacos配置,那如果启动了多台机器,多个实例那我们还得到每个服务其下面去找到bootstrap.yml文件修改,所以我们做一点优化
我们可以通过变量的的形式来配置nacos
首先我们在maven的setting.xml里面添加环境配置
<profiles> <profile><!-- 本地环境--><id>local</id><properties><config.profiles.active>local</config.profiles.active><config.nacos.discovery>127.0.0.1:8848</config.nacos.discovery><config.nacos.config>127.0.0.1:8848</config.nacos.config><config.nacos.namespace>0f8cf46a-2f2b-4f43-934d-e4a511d47d91</config.nacos.namespace><config.nacos.username>nacos</config.nacos.username><config.nacos.password>nacos</config.nacos.password></properties><!-- 默认开启这个配置 --><activation><activeByDefault>true</activeByDefault></activation></profile><profile><!-- 测试环境--><id>dev</id><properties><config.profiles.active>dev</config.profiles.active><config.nacos.discovery>192.168.3.109:8848</config.nacos.discovery><config.nacos.config>192.168.3.109:8848</config.nacos.config><config.nacos.namespace>a3ec6f85-774d-486d-abf7-4c996b5fc6f2</config.nacos.namespace><config.nacos.username>nacos</config.nacos.username><config.nacos.password>nacos</config.nacos.password></properties></profile>
</profiles>
通过
<activation><activeByDefault>true</activeByDefault></activation>
来选择使用哪个环境配置
修改bootstrap.yml文件:
yzz:nacos:discovery: '@config.nacos.discovery@'config: '@config.nacos.config@'namespace: '@config.nacos.namespace@'username: '@config.nacos.username@'password: '@config.nacos.password@'spring:application:name: service-provider1cloud:nacos:config:server-addr: ${yzz.nacos.config} #配置中心nacos地址username: ${yzz.nacos.username}password: ${yzz.nacos.password}namespace: ${yzz.nacos.namespace} #命名空间group: DEFAULT_GROUPfile-extension: yaml #配置文件格式extension-configs: #扩展配置- data-id: redis-config #配置文件dataIdrefresh: true #是否自动刷新discovery:server-addr: ${yzz.nacos.discovery}namespace: ${yzz.nacos.namespace}group: DEFAULT_GROUPusername: ${yzz.nacos.password}password: ${yzz.nacos.namespace}
其中@xxxx@是占位符,它会将@xxxx@替换成setting.xml对应的配置,${}也是占位符的意思,会把里面的变量替换成实际变量的值。
注意要使占位符起作用还需要在pom.xml文件里面添加 <filtering>true</filtering>
目的是启用资源过滤功能允许在构建过程中替换资源文件中的占位符
还有其他一些细节配置可以自行实践