Back to Javatutorial

Nacos

docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudAlibabaNacos源码分析:配置中心.md

1.0.08.1 KB
Original Source

Nacos

Nacosĵʹ

οٷgithub.com/alibaba/spr

Config

       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

ȼӸߵͣ

  1. nacos-config-product.yaml ׼

  2. nacos-config.yaml ̲ͬͬͨ

  3. ext-config: ͬ չ

  4. shared-dataids ͬͨ

@RefreshScope

@ValueעԻȡĵֵ޷̬֪޸ĺֵҪ@RefreshScopeע

@RestController
@RefreshScope
public class TestController {

    @Value("${common.age}")
    private String age;

    @GetMapping("/common")
    public String hello() {
        return age;
    }
}
ƴ

NacosԴ

ϸԴͼ

www.processon.com/view/link/6

ļܹ

ʹ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);
    }
}
ƴ

nacos config clientԴ

ĺĽӿ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 

nacos config serverԴ

dump

   ʱͻ 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