首页 » 软件开发 » 分布式系统进阶十八之Nacos 配置中心详解(配置进阶微服优先级多个)「nacos配置中心原理」

分布式系统进阶十八之Nacos 配置中心详解(配置进阶微服优先级多个)「nacos配置中心原理」

admin 2024-07-24 04:26:48 软件开发 0

扫一扫用手机浏览

文章目录 [+]

在Nacos配置中心的控制台上,您可以对这个配置集进行管理,并在需要时进行更新,这些更改将自动同步到您的应用程序中。

配置中心

对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护。
微服务的配置管理一般有以下需求:

1、集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。

分布式系统进阶十八之Nacos 配置中心详解(配置进阶微服优先级多个) 分布式系统进阶十八之Nacos 配置中心详解(配置进阶微服优先级多个) 软件开发
(图片来自网络侵删)

2、不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。

3、运行期间可动态调整。
例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等

分布式系统进阶十八之Nacos 配置中心详解(配置进阶微服优先级多个) 分布式系统进阶十八之Nacos 配置中心详解(配置进阶微服优先级多个) 软件开发
(图片来自网络侵删)

4、配置修改后可自动更新。
如配置内容发生变化,微服务可以自动更新配置

综上所述对于微服务架构而言,一套统一的,通用的管理配置机制是不可缺少的重要部分。
常见的做法就是通过配置服务器进行管理

添加依赖

在开发前,我们先添加 spring-cloud-starter-alibaba-nacos-config 依赖

<!-- nacos 配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.5.RELEASE</version></dependency>

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。
版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

在bootstrap.yml 中添加 Nacos 连接配置

配置文件将application改成bootstrap,application.yml作用域在于当前应用有效,bootstrap.yml系统级别的配置有效(一般采用远程配置的时候才会用到)。

spring: profiles: prod #nacos cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yaml prefix: user namespace: 22306c22-a15f-g472-853e-39ea2aeb1611 username: nacos password: testlist 配置方式

配置用户列表

java代码:

@Data@Component@RefreshScope@ConfigurationProperties(prefix = "app.demo")public class AppConfig {private List<String> userList;}map 配置方式

配置用户名和手机号码关系

java代码:

@Data@Component@RefreshScope@ConfigurationProperties(prefix = "app.demo")public class AppConfig {private Map<String, String> userMap;}set 配置方式

java代码:

@Data@Component@RefreshScope@ConfigurationProperties(prefix = "app.demo")public class AppConfig {private List<String> userSet;}共享配置(shared-configs)和扩展配(extension-config)

日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,kafka 连接信息,xxl-job配置信息,监控配置等等。
那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能,Nacos Config 也确实支持。

Nacos在配置路径spring.cloud.nacos.config.extension-config下,允许我们指定⼀个或多个额外配置。
Nacos在配置路径spring.cloud.nacos.config.shared-configs下,允许我们指定⼀个或多个共享配置。

上述两类配置都⽀持三个属性:data-id、group(默认为字符串DEFAULT_GROUP)、refresh(默认为true)。

NacosConfigProperties 配置类定义[核心代码]

@ConfigurationProperties("spring.cloud.nacos.config")public class NacosConfigProperties { public static final String PREFIX = "spring.cloud.nacos.config"; public static final String COMMAS = ","; public static final String SEPARATOR = "[,]"; private static final Pattern PATTERN = Pattern.compile("-(\\w)"); private static final Logger log = LoggerFactory.getLogger(NacosConfigProperties.class); @Autowired @JsonIgnore private Environment environment; private String serverAddr; private String username; private String password; private String encode; private String group = "DEFAULT_GROUP"; private String prefix; private String fileExtension = "properties"; private int timeout = 3000; private String maxRetry; private String configLongPollTimeout; private String configRetryTime; private boolean enableRemoteSyncConfig = false; private String endpoint; private String namespace; private String accessKey; private String secretKey; private String contextPath; private String clusterName; private String name; private List<Config> sharedConfigs; private List<Config> extensionConfigs; private boolean refreshEnabled = true; public static class Config { private String dataId; private String group; private boolean refresh; }}

