• Dubbo3-配置中心简析


    配置中心是dubbo3三大中心之一,在dubbo3的实例级服务注册发现中承担着配置管理的主要角色;dubbo3的配置中心有两种作用,一是类似于dubbo.properties文件一样,做为启动时配置参数加载,二是通过监听机制实现一些策略规则的动态变更。

    配置中心启动

    启动流程

    配置中心的启动入口在DefaultApplicationDeplyer.initialize()方法中,initialize()方法调用startConfigCenter()方法,时序图如下:
    在这里插入图片描述
    主要流程有:
    1、从环境配置(dubbo.properties,系统参数,jvm参数,springboot配置等)中读取配置中心的配置
    2、如果没有配置中心配置,则尝试使用注册中心做为配置中心
    3、刷新配置中心配置
    4、创建配置中心对应的DynamicConfiguration对象,并通过DynamicConfiguration对象尝试从配置中心获取类似dubbo.properties的配置覆盖掉现在有的配置(以zookeeper为例,分别有:/dubbo/config/dubbo/dubbo.properties 和 /dubbo/config/{applicationName}|dubbo.properties)。
    5、将配置中心对应的DynamicConfiguration添加天环境(Environment对象)中,与dubbo.properties,系统参数,jvm参数,springboot配置等配置配合使用。

    DynamicConfiguration

    该类型是配置中心的一个包装对象,抽象了配置中心的所有数据获取和动态变更监听功能,主要的方法有如下几个:

    • getProperties(String, String, long)
      dubbo3 在启动的时候通过该方法从配置中心获取配置文件的内容。
    • getProperty(String, Object)
      匹配单个配置项,用于内容小的配置项
    • getConfig(String, String, long)
      匹配特定的配置,用于内容多且复杂的富配置项。例如启动时的配置文件和治理规则等。
    • addListener(String, String, ConfigurationListener)/removeListener(String, String, ConfigurationListener)
      添加或者删除需要监听的治理规则和配置项的监听器,实现动态变更

    Environment配置

    该对象是dubbo3运行时的配置管理对象,几乎是所有的配置都在该类中维护,获取配置也基本上都是从该类获取。
    该类通过两个CompositeConfiguration对象来分别管理配置中心的配置和所有的配置(包含本地相关的配置),分别是Environment的defaultDynamicConfiguration字段和defaultDynamicGlobalConfiguration字段。

    • defaultDynamicConfiguration
      维护配置中心的DynamicConfiguration,在DefaultApplicationDeployer.startConfigCenter()方法中,将配置中心加载后,调用Environment.setDynamicConfiguration()方法传给Environment。

    • defaultDynamicGlobalConfiguration
      维护着全局的Configuration对象,在Environment.getDynamicGlobalConfiguration()方法创建,将defaultDynamicConfiguration添加在前,后再添加本地相关的Configuration对象,这样会优先读取配置中心的配置。

    本地相关的Configuration目前有六个,优先级从上到下:

    • systemConfiguration
      SystemConfiguration类型,从系统参数( System.getProperties()/System.getProperty() )中返回配置

    • environmentConfiguration
      EnvironmentConfiguration类型,从系统环境( System.getEnv() )中获取配置

    • appExternalConfiguration
      nmemoryConfiguration类型,有两处来源:
      1、配置中心对应的ConfigCenterConfug对应的appExternalConfiguration字段,该字段是Map类型
      2、从配置中心读取的应用的dubbo.properties内容 (以zookeeper配置中心为例,路径是/dubbo/config/{applicationName}/dubbo.properties)

    • externalConfiguration
      InmemoryConfiguration类型,有两处来源:
      1、配置中心对应的ConfigCenterConfug对应的externalConfiguration字段,该字段是Map类型
      2、从配置中心读取的dubbo.properties内容 (以zookeeper配置中心为例,路径是/dubbo/config/dubbo/dubbo.properties)

    • appConfiguration
      InmemoryConfiguration类型,应用的配置。在springboot框架下运行时,会加载springboot的application.yaml中的配置,由DubboInfraBeanRegisterPostProcessor.postProcessBeanFactory()触发

    • propertiesConfiguration
      PropertiesConfiguration类型,从dubbo.properties文件读取配置

    代码如下:

    @Override
    public void initialize() throws IllegalStateException {
        if (initialized.compareAndSet(false, true)) {
            this.propertiesConfiguration = new PropertiesConfiguration(scopeModel);
            this.systemConfiguration = new SystemConfiguration();
            this.environmentConfiguration = new EnvironmentConfiguration();
            this.externalConfiguration = new InmemoryConfiguration("ExternalConfig");
            this.appExternalConfiguration = new InmemoryConfiguration("AppExternalConfig");
            this.appConfiguration = new InmemoryConfiguration("AppConfig");
    
            loadMigrationRule();
        }
    }
    /**
     * There are two ways to get configuration during exposure / reference or at runtime:
     * 1. URL, The value in the URL is relatively fixed. we can get value directly.
     * 2. The configuration exposed in this method is convenient for us to query the latest values from multiple
     * prioritized sources, it also guarantees that configs changed dynamically can take effect on the fly.
     */
    public CompositeConfiguration getConfiguration() {
        if (globalConfiguration == null) {
            CompositeConfiguration configuration = new CompositeConfiguration();
            configuration.addConfiguration(systemConfiguration);
            configuration.addConfiguration(environmentConfiguration);
            configuration.addConfiguration(appExternalConfiguration);
            configuration.addConfiguration(externalConfiguration);
            configuration.addConfiguration(appConfiguration);
            configuration.addConfiguration(propertiesConfiguration);
            globalConfiguration = configuration;
        }
        return globalConfiguration;
    }
    
    public Configuration getDynamicGlobalConfiguration() {
        if (defaultDynamicGlobalConfiguration == null) {
            if (defaultDynamicConfiguration == null) {
                if (logger.isWarnEnabled()) {
                    logger.warn("dynamicConfiguration is null , return globalConfiguration.");
                }
                return getConfiguration();
            }
            defaultDynamicGlobalConfiguration = new CompositeConfiguration();
            defaultDynamicGlobalConfiguration.addConfiguration(defaultDynamicConfiguration); // 先添加配置中心的Configuration对象,使配置中心的配置优先级更高
            defaultDynamicGlobalConfiguration.addConfiguration(getConfiguration());	//再添加本地相关的配置
        }
        return defaultDynamicGlobalConfiguration;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    配置中心-zookeeper路径参考

    配置

    路径备注side维护意见
    /dubbo/config/dubbo/dubbo.propertiesdubbo配置,与dubbo.properties文件的功能一样,但影响范围是所有的dubbo应用provider
    consumer
    所有应用可见,该配置会影响dubbo的启动逻辑
    /dubbo/config/{applicationName}/dubbo.propertiesdubbo配置,与dubbo.properties文件一样,但只对指定的应用生效provider
    consumer
    对应应用可见,该配置会影响dubbo的启动逻辑
    /dubbo/config/dubbo.application.register-mode注册模式,所有应用provider所有应用可见,配置中心优先,默认是all,即应用级和接口级都会注册
    /dubbo/config/dubbo.application.migration.stepMigrationStepconsumer所有应用可见,配置中心优先,默认是APPLICATION_FIRST
    /dubbo/config/dubbo.service-discovery.migrationMigrationStepconsumer同/dubbo/config/dubbo.application.migration.step一样,当/dubbo/config/dubbo.application.migration.step没有获取到值时,会尝试从该配置项取值

    治理规则

    以下规则主要是为dubbo3的服务治理提供配置,会影响注册时URL参数以及RPC的URL参数和路由

    路径备注side
    /dubbo/config/dubbo/{applicationName}.configurators应用export时使用的configurators URL, 该路径会被RegistryProtocol\$ProviderConfigurationListener监听
    消费端应用订阅Dubbo Service时的configurators URL,该路径被ServiceDiscoveryRegistryDirectory\$ConsumerConfigurationListener监听
    provider
    consumer
    /dubbo/config/dubbo/{interface}:{version}:{group}.configurations接口的configurators URL,该路径会被RegistryProtocol\$ServiceConfigurationListener和ServiceDiscoveryRegistryDirectory\$ReferenceConfigurationListener监听provider
    consumer
    /dubbo/config/DUBBO_SERVICEDISCOVERY_MIGRATION/{applicationName}.migration应用的migration规则,该路由被MigrationRuleListener监听consumer
    /dubbo/config/dubbo/{interface}:{version}:{group}.condition-router条件路由规则,该路径被ServiceStateRouter监听consumer
    /dubbo/config/dubbo/{applicationName}.condition-router条件路由规则,该路径被AppStateRouter监听consumer
    /dubbo/config/dubbo/{providerApplicationName}.tag-routerprovider的标签路由规则,该路径被TagStateRouter监听consumer
    /dubbo/config/dubbo/{applicationName}.MESHAPPRULEmesh的路由规则, 该路径被MeshAppRuleListener监听consumer
  • 相关阅读:
    DispatcherServlet的功能简介说明
    CORS跨域资源共享+CORS的一系列响应头
    《C++Primer 中文第四版》 笔记
    Python 中元组和列表的根本区别是什么?
    LLVM编译安装
    从阿里云“数字证书管理服务”申请免费的SSL证书
    改名Meta,杀死Oculus,Facebook是押注元宇宙还是“金蝉脱壳”?
    JS备忘录
    阿里云交互式建模(DSW)的探索和踩坑
    时钟轮在 RPC 中的应用
  • 原文地址:https://blog.csdn.net/Mr_rain/article/details/125536965