nacos使用_程序员你是如何使用Nacos作为配置中心的?

本文介绍如何使用Spring Cloud Alibaba Nacos作为配置中心,实现微服务的外部化配置管理。涵盖集成步骤、配置优先级及共享配置文件的应用。
b00dbe4c-e046-4b65-accf-50cc357c0e6b

假如你使用的是spring-cloud-alibaba微服务技术栈

单个服务独有配置文件

即去除应用程序的状态,配置统一外部化管理,方便进行水平的伸缩。

集成步骤:假如我有一个应用app-design;

1,引入依赖:

com.alibaba.cloud     spring-cloud-starter-alibaba-nacos-config     2.2.1.RELEASE

2, 配置文件;

spring.cloud.nacos.config.enabled=truespring.cloud.nacos.config.refresh-enabled=truespring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr}spring.cloud.nacos.config.namespace=${spring.cloud.nacos.discovery.namespace}

说明如下:

2023d48ae7504cf7ab37b6bac53f6599

3,使用配置的方式,同本地配置文件一样。

@Value @PropertyConfiguration 这些注解都是支持的;

4,确认方式,比如把之前的application.properties的配置放到了配置中心;

c81f584bdd67445ea1043d6356b88a51

本地启动的时候,读取到了8081端口和数据库连接池的配置;

329aa57d1ca74ad2ae67940140a56f0f

配置中心的连接原理,后面单独整理出来,知其然并知其所以然。

服务之间共享配置文件

场景:多个后端微服务,在同一个集群中共用中间件的配置信息。

比如 缓存redis, 消息队列kafka, 文件服务器, 邮件服务器;

那么对应的配置文件没有必要在所有的后端微服务中单独存在,这些配置文件应该放在公共配置文件中,但是也可以被具体的后端微服务自己的独有配置文件覆盖,使用自己的私有配置;

可结合下图理解:

e8ec70ec73a14dd4886cb4224bac101b
6cd7e3f3ba844b53a2ae935f33b850bf

下面是实际的coding过程和测试用例;

在服务对应的nacos的namespace中

1 引入共享配置

#共享中间件的配置spring.cloud.nacos.config.shared-configs[0].data-id=mid.propertiesspring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUPspring.cloud.nacos.config.shared-configs[0].refresh=true

位置:

模块start下的src/main/resources/bootstrap.properties文件中

自描述的配置信息,即引入的共享配置文件列表有哪些,可以按照需要,配置各种中间件的配置信息;

cd993c32c98248018c86e90ec7ff284e

花括号[0] ,里面的0是序号,如果有多个,按照数字自增顺序进行配置;

2 在nacos中新增配置文件

根据实际场景在nacos的test命名空间中新增配置文件mid.properties

616ea3c1a16d4a81abd3b6233d36d785

3 获取配置用例测试

测试接口代码:

 @ApiOperation("测试获取公共配置文件")    @GetMapping("/config/test")    public Response config(){        String redisConfigServers = environment.getProperty("redis.config.servers","null");        return SingleResponse.of(redisConfigServers);    }

测试用例:

6fcc27de30b34d46b0ca4d67999c1141

截图如下:

1ed1e0cf38764f02898ceb7ed67d82c0
756d7e03169a4c20a0d3ac3a323b3ce1
4f7e095c6390405d8f1072fbcbd07339

源码分析

掌握用法之后,深入分析源码,知其然而知其所以然;

starter调用封装

使用的starter封装;

[https://github.com/alibaba/spring-cloud-alibaba/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config](https://github.com/alibaba/spring-cloud-alibaba/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config)

版本: 2.2.1.RELEASE

启动的时候自动装配的配置如下:

org.springframework.cloud.bootstrap.BootstrapConfiguration=com.alibaba.cloud.nacos.NacosConfigBootstrapConfigurationorg.springframework.boot.autoconfigure.EnableAutoConfiguration=com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfigurationorg.springframework.boot.diagnostics.FailureAnalyzer=com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer

分解一下key,看一下用途:

2e2dea933cf84eaba4126c9e033a78dc

然后看看都自动装配了什么?以及自动装配的过程。

springboot的方式调用;

1 NacosConfigBootstrapConfiguration

源码:

package com.alibaba.cloud.nacos;import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author xiaojing */@Configuration(proxyBeanMethods = false)@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)public class NacosConfigBootstrapConfiguration {@Bean@ConditionalOnMissingBeanpublic NacosConfigProperties nacosConfigProperties() {return new NacosConfigProperties();}@Bean@ConditionalOnMissingBeanpublic NacosConfigManager nacosConfigManager(NacosConfigProperties nacosConfigProperties) {return new NacosConfigManager(nacosConfigProperties);}@Beanpublic NacosPropertySourceLocator nacosPropertySourceLocator(NacosConfigManager nacosConfigManager) {return new NacosPropertySourceLocator(nacosConfigManager);}}

