启动时检查
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认check="true"
。
可以通过check="false"
关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
下面我们展示通过xml的配置,Properties和java配置不介绍。
关闭某个服务的启动时检查:
<dubbo:reference interface="com.foo.BarService" check="false" />
关闭所有服务的启动时检查:
<dubbo:consumer check="false" />
关闭注册中心启动时检查:
<dubbo:registry check="false" />
集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息。
Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更。
Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等。
LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。
Failover Cluster
失败自动切换,当出现失败,重试其它服务器 。可通过 retries=“2” 来设置重试次数(不含第一次)。
比如:
<dubbo:service retries="2" />
或者
<dubbo:reference retries="2" />
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。
集群模式配置
<dubbo:service cluster="failsafe" />
或者
<dubbo:reference cluster="failsafe" />
负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
- Random LoadBalance
随机,按权重设置随机概率。 - RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 - LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 - ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
<!--服务级别-->
<dubbo:service interface="..." loadbalance="roundrobin" />
<!--方法级别-->
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
或者
<!--服务级别-->
<dubbo:reference interface="..." loadbalance="roundrobin" />
<!--方法级别-->
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
线程模型
如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。
但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。
因此,需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景:
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
- Dispatcher属性:
all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。此外还有direct、message、execution、connection - ThreadPool属性:
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有(缺省)。此外还有cached、limited、eager
直连提供者
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。
如果是线上需求需要点对点,可在<dubbo:reference>
中配置 url 指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下:
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
其他:略
参考
http://dubbo.apache.org/zh-cn/docs/user/demos/subscribe-only.html