配置栗子

common-xxl-job.yml 配置

XxlJobConfig 类定义

/ xxl-job 配置 @author yangyanping @date 2024-06-13 /@Data@Slf4j@Component@RefreshScope@Configurationpublic class XxlJobConfig { private final Environment environment; public XxlJobConfig(Environment environment) { this.environment = environment; } @Bean @ConfigurationProperties(prefix = "xxl.job") public XxlJobProperties xxlJobProperties() { return new XxlJobProperties(); } @Bean public XxlJobSpringExecutor xxlJobExecutor(@Autowired XxlJobProperties properties) { log.warn("xxl-job#addresses={},port={},accessToken={}", properties.getAddresses(), properties.getPort(), properties.getAccessToken()); XxlJobSpringExecutor executor = new XxlJobSpringExecutor(); executor.setAdminAddresses(properties.getAddresses()); executor.setAppname(environment.getProperty("spring.application.name")); executor.setPort(properties.getPort()); executor.setAccessToken(properties.getAccessToken()); log.warn("xxl-job#addresses={},port={},accessToken={},appName={}", properties.getAddresses(), properties.getPort(), properties.getAccessToken(), environment.getProperty("spring.application.name")); return executor; } @Data @ToString public static class XxlJobProperties { private String addresses; private int port; private String accessToken; }}

spring: profiles: prod cloud: nacos: config: server-addr: 127.0.0.1:8848 # 配置中心地址,集群的话多个节点使用,分隔 username: nacos password: test namespace: 22306c22-a15f-g472-853e-39ea2aeb1611 group: DEFAULT_GROUP # 指定要获取配置的组 # 用于共享的配置文件 shared-configs: - data-id: common-xxl-job.yaml group: DEFAULT_GROUP refresh: true - data-id: common-kafka.yaml group: DEFAULT_GROUP refresh: true - data-id: common-mysql.yaml group: DEFAULT_GROUP refresh: true - data-id: common-redis.yaml group: DEFAULT_GROUP refresh: true # 常规配置文件 # 优先级大于 shared-configs,在 shared-configs 之后加载 extension-configs: - data-id: user.yaml group: DEFAULT_GROUP refresh: true

参数解析:

data-id : Data Idgroup:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。
默认是不支持的。

注意:这里的Data ID后面是加.yaml后缀的,且不需要指定file-extension。

共享配置和扩展配置的区

实际上,Nacos中并未对extension-configs和shared-configs的差别进⾏详细阐述。
我们从他们的结构,看不出本质差别;除了优先级不同以外,也没有其他差别。
那么,Nacos项⽬组为什么要引⼊两个类似的配置呢?我们可以从当初该功能的需求(issue)上找到其原始⽬的。

Nacos对配置的默认理念

namespace区分环境:开发环境、测试环境、预发布环境、⽣产环境。
group区分不同应⽤:同⼀个环境内,不同应⽤的配置,通过group来区分。

主配置是应⽤专有的配置

因此,主配置应当在dataId上要区分,同时最好还要有group的区分,因为group区分应⽤(虽然dataId上区分了,不⽤设置group也能按应⽤单独加载)。

要在各应⽤之间共享⼀个配置,请使⽤上⾯的 shared-configs

因此按该理念,shared-configs指定的配置,本来应该是不指定group的,也就是应当归⼊DEFAULT_GROUP这个公共分组。

关于优先级

1、上述两类配置都是数组,对同种配置,数组元素对应的下标越⼤,优先级越⾼。
也就是排在后⾯的相同配置,将覆盖排在前⾯的同名配置。

同为扩展配置,存在如下优先级关系:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0]。
同为共享配置,存在如下优先级关系:shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]。

2、不同种类配置之间,优先级按顺序如下:主配置 > 扩展配置(extension-configs) > 共享配置(shared-configs)

标签:

相关文章