自动装配流程:

f8d0fe720d2d4cee95f1e2031d06ab9a

配置文件组装源码:

@Overridepublic PropertySource> locate(Environment env) {nacosConfigProperties.setEnvironment(env);ConfigService configService = nacosConfigManager.getConfigService();if (null == configService) {log.warn("no instance of config service found, can't load config from nacos");return null;}long timeout = nacosConfigProperties.getTimeout();nacosPropertySourceBuilder = new NacosPropertySourceBuilder(configService,timeout);String name = nacosConfigProperties.getName();String dataIdPrefix = nacosConfigProperties.getPrefix();if (StringUtils.isEmpty(dataIdPrefix)) {dataIdPrefix = name;}if (StringUtils.isEmpty(dataIdPrefix)) {dataIdPrefix = env.getProperty("spring.application.name");}CompositePropertySource composite = new CompositePropertySource(NACOS_PROPERTY_SOURCE_NAME);loadSharedConfiguration(composite);loadExtConfiguration(composite);loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env);return composite;}
a3e98d1659884c24a6c6488477773558

加载应用配置文件的顺序源码:

private void loadApplicationConfiguration(CompositePropertySource compositePropertySource, String dataIdPrefix,NacosConfigProperties properties, Environment environment) {String fileExtension = properties.getFileExtension();String nacosGroup = properties.getGroup();// load directly once by defaultloadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup,fileExtension, true);// load with suffix, which have a higher priority than the defaultloadNacosDataIfPresent(compositePropertySource,dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true);// Loaded with profile, which have a higher priority than the suffixfor (String profile : environment.getActiveProfiles()) {String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,fileExtension, true);}}

顺序如下:

719ef11458bd45a4a9af7210c87b200f

2.1 NacosConfigAutoConfiguration

d374f8e9d7794f6c9b4497b3c0d9b045

2.2 NacosConfigEndpointAutoConfiguration

NacosConfigEndpoint

本地配置同步逻辑

@ReadOperationpublic Map invoke() {Map result = new HashMap<>(16);result.put("NacosConfigProperties", properties);List all = NacosPropertySourceRepository.getAll();List> sources = new ArrayList<>();for (NacosPropertySource ps : all) {Map source = new HashMap<>(16);source.put("dataId", ps.getDataId());source.put("lastSynced", dateFormat.get().format(ps.getTimestamp()));sources.add(source);}result.put("Sources", sources);result.put("RefreshHistory", refreshHistory.getRecords());return result;}

NacosConfigHealthIndicator

健康检查 UP,DOWN,UNKNOWN ;

3 NacosConnectionFailureAnalyzer

连接不上nacos服务端抛出异常

@Overrideprotected FailureAnalysis analyze(Throwable rootFailure,NacosConnectionFailureException cause) {return new FailureAnalysis("Application failed to connect to Nacos server: ""+ cause.getServerAddr() + ""","Please check your Nacos server config", cause);}

小结:服务通过集成该starter,通过http请求从nacos的服务端拉取配置数据,并做了 配置刷新历史,注册监听器到spring容器中, 本地缓存,和错误报告;

服务端封装

源码位置:[https://github.com/alibaba/nacos/tree/develop/config](https://github.com/alibaba/nacos/tree/develop/config)

应用启动读取配置文件整体调用链:待后续完成;

小结

如果读完本篇文章你只能记住一句话:nacos作为配置中心可为单独的服务提供外部化配置文件,也支持多应用共享配置文件。

从nacos的客户端源码分析中可看到一些配置优先级的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值