hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

Dubbo设置完整外部化实践,运用动态设置中间的注意事项

2019-11-18杂谈搜奇网31°c
A+ A-

题目形貌

近期开辟项目,将Dubbo的设置悉数外部化到动态设置中间。这里设置中间我运用的是Apollo。

@Configuration
public class DubboConfig {
  @Bean
  public ConfigCenterConfig configCenterConfig() {
    ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();
    configCenterConfig.setAddress("apollo.xxxxx.com");
    configCenterConfig.setProtocol("apollo");
    configCenterConfig.setNamespace("dubbo");
    configCenterConfig.setGroup(null);
    return configCenterConfig;
  }
}

这里运用dubbo这个namespace。

其他设置悉数设置在这个内里。

然后碰到一个大坑:

这里项目中定义了一个Service,也就是作为Provider供应了版本为provider.auth.version的效劳。

package io.github.slankka.provider;

@Service(version = "${provider.auth.version:1.0}")
@Slf4j
public class AuthApiService implements IAuthApi 

项目启动以后,注册到注册中间的版本是1.0。

在dubbo定名空间中定义了provider.auth.version=20000,然则启动照样1.0

题目剖析

Apollo启动情势分为两种,一种是在 BeanDefinition阶段就将设置注入Spring容器内的Environment。另一种是在PostBeanFactory的时刻启动。
而Dubbo启动的时刻,一切的Service是ServiceBean的实例对应生成的代办类,一切的Reference是ReferenceBean的实例对应生成的代办类。
因而假如这里运用placeholder要被Spring辨认,那末将必需选用第一种启动体式格局。

题目处理

在当地项目的application.properties中设置:

apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces = application,dubbo

注重,这里apollo.bootstrap.namespaces 中加入了dubbo,这里有一个疑问:
之前设置Dubbo的时刻不是定义了ConfigCenterConfig的namespace了吗,为何还要定义一次。

 configCenterConfig.setNamespace("dubbo");

原因是:
Dubbo的ServiceBean在被Spring工场构建出来的时刻,就须要这个变量。但假如没有设置dubbo到apollo.bootstrap.namespaces,Spring会报错。
假如接口上写了默许版本,上例是1.0,则Spring不会报错,然则构建出来的对应ServiceBean中的版本将会是1.0,而Dubbo启动以后依旧不会修正这个版本。

新的题目

为何Dubbo的namespace中设置了这个变量,而且Dubbo在启动夙兴阶段就已拉到了这些变量,但版本依旧没有发生转变?

看一下Dubbo代码:

//package org.apache.dubbo.common.config;

public abstract class AbstractPrefixConfiguration implements Configuration {
    protected String id;
    protected String prefix;

    public AbstractPrefixConfiguration(String prefix, String id) {
        if (StringUtils.isNotEmpty(prefix) && !prefix.endsWith(".")) {
            this.prefix = prefix + ".";
        } else {
            this.prefix = prefix;
        }
        this.id = id;
    }

    @Override
    public Object getProperty(String key, Object defaultValue) {
        Object value = null;
        if (StringUtils.isNotEmpty(prefix)) {
            if (StringUtils.isNotEmpty(id)) {
                value = getInternalProperty(prefix + id + "." + key);
            }
            if (value == null) {
                value = getInternalProperty(prefix + key);
            }
        } else {
            value = getInternalProperty(key);
        }
        return value != null ? value : defaultValue;
    }
}

已知Dubbo是经由过程Configuration 的getProperty猎取version等等这些属性,
这里能够看到用prefix + key的体式格局作为 property的名字来猎取变量的值。
经由Debug发明,Dubbo的 AbstractPrefixConfiguration类的prefix正好是接口的FQCN,在本例中为:

AbstractPrefixConfiguration.prefix=dubbo.service.io.github.slankka.provider.IAuthApi.

那末key=version
因而能够推断出,Dubbo的外部化设置指定的Namespace中,假如要指定版本,且愿望经由Dubbo的Environment处置惩罚,那末肯定要用这类情势:

dubbo.service.io.github.slankka.provider.IAuthApi.version=20000

总结

  1. 假如运用placeholder的体式格局定义Service版本,那末依据习气,要确保这些变量放在Spring启动阶段就可以读到的处所。
  2. 假如要在Dubbo的namespace中定义,被Dubbo处置惩罚,那末要相符Dubbo的敕令划定规矩。dubbo.service.xxxxxxx.version等等这类情势。
  3. 假如运用placeholder的体式格局定义,但愿望被Apollo直接处置惩罚,那末须要设置:
apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces = application,dubbo

那末什么时刻运用 placeholder什么时刻运用 dubbo.service. .version体式格局定义呢?

答案很显然是,假如多个接口都用共用同一个版本变量举行设置,用Apollo+Spring的体式格局举行处置惩罚。假如每个接口都设置差别的版本,能够用Dubbo的体式格局定义。

进一步相识Dubbo和Apollo集成的碰到的风趣题目

处理Dubbo 2.7.3版本运用ConfigCenterConfig集成Apollo No Provider found的题目

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
Dubbo设置完整外部化实践,运用动态设置中间的注意事项

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/281956.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>