• 五:Dubbo中Provider参数配置及源码讲解


    dubbo.application.register-mode

    参数

    参数含义

    interface

    只接口级注册(/dubbo)

    instance

    只应用级注册(/service)

    all

    接口级注册与应用级注册并存(/dubbo && /service)

    dubbo.application.service-discovery.migration

    参数

    参数含义

    FORCE_INTERFACE

    只消费接口级地址,如无地址则报错,单订阅2.x地址

    APPLICATION_FIRST

    智能决策接口级还是应用级地址,双订阅 (先查询接口级 在查询应用级)

    FORCE_APPLICATION

    只消费应用级地址,如无地址则报错,单订阅3.x地址

    源码解析

    在上一节中有说到 服务启动流程 中会执行到不同版本的
    org.apache.dubbo.config.ServiceConfig#exportOnly
    或者
    org.apache.dubbo.config.ServiceConfig#export
    方法, 在方法内部调用
    List registryURLs = ConfigValidationUtils.loadRegistries(this, true);
    获取URL, 我们具体看下 该方法调用

    	//org.apache.dubbo.config.utils.ConfigValidationUtils#loadRegistries
        public static List loadRegistries(AbstractInterfaceConfig interfaceConfig, boolean provider) {
            // 此处调用是为了得到 register协议的URL
            //eg: registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=provider&client=curator&dubbo=2.0.2&pid=8093®istry=zookeeper&release=3.0.4×tamp=1640861452691
            List registryList = new ArrayList();
            ApplicationConfig application = interfaceConfig.getApplication();
            List registries = interfaceConfig.getRegistries();
            if (CollectionUtils.isNotEmpty(registries)) {
                for (RegistryConfig config : registries) {
                    String address = config.getAddress();
                    if (StringUtils.isEmpty(address)) {
                        address = ANYHOST_VALUE;
                    }
                    if (!RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {
                        Map map = new HashMap();
                        AbstractConfig.appendParameters(map, application);
                        AbstractConfig.appendParameters(map, config);
                        map.put(PATH_KEY, RegistryService.class.getName());
                        AbstractInterfaceConfig.appendRuntimeParameters(map);
                        if (!map.containsKey(PROTOCOL_KEY)) {
                            map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);
                        }
                        List urls = UrlUtils.parseURLs(address, map);
    
                        for (URL url : urls) {
                            url = URLBuilder.from(url)
                                .addParameter(REGISTRY_KEY, url.getProtocol())
                                .setProtocol(extractRegistryType(url))
                                .setScopeModel(interfaceConfig.getScopeModel())
                                .build();
                            if ((provider && url.getParameter(REGISTER_KEY, true))
                                || (!provider && url.getParameter(SUBSCRIBE_KEY, true))) {
                                registryList.add(url);
                            }
                        }
                    }
                }
            }
            //此处会对register-mode做判断
            return genCompatibleRegistries(interfaceConfig.getScopeModel(), registryList, provider);
        }
    
    
    	//org.apache.dubbo.config.utils.ConfigValidationUtils#genCompatibleRegistries
        private static List genCompatibleRegistries(ScopeModel scopeModel, List registryList, boolean provider) {
            List result = new ArrayList<>(registryList.size());
            registryList.forEach(registryURL -> {
            	//判断是否为 provider
                if (provider) {
                    String registerMode;
                    //判断是否为 service-discovery-registry 协议
                    if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())) {
                        //获取定义的register-mode值
                        registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getCachedDynamicProperty(scopeModel, DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INSTANCE));
                        if (!isValidRegisterMode(registerMode)) {
                            registerMode = DEFAULT_REGISTER_MODE_INSTANCE;
                        }
                        result.add(registryURL);
                        //判断register_mode 是否 为all模式 并且 registryURL不是registry协议
                        if (DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode)
                            && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) {
                            URL interfaceCompatibleRegistryURL = URLBuilder.from(registryURL)
                                .setProtocol(REGISTRY_PROTOCOL)
                                .removeParameter(REGISTRY_TYPE_KEY)
                                .build();
                            result.add(interfaceCompatibleRegistryURL);
                        }
                    } else {
                    	//进来此处说明 registryURL的协议为 registry
                    	
                    	//获取定义的register-mode值
                        registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getCachedDynamicProperty(scopeModel, DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_ALL));
                        if (!isValidRegisterMode(registerMode)) {
                            registerMode = DEFAULT_REGISTER_MODE_INTERFACE;
                        }
                        //如果register-mode的值定义的为 instance 或 all
                        if ((DEFAULT_REGISTER_MODE_INSTANCE.equalsIgnoreCase(registerMode) || DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode))
                            && registryNotExists(registryURL, registryList, SERVICE_REGISTRY_PROTOCOL)) {
                            //封装为service-discovery-registry协议
                            URL serviceDiscoveryRegistryURL = URLBuilder.from(registryURL)
                                .setProtocol(SERVICE_REGISTRY_PROTOCOL)
                                .removeParameter(REGISTRY_TYPE_KEY)
                                .build();
    					     //将service-discovery-registry协议的URL加入到集合
    					     result.add(serviceDiscoveryRegistryURL);
                        }
    					//如果register-mode的值定义的为 interface 或 all
                        if (DEFAULT_REGISTER_MODE_INTERFACE.equalsIgnoreCase(registerMode) || DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode)) {
                            //将registry协议的URL加入到集合
                            result.add(registryURL);
                        }
                    }
    
                    FrameworkStatusReportService reportService = ScopeModelUtil.getApplicationModel(scopeModel).getBeanFactory().getBean(FrameworkStatusReportService.class);
                    reportService.reportRegistrationStatus(reportService.createRegistrationReport(registerMode));
                } else {
                    result.add(registryURL);
                }
            });
    
            return result;
        }
    
    • 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
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
  • 相关阅读:
    前端直传阿里云OSS
    pdf生成:puppeteer
    最长异或路径(dfs+01trie)
    百度百科怎么修改词条内容?
    网工内推 | 网络安全工程师,上市公司,13薪,食宿有补贴
    python基础语法二(函数、列表)
    LeetCode 2349. 设计数字容器系统(SortedSet)
    计算机毕业设计php_thinphp_vue的约课管理系统-课程预约(源码+系统+mysql数据库+Lw文档)
    sqlite3
    电脑出现找不到msvcp120.dll无法继续执行代码,不用担心多种方法帮你搞定
  • 原文地址:https://blog.csdn.net/web18484626332/article/details/126598718