dubbo 配置

  • 先要了解Spring解析自定义标签。
  • DubboBeanDefinitionParser

它实现了Spring的BeanDefinitionParser接口,该接口专门用来解析Bean的定义,所以需要实现parser()方法。

public BeanDefinition parse(Element element, ParserContext parserContext)

DubboBeanDefinitionParser构造方法参数上且个Class<?> beanClass参数,指的是当前标签配置内容转换成对应类的BeanDefinition并且注入到Spring容器中。


主要的思想就是通过反射的形式获取类的get/set方法,从而判断该参数是否可通过Spring注入进去,最后添加到beanDefinition中,并且注入Spring容器中。

 

  • AbstractConfig

Dubbo的配置模块:ReferenceBean, RegistryConfig, ServiceBean等,都继承了AbstractConfig,该抽象类中定义了方法:

protected static void appendProperties(AbstractConfig config)


该方法一开始是生成当前配置的前缀

String prefix = "dubbo." + getTagName(config.getClass()) + "."
private static final String[] SUFFIXS = new String[] {"Config", "Bean"};
private static String getTagName(Class<?> cls) {
    String tag = cls.getSimpleName();
    for (String suffix : SUFFIXS) {
        if (tag.endsWith(suffix)) {
            tag = tag.substring(0, tag.length() - suffix.length());
            break;
        }
    }
    tag = tag.toLowerCase();
    return tag;
}


比如ReferenceBean通过该方法,配置以dubbo.reference开头,生成当前配置类的前缀之后,那么还是按照管理反射出当前类的set方法,接下来就是从System.getProperty中取,如果其中没有则会从ConfigUtil.getProperty中取。这里说胆DUBBO配置的优先级java -D 优先于Spring配置,Spring配置优先于properties文件的配置。

不管是System.getProperty还是ConfiguUtils.getProperty都会取两次

String pn = prefix + config.getId() + "." + property

另一个

String pn = prefix + property

config.getId就是我们在配置Spring的Bean时配置的ID。

 

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" timeout="2000" check="false" />


该配置会产生一个ReferenceBean对象,那么此时的config.getId()就是demonService。第一个配置的目的是有没针对某个Bean的配置项,比如:配置dubbo消费端的超时时间,一般通过dubbo.reference.timeout,这其实是指消费端所Bean的超时时间,有时候我们需要指定某个Bean超时时间可以通过dubbo.reference.{beanId}.timeout来指定。

 

如果想了解dubbo某个模块的配置,直接到对应的配置类中看它有哪些字段,知道它的字段名。如果是多个单词的组合,使用驼峰格式。

/name是get/set方法名
 String property = StringUtils.camelToSplitName(name.substring(3, 4).toLowerCase() + name.substring(4), "-");

不难发现对于驼峰,dubbo通过-字符来分割各个单词。这种方式 的配置,如果需要调整都需要重启应用。

  • 动态配置

主要原理是通过管理器将动态参数发布到注册中心(Zookeeper)中,然后各个节点可以获得最新的配置变更,然后进行动态调整。在Zookeper中每个服务节点目录下面看到以下几个目录consumer, providers, configurators, routers。其中动态配置放在configurators节点目录下,服务消费端会监听configurators目录变更,如果变更则会调用RegistryDirectory的notify(List<URL> urls)方法 ,urls的是类似overrider://..,表示将覆盖调用该服务的某些配置,将这个URL上面的参数信息替换到调用服务端的URL上面取,并且重新构造该服务的Invoke对象。从而达到更新参数的目的。

  • 给接口的方法配置参数

比如一个接口存在多个方法,有时候参数配置现在接口层面还不够,需要精确到方法级别。

1.dubbo:method标签

<!--lang:xml-->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" timeout="2000" check="false" >
        <dubbo:method name="sayHello" timeout="1000"/>
</dubbo:reference>

 

2.动态配置

在配置的规时方法名加配置项的名称,例如:key配置成:sayHello.timeout,value="1000"。那么管理器会在注册中心的对应服务的configurators添加一条overrider://....?sayhello.timeout节点,指定消费端会监听到这个变更。
 

最后欢迎大家访问我的个人网站:1024s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值