多版本支持
版本号会在解析配置文件的时候,把版本拼接到url后面
<dubbo:service interface="com.lyf.dubbo.IHello"
ref="demoService" protocol="dubbo" version="1.0.1"
timeout="100"/>
主机绑定
1.NetUtils.isInvalidLocalHost(host), 从配置文件中获取host
2.host = InetAddress.getLocalHost().getHostAddress();
3.Socket socket = new Socket();
try {
SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
socket.connect(addr, 1000);
host = socket.getLocalAddress().getHostAddress();
break;
} finally {
try {
socket.close();
} catch (Throwable e) {}
}
4.public static String getLocalHost(){
InetAddress address = getLocalAddress();
return address == null?LOCALHOST:address.getHostAddress();
}
容错机制
- failsafe 失败安全,可以认为是把错误吞掉(记录日志)
- failover(默认) 重试其他服务器; retries(2)
- failfast 快速失败, 失败以后立马报错
- failback 失败后自动恢复。
- forking forks. 设置并行数
- broadcast 广播,任意一台报错,则执行的方法报错
<dubbo:reference id="demoService"
interface="com.lyf.dubbo.IHello"
registry="zookeeper"
cluster="failsafe"/>
服务降级
dubbo的降级方式: Mock
实现步骤
- 在client端创建一个TestMock类,实现对应IHello的接口(需要对哪个接口进行mock,就实现哪个),名称必须以Mock结尾
- 在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的TestMock
- 模拟错误(设置timeout),模拟超时异常,运行测试代码即可访问到TestMock这个类。当服务端故障解除以后,调用过程将恢复正常
<dubbo:reference id="demoService"
interface="com.gupaoedu.dubbo.IHello"
registry="zookeeper"
mock="com.lyf.dubbo.TestMock"/>
配置优先级别
- 以timeout为例,显示了配置的查找顺序,其它retries, loadbalance等类似。
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
其中,服务提供方配置,通过URL经由注册中心传递给消费方。
- 建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。