Nacos配置中心
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能。
1.配置中心的基本使用
1.1 创建项目config-client-a
<?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.powernode</groupId><artifactId>naocs-client-config</artifactId><version>0.0.1-SNAPSHOT</version><name>03-naocs-client-config</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.8</spring-boot.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version></properties><dependencies><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依赖才会取读bootstrap.yml文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.1.1</version></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><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><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></project>
1.2在NacosServer里面添加一个配置文件
1.3查看数据库mysql
打开数据库nacos我们添加的配置文件就是插入到数据库里面的一条数据
1.4添加配置文件bootstrap.yml
bootstrap.yml 比application有更高的优先级。
server:port: 8080
spring:application:name: config-client-acloud:nacos:config: #指定配置中心的地址和配置中心使用的数据格式server-addr: localhost:8848file-extension: properties
1.5读取配置文件的内容
在项目中添加一个实体类Hero,映射配置文件属性
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component // 添加到IOC中,一会在controller注入
@RefreshScope // 刷新的域,当远程配置文件修改后可以动态刷新
public class Hero {@Value("${hero.name}")private String name;@Value("${hero.age}")private Integer age;@Value("${hero.address}")private String address;}
添加控制器,读取对象hero的属性
@RestController
public class HeroController {@Autowiredprivate Hero hero;@GetMapping("heroInfo")public String heroInfo() {return hero.getName() + ":" + hero.getAge() + ":" + hero.getAddress();}
}
1.6测试配置文件动态修改
(1)测试发现,确实能读取到远程配置文件的内容
(2)修改远程配置文件的内容,无需重启,刷新浏览器,读取到修改之后的配置内容,
(3) 动态刷新,依赖于@RefreshScope 注解
注意:远程 config配置文件可以查看历史版本,可以回滚,功能比较强大。
2.配置文件的读取方式
nacos配置中心通过namespace、dataId和group来唯一确定一条配置。
Namespace:即命名空间。默认的命名空间为public,我们可以在Nacos控制台中新建命名空间;
dataId:即配置文件名称
group:即配置分组,默认为DEFAULT_GROUP,可以通过spring.cloud.nacos.config.group配置。其中:dataId 是最关键的配置字段:格式如下:${prefix} - {spring.profiles.active} . {file-extension} 说明:
prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置;spring.profiles.active即为当前环境对应的profile。注意,当spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变成{prefix}.{file-extension};file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。
这就是上面我们为什么能获得到配置的原因了。
3.配置文件划分
Nacos配置中心的namespace、dataId和group可以方便灵活地划分配置。比如,我们现在有一个项目需要开发,项目名称为powernode,项目开发人员分为两个组:GROUP_A和GROUP_B,项目分为三个环境:开发环境dev、测试环境test和生产环境prod
powernode->GRUOR_A->dev
3.1添加命名空间
在nacos配置中心新建一个powernode的命名空间,生成了一个id,要记住这个id:5510ef39-ca9a-4f5d-87ba-7fb2afbf7035。
添加配置config-client-dev.yml
3.2修改配置文件bootstrap.yml
server:port: 8080
spring:application:name: config-client-acloud:nacos:config:server-addr: localhost:8848namespace: 5510ef39-ca9a-4f5d-87ba-7fb2afbf7035 # 命名空间 注意使用 idgroup: GROUP_A # 组别prefix: config-client # 配置文件前缀,如果不写 默认使用${spring.application.name}的值file-extension: yml # 后缀 文件格式profiles:active: dev # spring的环境配置
3.3重启测试
读取到新的配置信息。
4.获取多配置文件
除了通过上面的方式指定一个唯一配置外,我们还可以同时获取多个配置文件的内容。
提供这个功能 可以再次封装和抽象配置文件管理
4.1 在Nacos中新建两个配置文件
在powernode命名空间,继续点击添加两个配置文件
(一)添加配置文件config-a.yml
组名:GROUP_A
hero:name: AAAage: 20
(二)添加配置文件config-b.yml
组名: GROUP_B
hero:address: 广州高塘石
(三)修改bootstrap.yml
server:port: 8080
spring:application:name: config-client-acloud:nacos:config:server-addr: localhost:8848namespace: 5510ef39-ca9a-4f5d-87ba-7fb2afbf7035 # 命名空间 注意使用 idextension-configs: # 配置多个配置文件 数组形式- data-id: config-a.yml # 配置id,必须要加文件后缀group: GROUP_A # 组别refresh: true # 是否支持刷新- data-id: config-b.ymlgroup: GROUP_Brefresh: false
说明:
spring.cloud.nacos.config.extension-configs[n].dataId,指定多个配置的dataId,必须包含文件格式,支持properties、yaml或yml;spring.cloud.nacos.config.extension-configs[n].group,指定分组;spring.cloud.nacos.config.extension-configs[n].refresh,是否支持刷新。上面的配置中,我们分别从DEFAULT_GROUP中获取了config-a.yml和config-b.yml配置内容,并且config-a.yml支持刷新,config-b.yml不支持刷新。注意:没有namespace的配置,言外之意就是Nacos目前还不支持多个配置指定不同的命名空间,只能在同一个命名空间使用。
5.共享配置
日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,RabbitMQ 连接信息,监控配置等等。那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能,Nacos Config支持。但是共享配置优先级低,所以如果是共享配置只需要写在shared-configs中指定的配置,相同的配置节如果在具体的配置文件中有了,则共享配置不生效.
server:port: 8081
spring:application:name: nacos-config-clientcloud:nacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosconfig:namespace: f017d27f-ae36-47bd-8da4-213f5cce1d1a # 命名空间file-extension: ymlgroup: A_GROUPprefix: nacos-config-clientshared-configs: # 共享配置文件 ---优先级低- data-id: application-dev.ymlgroup: GROUP_Aprofiles:active: dev
6.配置内容规划
6.1本地的bootstrap.yml
应用名称,配置文件中心,注册中心地址,读取的配置文件名称信息等
6.2远端的配置文件
应用端口,数据源配置,redis配置,MQ配置,mybatis,Swagger的配置,这些配置可能会随着项目部署发生变化,在远端存储在git上便于动态刷新
7.nacos集群
为了提高可用性,将注册中心/配置中心配置为集群,提高系统可用性
配置三个nacos,分别将端口改为8847,8848,8849,并将运行模式由standalone改为cluster,添加cluster.conf配置,分别添加三台服务器地址
#修改start.cmd文件中的启动模式
set MODE="cluster"
#修改cluster.conf中的集群配置
192.168.179.1:8847 192.168.179.1:8848 192.168.179.1:8849
#应用中,服务器地址改为
server-addr: localhost:8848, localhost:8847, localhost:8849
服务器配置自动同步,任何一台宕机都不影响应用的正常使用
将端口改为8847,8848,8849,并将运行模式由standalone改为cluster,添加cluster.conf配置,分别添加三台服务器地址
#修改start.cmd文件中的启动模式
set MODE="cluster"
#修改cluster.conf中的集群配置
192.168.179.1:8847 192.168.179.1:8848 192.168.179.1:8849
#应用中,服务器地址改为
server-addr: localhost:8848, localhost:8847, localhost:8849
服务器配置自动同步,任何一台宕机都不影响应用的正常使用