Java 面试复习_9
2019-6-1
作者:水不要鱼
(注:能力有限,如有说错,请指正!)
今天儿童节,先祝大家儿童节快乐!!
dubbo 在启动时会进行服务的可用性检查,就是对依赖的服务进行判断是否可用,只有可用才会拿到代理对象,否则返回 null。
但是,有时候不想要这个启动检查,就可以通过配置进行设置:
# 消费者:关闭具体一个服务提供者的检查
dubbo.reference.cn.com.fishin.service.check=false
# 消费者:关闭所有服务引用的检查
dubbo.reference.check=false
# 或
dubbo.consumer.check=false
# 关闭注册中心的检查
dubbo.registry.check=false
dubbo 对集群有一套容错机制,就是当调用失败之后该怎么做。对 dubbo 内部来说,它把这个集群调用者封装成一个
调用者,也就是说一切集群选择,包括路由、负载均衡都是在这个封装之后的调用者里面处理的,这样在最终调用时是透明的。
dubbo 默认的集群容错机制是 failover。一共有如下几种机制:
- failover ———— 如果调用失败,由于是集群,所以可以在其他服务器上重试,这就是重试机制,但是也会带来更高的延迟。
当然,既然有重试,那就肯定有重试次数限制,不然可能一直重试。。。我们可以通过配置:
<beans>
<!-- 重试次数配置如下: -->
<!-- 这是服务提供者在暴露服务的时候配置的 -->
<!--
需要注意的是,retries 不包括第一次失败的那次,也就是说,
第一次调用失败,开始重试,这时候才开始计数
-->
<dubbo:service retries="3" />
<!-- 这是服务消费者在引用服务的时候配置的 -->
<dubbo:reference retries="3" />
<!-- 或 -->
<dubbo:reference>
<dubbo:method name="say" retries="3" />
</dubbo:reference>
</beans>
- failsafe ———— 如果调用失败,直接忽略异常,也就是不会发生任何的事。这个机制适合于调用不太敏感的业务。
- failfast ———— 如果调用失败,直接报错,不会进行重试。
- failback ———— 如果调用失败,将这次请求记录下来,然后后台进行定时重发。
- forking ———— 如果调用失败,由于是集群,所以它将会在所有服务器上执行一次,任意一个成功即可。这也可以看出,
这个请求有可能被重复调用,如果是商品下单,就会造成重复下单的问题。 - broadcast ———— 如果调用失败,通知所有提供者,一个一个执行,如果有一个出错就直接报错。
如果你想切换集群容错机制,就是用以下的配置:
<beans>
<!-- 服务提供者 -->
<dubbo:service cluster="failsafe" />
<!-- 服务消费者 -->
<dubbo:reference cluster="failsafe" />
</beans>
dubbo 中对于集群,除了容错机制外,还提供了负载均衡机制,默认的是 random 随机调用。在 dubbo 中有如下几种
负载均衡机制:
- random ———— 随机选择调用方,由于是随机数,有可能存在其中一些服务器的调用次数比其他的多的情况。
- roundrobin ———— 轮询机制,有可能存在堆积请求的问题。
- leastactive ———— 最少调用的调用机制,也就是说内部会记录服务的调用次数,或者说负载情况,
然后选择负载比较少的服务器来进行调用。 - consistenthash ———— 一致性 hash 选择调用机制。一致性 hash 可以做到一台服务器崩掉之后,其他机器来弥补
这台服务器的 hash 范围。这个机制下,默认会选择服务方法的第一个参数作为 hash 的对象,也正是这样,参数相同的请求
就会发送到同一台机器上。这个参数是可以进行设置的,包括一致性 hash 的槽数和 hash 的对象。
<beans>
<!-- 这个配置可以设定要对哪些参数进行 hash,默认是 0,也就是第一个参数 -->
<dubbo:parameter key="hash.arguments" value="0,1" />
<!-- 这个配置可以设定一致性 hash 的槽数 -->
<dubbo:parameter key="hash.nodes" value="320" />
</beans>
如果你要切换负载均衡机制,可以使用下面的配置:
<beans>
<!-- 服务提供者:服务级别 -->
<dubbo:service interface="YourInterface" loadbalance="leastactive" />
<!-- 消费者:服务级别 -->
<dubbo:reference interface="YourInterface" loadbalance="leastactive" />
<!-- 服务提供者:方法级别 -->
<dubbo:service interface="YourInterface">
<dubbo:method name="YourMethod" loadbalance="leastactive"/>
</dubbo:service>
<!-- 消费者:方法级别 -->
<dubbo:reference interface="YourInterface">
<dubbo:method name="YourMethod" loadbalance="leastactive"/>
</dubbo:reference>
</beans>