dubbo属性配置

一、覆盖策略

JVM启动-D参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
XML次之,如果在XML中有配置,则dubbo.properties中的相应配置项无效。
Properties最后,相当于缺省值,只有XML没有配置时,dubbo.properties的相应配置项才会生效,通常用于共享公共配置,比如应用名。

详见官方文档:http://dubbo.apache.org/zh-cn/docs/user/configuration/properties.html

二、启动时检查

Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check="true"。
可以通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
另外,如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check="false",总是会返回引用,当服务恢复时,能自动连上。

1、通过spring配置文件
关闭某个服务的启动时检查(没有提供者时报错):
<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService" check="false"/>
关闭所有服务的启动时检查 (没有提供者时报错):
<dubbo:consumer check="false" />
关闭注册中心启动时检查 (注册订阅失败时报错):
<dubbo:registry check="false" />
2、通过 dubbo.properties
dubbo.reference.com.lina02.gmall.service.UserService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false
3、通过 -D 参数
java -Ddubbo.reference.com.lina02.gmall.service.UserService.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,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。

详见官方文档:http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html

三、超时时间

由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间。

配置覆盖关系:
以timeout为例,显示了配置的查找顺序,其它retries,loadbalance,actives等类似:

精确优先 (方法级优先,接口级次之,全局配置再次之)
消费者设置优先(如果级别一样,则消费方优先,提供方次之)

其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。

详见官方文档:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-reference.html

http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html

http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html

四、重试次数

失败自动切换,当出现失败,重试其它服务器,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

重试次数配置如下:
<dubbo:service interface="com.lina02.gmall.service.UserService" ref="userServiceImpl" retries="2"/>
<dubbo:service interface="com.lina02.gmall.service.UserService" ref="userServiceImpl">
    <dubbo:method name="getUserAddressList" retries="5"/>
</dubbo:service>
<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService" retries="4"/>
<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService">
   <dubbo:method name="getUserAddressList" retries="2"/>
</dubbo:reference>

retries="":重试次数,不包含第一次调用,0代表不重试
幂等(设置重试次数)[查询、删除、修改]、非幂等(不能设置重试次数)[新增)

五、版本号

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
在低压力时间段,先升级一半提供者为新版本
再将所有消费者升级为新版本
然后将剩下的一半提供者升级为新版本

老版本服务提供者配置:
<dubbo:service interface="com.lina02.gmall.service.UserService" ref="userServiceImpl" version="1.0.0"/>
新版本服务提供者配置:
<dubbo:service interface="com.lina02.gmall.service.UserService" ref="userServiceImpl" version="2.0.0"/>
老版本服务消费者配置:
<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService" version="1.0.0"/>
新版本服务消费者配置:
<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService" version="2.0.0"/>
如果不需要区分版本,可以按照以下的方式配置:
<dubbo:service interface="com.lina02.gmall.service.UserService" ref="userServiceImpl" version="*"/>
<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService" version="*"/>

六、本地存根

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

本地存根类:

package com.lina02.gmall.service.impl;

import java.util.List;

import com.lina02.gmall.bean.UserAddress;
import com.lina02.gmall.service.UserService;
import org.springframework.util.StringUtils;

public class UserServiceStub implements UserService {
	
	private final UserService userService;

	/**
	 * 传入的是userService远程的代理对象
	 * @param userService
	 */
	public UserServiceStub(UserService userService) {
		super();
		this.userService = userService;
	}

	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		System.out.println("UserServiceStub.....");
		if(!StringUtils.isEmpty(userId)) {
			return userService.getUserAddressList(userId);
		}
		return null;
	}

}

consumer.xml配置本地存根:

<dubbo:reference interface="com.lina02.gmall.service.UserService" id="userService" stub="com.lina02.gmall.service.impl.UserServiceStub"/>

详见官方文档:http://dubbo.apache.org/zh-cn/docs/user/demos/local-stub.html

posted on 2018-10-27 17:42  lina2014  阅读(247)  评论(0编辑  收藏  举报

导航