一、dubbo配置
(1)dubbo详细配置
在dubbo官方文档中有dubbo的详细配置信息。
(2)重写与优先级
优先级从高到低:
- JVM -D 参数:当你部署或者启动应用时,它可以轻易地重写配置,比如,改变 dubbo 协议端口;
- XML:XML 中的当前配置会重写 dubbo.properties 中的;
- Properties:默认配置,仅仅作用于以上两者没有配置时。
- 如果在 classpath 下有超过一个 dubbo.properties 文件,比如,两个 jar 包都各自包含了 dubbo.properties,dubbo 将随机选择一个加载,并且打印错误日志。
- 如果
id
没有在protocol
中配置,将使用name
作为默认属性。
二、启动检查
在官方文档的用法示例中有官方提供的配置。
在启动时检查依赖的服务是否可用,Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"
。可以通过 check="false"
关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false"
,总是会返回引用,当服务恢复时,能自动连上。
也就是说在服务消费者启动时会检查注册中心中是否有它需要的服务提供者,如果没有时则会抛出异常。
(1)通过 spring 配置文件
关闭某个服务的启动时检查 (没有提供者时报错):
<dubbo:reference interface="com.foo.BarService" check="false" />
关闭所有服务的启动时检查 (没有提供者时报错):
<dubbo:consumer check="false" />
关闭注册中心启动时检查 (注册订阅失败时报错):
<dubbo:registry check="false" />
(2)通过 dubbo.properties
dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false
(3)通过 -D 参数
java -Ddubbo.reference.com.foo.BarService.check=false
java -Ddubbo.reference.check=false
java -Ddubbo.consumer.check=false
java -Ddubbo.registry.check=false
(4)配置的含义
dubbo.reference.check=false
,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。dubbo.consumer.check=false
,是设置 check 的缺省值,如果配置中有显式的声明,如:<dubbo:reference check="true"/>
,不会受影响。dubbo.registry.check=false
,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。(即当没有注册中心时,也会启动)
三、超时与配置覆盖关系
(1)超时配置
在引用dubbo服务时,可以设置timeout属性限制等待时间(单位毫秒)。
@DubboReference(timeout = 3000) // 去dubbo注册中心中寻找
private UserService userService;
当没有设置时,默认为dubbo:consumer的超时时间(1000毫秒)。
(2)不同粒度配置的覆盖关系
以 timeout 为例,下图显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。
(建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置)。理论上 ReferenceConfig 中除了interface
这一项,其他所有配置项都可以缺省不配置,框架会自动使用ConsumerConfig,ServiceConfig, ProviderConfig等提供的缺省配置。
-
2.1.0
开始支持,注意声明:xmlns:p="http://www.springframework.org/schema/p"
↩︎ -
引用缺省是延迟初始化的,只有引用被注入到其它 Bean,或被
getBean()
获取,才会初始化。如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:<dubbo:reference ... init="true" />
↩︎
四、重试次数
在引用dubbo服务时,可以设置重试次数(不包含第一次调用)。当配置了多个相同的服务提供方时,会依次重试不同的服务提供方,以便找到可以提供的服务(类似于负载均衡轮询)。
@DubboReference(retries = 3) // 去dubbo注册中心中寻找
private UserService userService;
- 幂等操作:可以设置重试次数,比如查询、删除、修改。也就是说方法无论重复多少次都和你重试一次一样的效果,叫做幂等操作。
- 非幂等操作:不可以设置重试次数,比如数据库的新增。