dubbo 配置

news/2024/7/4 1:41:26
  • 先要了解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


http://www.niftyadmin.cn/n/1275821.html

相关文章

COM组件入门(一)

近期须要用到COM组件的知识&#xff0c;看了看COM编程指南&#xff0c;感觉还不错。把我的学习心得记录下来。这是我依据教程写的demo StopWatch接口实现部分&#xff0c;接口部分我的项目是动态库&#xff0c;主要源代码例如以下&#xff1a; 完整demo见&#xff1a;http://do…

dubbo 协议

dubbo:// Dubbo缺省协议采用单一长连接和NIO异步通讯&#xff0c;适合于小数据量大并发的服务调用&#xff0c;以及服务消费者机器远大于服务提供者机器数的情况。 设置默认协议&#xff1a; <dubbo:provider protocol"dubbo"/> 为服务设置协议&#xff1a;…

解决软件开发中常见的问题

互联网行业火吗?火。火到了什么地步?大概已经到了让大家已经离不开的程度了。在前端时在网上就看到一个话题&#xff0c;很多人在谈论互联网的是绑架人类还是帮助了人类。我就不由想起前段时间&#xff0c;人们在家里隔离&#xff0c;只能靠着互联网娱乐、购物、社交、工作、…

在2021年, Python是否会全面超越 Java?

第一&#xff0c;简单地看 Python是否比 Java更受欢迎并没有多大意义&#xff0c;事实上&#xff0c;尽管 Java和 Python都是非常受欢迎的全场景编程语言&#xff0c;但 Python和 Java仍然各有侧重。 在IT互联网行业的生产环境下&#xff0c;Java的应用还是非常普遍的&#xf…

程序员编程入门一定知道!程序员需要学什么?

编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码&#xff0c;并最终得到结果的过程。在信息时代的背景下&#xff0c;计算机的应用扮演着重要的角色&#xff0c;而对于巨大的市场需求来说&#xff0c;精通计算机的人才仍然稀缺&#xff0c;所以计算机行业的…

day1 学习历程

day1 我是一个在校大三学生&#xff0c;一个依然迷茫不知前景的大学混子 &#xff0c;可以这么说吧 大学混子 真正开始决定好好学习大概在去年的12月份 那时经老师的提醒 开始正式接触软件开发 于是 从头开始学习语言 下了很大的决心 开始从C学习开始 然后学习了不到一个星期 听…

dubbo 并发控制 和 连接控制

并发控制 &#xff08;1&#xff09;服务端并发执行&#xff08;或占用线程池线程数&#xff09;不能超过10个。 <dubbo:service interface"com.foo.BarService" executes"10" /> &#xff08;2&#xff09;限制到方法 <dubbo:service interfac…