当前位置: 首页 > 后端技术 > Java

一篇文章了解Dubbo3配置工作原理

时间:2023-04-02 09:42:07 Java

以下是Dubbo属性配置示例dubbo-spring-boot-samples##application.properties#Springbootapplicationspring.application.name=dubbo-externalized-configuration-provider-sample#扫描Dubbo组件的基础包:@com.alibaba.dubbo.config.annotation.Servicedubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service#Dubbo应用##dubbo.application.name默认值为${spring.application.name}##dubbo.application.name=${spring.application.name}#DubboProtocoldubbo.protocol.name=dubbodubbo.protocol.port=12345##DubboRegistrydubbo.registry.address=N/A##servicedefaultversiondubbo.provider.version=1.0.0接下来我们将重点关注这个例子,从三个方面对Dubbo进行配置:配置格式,配置源,和loadingprocess的原理进行了分析。1配置格式目前Dubbo支持的所有配置都是.properties格式,包括-D、ExternalizedConfiguration等。.properties中的所有配置项都遵循基于路径的配置格式。在Spring应用中,属性配置也可以放在application.yml中,树状层次结构更具可读性。#应用级配置(无id)dubbo.{config-type}.{config-item}={config-item-value}#实例级配置(指定id或名称)dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}#服务接口配置dubbo.service.{interface-name}.{config-item}={config-item-value}dubbo.reference.{interface-name}.{config-item}={config-item-value}#配置dubbo的方法.service.{interface-name}.{method-name}.{config-item}={config-item-value}dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}#方法参数配置dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}1.1应用级配置(无id)应用级配置的格式为:配置类型单数前缀,无id/name。#应用级配置(无id)dubbo.{config-type}.{config-item}={config-item-value}和application类似,monitor,metrics等都是应用级组件,所以只需要一个允许配置单实例;协议、注册表等允许配置多个组件。当只需要单例配置时,可以使用本节描述的格式。一个常见的例子如下:dubbo.application.name=demo-providerdubbo.application.qos-enable=falsedubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.protocol.name=dubbodubbo.protocol.port=-11.2实例级配置(指定id或name)实例的属性配置,需要指定id或name,前缀格式为:配置类型复数前缀+id/name。适用于协议、注册中心等支持多实例配置的组件。#实例级配置(指定id或name)dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}如果没有id或name的实例,框架将根据此处列出的属性创建一个配置组件实例。如果已经存在同id或同名的实例,框架会使用这里列出的属性作为对已有实例配置的补充。详情请参考属性覆盖。具体配置复数形式请参考单复数配置对照表的配置示例:dubbo.registries.unit1.address=zookeeper://127.0.0.1:2181dubbo.registries.unit2.address=zookeeper://127.0。0.1:2182dubbo.protocols.dubbo.name=dubbodubbo.protocols.dubbo.port=20880dubbo.protocols.hessian.name=hessiandubbo.protocols.hessian.port=80891.3服务接口配置dubbo.service.org.apache.dubbo.samples。api.DemoService.timeout=5000dubbo.reference.org.apache.dubbo.samples.api.DemoService.timeout=6000方法配置方法配置格式:#方法配置dubbo.service.{interface-name}.{method-name}。{config-item}={config-item-value}dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}#方法参数配置dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}方法配置示例:dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.timeout=7000dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.oninvoke=notifyService.onInvokedubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.onreturn=notifyService.onReturndubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.onthrow=notifyService.onThrowdubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.0.callback=true等同于XML配置:1.4参数配置parameters参数是一个map对象,支持xxx。parameters=[{key:value},{key:value}]进行配置dubbo.application.parameters=[{item1:value1},{item2:value2}]dubbo.reference.org.apache.dubbo.samples.api.DemoService.parameters=[{item3:value3}]1.5传输层配置三重协议Http2作为底层通信协议,允许用户自定义Http2的六个设置参数。配置格式如下:#通知对端头压缩索引表上限dubbo.rpc.tri.header-table-size=4096#启用服务结束推送功能dubbo.rpc.tri.enable-push=false#通知对端允许的最大并发流数dubbo.rpc.tri.max-concurrent-streams=2147483647#声明发送端的窗口大小dubbo.rpc.tri.initial-window-size=1048576#设置frame的最大字节数dubbo.rpc.tri.max-frame-size=32768#通知对端header最大未压缩字节数dubbo.rpc.tri.max-header-list-size=8192相当于yml配置:dubbo:rpc:tri:header-table-size:4096enable-push:falsemax-concurrent-streams:2147483647initial-window-size:1048576max-frame-size:32768max-header-list-size:81921.6属性和XML配置映射规则可以组合xml标签名称和属性名称,以“.”分隔。每行一个属性。dubbo.application.name=foo相当于dubbo.registry.address=10.20.153.10:9090相当于xml配置中的标签不止一个,可以用'id'来区分。如果您不指定id,它将应用于所有标签。dubbo.protocols.rmi.port=1099相当于dubbo.registries.china.address=10.20.153.10:9090相当于1.7配置项单复数对照表配置复数命名规则同常用词复数规则:当字母y结束时,去掉y并更改以ies字母s结尾,加上es等加sConfig类型单数配置复数配置applicationdubbo.application.xxx=xxxdubbo.applications.{id}.xxx=xxx
dubbo.applications.{name}.xxx=xxxprotocoldubbo.protocol.xxx=xxxdubbo.protocols.{id}.xxx=xxx
dubbo.protocols.{name}.xxx=xxxmoduledubbo.module.xxx=xxxdubbo.modules.{id}.xxx=xxx
/>dubbo.modules.{name}.xxx=xxxregistrydubbo.registry.xxx=xxxdubbo.registries.{id}.xxx=xxxmonitordubbo.monitor.xxx=xxxdubbo.monitors.{id}.xxx=xxxconfig-centerdubbo.config-center.xxx=xxxdubbo。配置中心。{id}.xxx=xxxmetadata-reportdubbo.metadata-report.xxx=xxxdubbo.metadata-reports.{id}.xxx=xxxsldubbo.ssl.xxx=xxxdubbo.ssls.{id}.xxx=xxxmetricsdubbo.metrics.xxx=xxxdubbo.metrics.{id}.xxx=xxxproviderdubbo.provider.xxx=xxxdubbo.providers.{id}.xxx=xxxconsumerdubbo.consumer.xxx=xxxdubbo.consumers.{id}.xxx=servicedubbo.service.{interfaceName}.xxx=xxx无引用{methodName}.xxx=xxxnoargumentdubbo.service.{interfaceName}.{methodName}.{arg-index}.xxx=xxxno2个配置源Dubbo默认支持6个配置源:JVMSystemProperties,JVM-DparameterSystemenvironment,JVM进程的环境变量ExternalizedConfiguration,外部化配置,从配置中心读取ApplicationConfiguration,应用属性配置,从Spring应用环境中提取dubbo开头的属性集,收集API/XML/注解和其他编程接口Configuration可以理解为一类配置源,是一种直接面向用户编程的配置获取方式。配置文件dubbo.properties是从类路径中读取的。关于dubbo.properties属性:如果classpath下有多个dubbo.properties文件,比如有两个,每个jar包都包含dubbo.properties,dubbo会随机选择一个加载,并打印错误日志Dubbo可以自动加载classpath根目录下的dubbo.properties,也可以使用JVM参数指定路径:-Ddubbo.properties.file=xxx.properties。2.1覆盖关系如果通过多个配置源指定同一个配置项,配置项之间会相互重叠。具体承保关系和优先级见下一节。3配置加载过程3.1处理过程Dubbo配置加载大致分为两个阶段:第一阶段在DubboBootstrap初始化之前,在Spring上下文启动或执行API配置代码创建时解析处理XML配置/注解配置/Java-config配置bean并添加到ConfigManager。第二阶段是DubboBootstrap的初始化过程,从配置中心读取外部配置,依次进行实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,即属性覆盖.3.2属性覆盖属性覆盖可能有两种情况,两种可能同时发生:不同的配置源配置了相同的配置项,配置了相同的配置源,但是指定了相同的配置项不同级别3.2.1不同配置源3.2.1同源配置属性覆盖是指用配置的属性值覆盖configbean实例的属性,类似于SpringPropertyOverrideConfigurer的作用。在应用程序上下文定义中覆盖bean属性值的属性资源配置器。它将属性文件中的值推送到bean定义中。配置行应该是这样的形式:beanName.property=value但是和PropertyOverrideConfigurer不同的是,Dubbo的属性覆盖有多种匹配格式,优先级从高到低是:#1。指定id的实例级配置dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}#2。指定名称的实例级配置dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}#3.应用级配置(单数配置)dubbo.{config-type}.{config-item}={config-item-value}属性覆盖处理流程:按照优先级从高到低的顺序查找,如果找到一个属性开始有这个前缀的,选择Usethisprefixtoextractproperties,忽略后面的配置。3.3外化配置外化配置的目的之一是实现集中的配置管理。这部分行业已经有很多成熟的专业配置系统,比如Apollo、Nacos等,Dubbo做的主要是保证这些系统能够正常工作。外部配置和其他本地配置在内容和格式上没有区别。可以简单理解为dubbo.properties的外部存储。配置中心更适合抽取一些公共的配置,比如注册中心、元数据中心的配置进行集中管理。#注册中心地址、元数据中心地址等配置集中管理,实现环境统一,减少开发端感知。dubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.registry.simplified=truedubbo.metadata-report.address=zookeeper://127.0.0.1:2181dubbo.protocol.name=dubbodubbo.protocol.port=20880dubbo。application.qos.port=33333Priority外部配置默认优先于本地配置,所以这里配置的内容会覆盖本地配置值。各配置形式之间的覆盖关系单独一章。范围外部化配置有两个级别:全局和应用程序。全局配置为所有应用共享,应用级配置由各个应用维护,仅对自身可见。目前支持的扩展包括Zookeeper、Apollo和Nacos。3.3.1外部配置使用添加config-center配置在对应的配置中心(zookeeper、Nacos等)添加全局配置项,以Nacos为例:开启外部配置后,registry、metadata-report、protocol、qos等全局配置理论上不再需要在应用中配置。应用开发端专注于业务服务配置,一些全局共享的全局配置由运维人员传送到远程配置中心。这样可以达到的效果是,应用只需要关心:服务暴露,订阅配置中心地址,部署到不同环境时,其他配置可以自动从对应的配置中心读取。例如,每个应用中可能只有以下dubbo相关的配置就足够了,其余的都托管在对应环境的配置中心:dubbo应用名称:democonfig-center地址:nacos://127.0.0.1:88483.3.2自加载外部配置所谓Dubbo对配置中心的支持,本质上就是将远程的.properties拉到本地,然后与本地的配置进行整合。理论上,只要Dubbo框架能够拿到需要的配置,就可以正常启动。并不关心这些配置是自己加载的还是应用直接插入的,所以Dubbo也提供了如下API让用户自己组织。将配置塞入Dubbo框架(配置加载过程由用户完成),使Dubbo框架不再直接与Apollo或Zookeeper交互读取配置。//应用加载配置MapdubboConfigurations=newHashMap<>();dubboConfigurations.put("dubbo.registry.address","zookeeper://127.0.0.1:2181");dubboConfigurations.put("dubbo.registry.simplified","true");//将整理好的配置丢进Dubbo框架ConfigCenterConfigconfigCenter=newConfigCenterConfig();configCenter.setExternalConfig(dubboConfigurations);欢迎访问https://github.com/apache/dubbo给DubboStar。搜索并关注官方微信公众号:ApacheDubbo,了解更多行业最新动态,掌握各大厂面试必备的Dubbo技能