docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudAlibabaNacos源码分析:配置中心.md
Nacos ģ Key ԪΨһȷ, NamespaceĬǿմռ䣨publicĬ DEFAULT_GROUP
֧õĶ̬
̬ˢʱµ EnviromentУÿһдEnviromentлȡ
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
while(true) {
//̬ˢʱµ EnviromentУÿһдEnviromentлȡ
String userName = applicationContext.getEnvironment().getProperty("common.name");
String userAge = applicationContext.getEnvironment().getProperty("common.age");
System.err.println("common name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
ƴ
֧profileȵ
spring-cloud-starter-alibaba-nacos-config ڼõʱ dataid Ϊ spring.application.name.{spring.application.name}.spring.application.name.{file-extension:properties} ΪǰĻãdataidΪ spring.application.name?{spring.application.name}-spring.application.name?{profile}.file?extension:propertiesĻá
ճµIJͬãͨSpringṩ{file-extension:properties} ĻáճµIJͬãͨSpring ṩ file?extension:propertiesĻáճµIJͬãͨSpringṩ{spring.profiles.active} á
spring.profiles.active=dev
ƴ
**֧Զ namespace **
ڽ⻧ȵø롣ͬռ£Դͬ Group Data ID áNamespace ijó֮һDzͬõָ룬翪Իʣáȡ
ûȷָ ${spring.cloud.nacos.config.namespace} õ£ Ĭʹõ Nacos Public namespaceҪʹԶռ䣬ͨʵ֣
spring.cloud.nacos.config.namespace=71bb9785-231f-4eca-b4dc-6be446e12ff8
ƴ
**֧Զ Group **
Group֯õά֮һͨһַ Buy Trade üз飬Ӷ Data ID ͬü Nacos ϴһʱδд÷ƣ÷Ĭϲ DEFAULT_GROUP ÷ijͬӦûʹͬͣ database_url ú MQ_topic á
ûȷָ ${spring.cloud.nacos.config.group} õ£ĬDEFAULT_GROUP ҪԶԼ Groupͨʵ֣
spring.cloud.nacos.config.group=DEVELOP_GROUP
ƴ
**֧Զչ Data Id **
Data ID ֯õά֮һData ID ͨ֯ϵͳüһϵͳӦÿüÿüԱһƱʶData ID ͨ Java com.taobao.tc.refund.log.level֤ȫΨһԡǿơ
ͨԶչ Data Id ãȿԽӦüù⣬ֿ֧һӦжļ
# Զ Data Id
#̵ͬͨ ֹ֧ DataId
spring.cloud.nacos.config.sharedConfigs[0].data-id= common.yaml
spring.cloud.nacos.config.sharedConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.sharedConfigs[0].refresh=true
# config external configuration
# ֧һӦö DataId
spring.cloud.nacos.config.extensionConfigs[0].data-id=ext-config-common01.properties
spring.cloud.nacos.config.extensionConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[0].refresh=true
spring.cloud.nacos.config.extensionConfigs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extensionConfigs[1].group=REFRESH_GROUP
ƴ
Spring Cloud Alibaba Nacos Config Ŀǰṩ Nacos ȡصá
A: ͨ spring.cloud.nacos.config.shared-configs ֶ֧ Data Id
B: ͨ spring.cloud.nacos.config.ext-config[n].data-id ķʽֶ֧չ Data Id
C: ͨڲع(ӦӦ+ Profile )Զص Data Id
ַʽͬʹʱǵһȼϵ:A < B < C
ȼӸߵͣ
nacos-config-product.yaml
nacos-config.yaml ̲ͬͬͨ
ext-config: ͬ չ
shared-dataids ͬͨ
@ValueעԻȡĵֵ̬֪ĺֵҪ@RefreshScopeע
@RestController
@RefreshScope
public class TestController {
@Value("${common.age}")
private String age;
@GetMapping("/common")
public String hello() {
return age;
}
}
ƴ
ϸԴͼ
ʹdemo
public class ConfigServerDemo {
public static void main(String[] args) throws NacosException, InterruptedException {
String serverAddr = "localhost";
String dataId = "nacos-config-demo.yaml";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
//ȡ÷
ConfigService configService = NacosFactory.createConfigService(properties);
//ȡ
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
//ע
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("===recieve:" + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
//
//boolean isPublishOk = configService.publishConfig(dataId, group, "content");
//System.out.println(isPublishOk);
//propertiesʽ
configService.publishConfig(dataId,group,"common.age=30", ConfigType.PROPERTIES.getType());
Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
// boolean isRemoveOk = configService.removeConfig(dataId, group);
// System.out.println(isRemoveOk);
// Thread.sleep(3000);
// content = configService.getConfig(dataId, group, 5000);
// System.out.println(content);
// Thread.sleep(300000);
}
}
ƴ
ĺĽӿConfigService
ȡõҪ NacosConfigService getConfig ͨ¸÷ֱӴӱļȡõֵļڻΪգͨ HTTP GET Զȡã浽ؿСͨ HTTP ȡԶʱNacos ṩ۶ϲԣһdzʱʱ䣬ԴĬΡ
Ŀͻ˻ͨעﵽʱִлصĹ
NacosConfigService#getConfigAndSignListener
ConfigService#addListener
Nacos ͨϷʽעڲʵ־ǵ ClientWorker addCacheDataIfAbsent CacheData һάעмʵе CacheData ClientWorker еԭ cacheMap УڲĺijԱУ
ClientWorker ͨµ̳߳óѯĹһǵ̵߳ executorÿ 10ms ÿ 3000 Ϊһȡѯ cacheData ʵװΪһ LongPollingTask ύڶ̳߳ executorService
ʱͻ DumpService init ݿ load ô洢ڱشϣһЩҪԪϢ MD5 ֵڴС˻ļбһʱ䣬жϵǴݿ dump ȫݻDzݣϴ 6h ڵĻ
ȫ dump Ȼմ̻棬Ȼ ID ÿȡһǧˢ̺ڴ档 dump ȡСʱãµĺɾģȰˢһڴļٸڴеȫȥȶһݿ⣬иıͬһΣȫ dump Ļһݿ IO ʹ IO
õĴλ ConfigController#publishConfigСȺһʼҲֻһ̨̨òMysqlнг־û˲ÿòѯȥ MySQL ǻ dump ڱļнû˵̨֮Ҫ֪ͨˢڴͱشеļݣᷢһΪ ConfigDataChangeEvent ¼¼ͨ HTTP ֪ͨмȺڵ㣨ļڴˢ¡
ͻ˻һѯȡ˵ñ˴LongPollingServiceУһ Runnable ΪClientLongPolling˻Ὣܵѯװһ ClientLongPolling һ AsyncContext Ӧͨʱ̳߳Ӻ 29.5s ִСȿͻ 30s ijʱʱǰ 500ms Ϊ̶ϱ֤ͻ˲Ϊʱɳʱ.
ߣƵŶ ӣhttps://juejin.cn/post/6999814668390760484 Դϡ ȨСҵתϵȨҵתע
https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA https://juejin.cn/post/6931922457741770760 https://github.com/D2C-Cai/herring http://c.biancheng.net/springcloud https://github.com/macrozheng/springcloud-learning