Nacos作为服务配置中心
以前我们使用配置中心:
我们把配置放到Github上,Config 作配置中心,Bus实现配置动态刷新
现在使用配置中心:
配置放到Nacos中,Nacos作配置中心,Nacos实现配置动态刷新
1. Nacos作为配置中心-基础配置
-
建Module【cloudalibaba-config-nacos-client3377】
-
改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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud2020</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-config-nacos-client3377</artifactId> <dependencies> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web + actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般基础配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </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> </dependencies> </project>
-
写YML
bootstrap.yml(也可使用bootstrap.properties)
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: 192.168.59.128:8848 #服务注册中心地址 config: server-addr: 192.168.59.128:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置,表示当前项目可以从Nacos中读取结尾为yaml的配置文件
application.yml
spring: profiles: active: dev
注:为什么要配置两个yml文件
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。 -
主启动
package com.atguigu.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
-
业务类
package com.atguigu.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope // 通过SpringCloud原生注解实现配置自动刷新 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
-
在Nacos中添加配置信息
设置Data Id的规则
官网:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
最终的公式:
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
注:公式中每项都代表客户端项目中配置文件中的内容。
在此处,spring.application.name和spring.cloud.nacos.config.file-extension对应于bootstrap.yml中的
spring: application: name: nacos-config-client cloud: nacos: config: file-extension: yaml #指定yaml格式的配置,表示当前项目可以从Nacos中读取结尾为yaml的配置文件
spring.profile.active对应于application.yml中的
spring: profiles: active: dev
-
测试
运行Nacos
运行cloudalibaba-config-nacos-client3377
在Nacos的配置管理中增加配置项
访问http://localhost:3377/config/info,获取到了配置信息
修改Nacos的配置管理中配置项的内容,再次访问http://localhost:3377/config/info
几秒后就改变了,说明实时刷新生效了。
2. Nacos作为配置中心-分类配置
用于解决多环境多项目管理的问题。
Nacos分类配置的分类设计思想类似Java里面的包名和类名,最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑上区分两个目标对象。
默认情况:
Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT
Nacos默认的命名空间是public,Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去。
Service就是微服务;一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ) ,给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是lnstance,就是微服务的实例。
2.1 多环境配置
改变application.yml中spring.profile.active
配置项的值,即可实现从Nacos中读取不同环境的配置文件
注:前提是保证Nacos中有相应的配置文件
2.2 多分组配置
bootstrap.yml中指定spring.cloud.nacos.config.group
配置项的值,即可实现从Nacos的不同分组下读取配置文件。
在Nacos中准备不同分组的两个同名的配置文件
bootstrap.yml中指定group参数即可实现读取不同分组的配置
2.3 多命名空间配置
命名空间:实现配置隔离
bootstrap.yml中指定spring.cloud.nacos.config.namespace
配置项的值,即可实现从Nacos的不同命名空间下读取配置文件。
在Nacos中新建两个命名空间
创建后的命名空间会显示在配置列表中
分别在dev和test命名空间下创建一个配置文件nacos-config-client-dev.yaml
内容分别是dev命名空间下的文件
config:
info: "nacos-config-client-dev.yaml, 59b5d080-4875-4c0a-84d3-6ee2fd322a26"
test命名空间下的文件
config:
info: "nacos-config-client-dev.yaml, b99117fd-a7bc-4a9d-9c79-426292b572c0"
bootstrap.yml中指定namespace参数即可实现读取不同命名空间的配置,namespace的值就是创建命名空间时生成的命名空间ID
多命名空间配置的应用场景
-
环境配置隔离
开发、生产、测试环境,每个环境一套配置
-
微服务配置隔离
每个微服务的配置通过命名空间区分
2.4 其他相关概念
-
配置集:一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
-
配置集ID:在Nacos中,就是Data ID
Nacos中的某个配置集的 ID。配置集 ID是组织划分配置的维度之一。Data lD通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID通常采用类Java包(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
-
配置分组
默认所有配置集都属于:DEFAULT_GROUP
同样一个配置集属于不同分组
3. 加载多配置集
具体的应用场景:拆分应用的配置到不同的配置集中
在bootstrap.properties/yml中添加如下配置
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
# 是否动态刷新
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis-plus.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
# 是否动态刷新
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
# 是否动态刷新
spring.cloud.nacos.config.extension-configs[2].refresh=true
4. 总结
- 使用Nacos作为配置中心后,获取配置的方法:SpringBoot任何从配置文件中获取值的方法在这都适用,如:@Value、@ConfigurationProperties......
- 配置中心中有的配置项优先使用配置中心的。
- 开发期间配置可以放在项目中,等项目上线,配置统一放到Nacos中即可。