Dubbo 常用配置

Dubbo 有很多配置,本篇博客主要记录了一些常用配置的用法,如果需要更全更详细的配置讲解,请移步官方使用文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

属性加载覆盖策略

Dubbo支持的配置四种

  • JVM System Properties,-D参数
  • Externalized Configuration,外部化配置
  • ServiceConfig、ReferenceConfig 等编程接口采集的配置
  • 本地配置文件 dubbo.properties

属性起作用的优先级如下:
JVM 参数 (-D) > 外部化配置(dubbo.xml, provider.xml, application.properties)> 编程接口采集的配置(springboot 的配置类) > 本地配置 dubbo.properties

启动时检查

默认情况下,如果服务提供者未注册到注册中心,则使用服务的消费者启动时会报错;可以通过 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

配置覆盖关系

  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。

下图来自官方,蓝色表示服务消费者,黄绿色表示服务提供者,优先级从上到下递减,上层覆盖下层
在这里插入图片描述

多版本配置

service 接口配置时加上版本号,新旧版本接口不同的版本
reference 引用时指定具体版本,* 表示随机版本

服务提供者配置

    <!-- 声明需要暴露的服务  -->
    <dubbo:service interface="com.xiao.service.ProviderService" ref="provService" version="1.0.0"/> <!-- 接口 -->
    <dubbo:service interface="com.xiao.service.ProviderService" ref="provService2" version="2.0.0"/> <!-- 接口 -->
    
    <bean id="provService" class="com.xiao.service.impl.ProviderServiceImpl"/>  <!-- 实现 -->
    <bean id="provService2" class="com.xiao.service.impl.ProviderServiceImpl2"/>  <!-- 实现 -->

服务消费者配置

    <!-- 生成远程服务代理,使用暴露的 provider 端接口 -->
    <dubbo:reference id="proService" interface="com.xiao.service.ProviderService" version="2.0.0"/>
	<!-- <dubbo:reference id="proService" interface="com.xiao.service.ProviderService" version="*"/> -->

本地存根

远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub ,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。

在服务消费方写一个服务提供端的接口实现,即本地存根,dubbo 远程调用后把服务提供者对象传入本地存根的代理对象,在代理对象真正调用提供的服务之前,用户(消费端)可以做一些判断校验等。

本测试在上一篇博客的 quickstart 的基础上增加本地存根进行测试,在 服务消费端 实现服务提供端的接口

public class ProviderServiceImplStub implements ProviderService {
	
	private final ProviderService providerService;
	
	// 传入的是 ProviderService 的远程代理对象
	public ProviderServiceImplStub(ProviderService providerService) {
		super();
		this.providerService = providerService;
	}

	public List<Student> getStuList(String sname) {
		
		System.out.println("服务消费端 本地存根 ProviderServiceImplStub.getStuList()....");
		
		if(!StringUtils.isEmpty(providerService)) {
			return providerService.getStuList(sname);
		}
		return null;
	}

}

开启本地存根的配置可以写在服务提供端,也可以写在服务消费端,也可以同时写上。(我在服务提供端和服务消费端的同一位置都实现了服务提供端的接口,但是测试结果打印的都是服务消费端的本地存根)

    <!-- 生成远程服务代理,应用暴露的 provider 端接口 -->
    <dubbo:reference id="proService" interface="com.xiao.service.ProviderService" version="1.0.0"
    stub="com.xiao.service.impl.ProviderServiceImplStub"/>

或者

    <!-- 声明需要暴露的服务  -->
    <dubbo:service interface="com.xiao.service.ProviderService" ref="provService" version="1.0.0"
    stub="com.xiao.service.impl.ProviderServiceImplStub"/>

在这里插入图片描述在这里插入图片描述

经测试
1)存根必须要写在服务消费端。如果我删除了消费端的存根,在消费端调用服务的时候回报错说本地存根的类找不到;在服务提供端可写可不写存根,因为都不会调用。
2)开启本地存根的配置可写在服务提供端,也可写在服务消费端,也可两边都写。
3)虽然官方文档说 stub=“true” 可以,但是我在测试的时候,这样配置是报错了,可能是还有其他要求我没满足。所以还是使用 stub=“包名.类名” 稳妥些

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值