多版本支持
在多版本升级的时候,特别注意版本的兼容性。 设置不同版本的目的,就是要考虑到接口升级以后带来的兼容问题。在Dubbo中配置不同版本的接口,会在Zookeeper地址中有多个协议url的体现。
注册者配置
消费者配置
主机绑定
在发布一个Dubbo服务的时候,会生成一个dubbo://ip:port的协议地址,那么这个IP是根据什么生成的呢?我们可以在ServiceConfig.java代码中找到如下代码;可以发现,在生成绑定的主机 的时候,会通过一层一层的判断,直到获取到合法的ip地址。
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 ? Constants.LOCALHOST_VALUE : address.getHostAddress();
}
常用的默认端口
Dubbo:20880
RMI:1099
HTTP:80
Hessian:80
webservice:80
集群容错
容错机制指的是某种系统控制在一定范围内的一种允许或包容犯错情况的发生,举个简单例子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统会弹出一个提示框让我们选择,是立即结束还是继续等待,然后根据我们的选择执行对应的操作,这就是“容错”。
在分布式架构下,网络、硬件、应用都可能发生故障,由于各个服务之间可能存在依赖关系,如果一条链路中的其中一个节点出现故障,将会导致雪崩效应。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务,来优雅的处理这种中断的响应结果。
Dubbo的6中容错机制
- failsafe 失败安全,可以认为是把错误吞掉(记录日志)
- failover(默认) 重试其他服务器,retries(2),默认重试两次,不包含第一次
- failfast 快速失败,失败以后立马报错
- failback 失败后自动恢复
- forking forks 设置并行数
- broadcast 广播,任意一台报错,则执行的方法报错。
配置方式
配置优先级别
在配置很多属性的时候,客户端和服务端都有自己的相关配置,这个时候客户端的配置会优于服务端。
- 方法级别优先、然后是接口、然后是全局配置
- 如果级别一样,客户端优先
服务降级
降级的目的是为了保证核心服务可用。
降级可以有几个层面的分类:自动降级和人工降级;按功能:读服务降级和写服务降级;
- 对一些非核心服务进行人工降级,在大促之前通过降级开关关闭哪些推荐内容、评价等对主流程序没有影响的功能。
- 故障降级,比如调用的远程服务挂了,网络故障、或者RPC服务返回异常。那么可以直接降级,降级的方案比如设置默认值,采用兜底数据等
- 限流降级,在秒杀这种比较集中并且流量特别大的情况下,因为突发访问量特别大可能会导致系统支撑不了。这时候可以采用限流来限制访问量。当达到阀值时,后续的请求被降级,比如进入排队页面,跳转到错误页,稍后重连页面等,9102的百度主战的春晚就有各种方案来限流。
Dubbo的降级方式:Mock
实现步骤
- 在client端创建一个TestMock类,实现对应IGpHello的接口(需要对哪个接口进行mock,就实现哪个),名称必须以Mock结尾。
- 在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的TestMock。
- 模拟错误(设置timeout),模拟超时异常,运行测试代码即可访问到TestMock这个类。当服务端故障解除以后,调用过程将恢复正常。