ubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。若是check=false,老是会返回引用,当服务恢复时,能自动连上。数据库
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%90%AF%E5%8A%A8%E6%97%B6%E6%A3%80%E6%9F%A5服务器
在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试。经过配置 retries="2"(注意,这个2不包含第一次错误的计数) 能够达到3次错误就不在重试多线程
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E9%9B%86%E7%BE%A4%E5%AE%B9%E9%94%99并发
在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。app
关键配置项:loadbalance="roundrobin"负载均衡
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1dom
示例:异步
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8Bide
在开发及测试环境下,常常须要绕过注册中心,只测试指定服务提供者,这时候可能须要点对点直连,性能
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E7%9B%B4%E8%BF%9E%E6%8F%90%E4%BE%9B%E8%80%85
不一样的服务使用不一样的协议传输,不一样服务在性能上适用不一样协议进行传输,好比大数据用短链接协议,小数据大并发用长链接协议。
同一个服务使用多种协议,例如须要与http客户端互操做
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%A4%9A%E5%8D%8F%E8%AE%AE
服务消费者使用多个服务提供者的服务,
当一个接口有多种实现时,能够用group区分。
示例:
<dubbo:service group="feedback" interface="com.xxx.IndexService" /> <dubbo:service group="member" interface="com.xxx.IndexService" />
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" /> <dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />
当一个接口实现,出现不兼容升级时,能够用版本号过渡,版本号不一样的服务相互间不引用。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%8F%82%E6%95%B0%E9%AA%8C%E8%AF%81
回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,可以测试整个调用是否通畅,可用于监控。
MemberService memberService = ctx.getBean("memberService"); // 远程服务引用 EchoService echoService = (EchoService) memberService; // 强制转型为EchoService String status = echoService.$echo("OK"); // 回声测试可用性 assert(status.equals("OK"))
上下文中存放的是当前调用过程当中所需的环境信息。
xxxService.xxx(); // 远程调用 boolean isConsumerSide = RpcContext.getContext().isConsumerSide(); // 本端是否为消费端,这里会返回true String serverIP = RpcContext.getContext().getRemoteHost(); // 获取最后一次调用的提供方IP地址 String application = RpcContext.getContext().getUrl().getParameter("application"); // 获取当前服务配置信息,全部配置信息都将转换为URL的参数 // ... yyyService.yyy(); // 注意:每发起RPC调用,上下文状态会变化 // ...
public class XxxServiceImpl implements XxxService { public void xxx() { // 服务方法实现 boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 本端是否为提供端,这里会返回true String clientIP = RpcContext.getContext().getRemoteHost(); // 获取调用方IP地址 String application = RpcContext.getContext().getUrl().getParameter("application"); // 获取当前服务配置信息,全部配置信息都将转换为URL的参数 // ... yyyService.yyy(); // 注意:每发起RPC调用,上下文状态会变化 boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 此时本端变成消费端,这里会返回false // ... } }
RpcContext是一个ThreadLocal的临时状态记录器,当接收到RPC请求,或发起RPC请求时,RpcContext的状态都会变化。
好比:A调B,B再调C,则B机器上,在B调C以前,RpcContext记录的是A调B的信息,在B调C以后,RpcContext记录的是B调C的信息。
基于NIO的非阻塞实现并行调用,客户端不须要启动多线程便可完成并行调用多个远程服务,相对多线程开销较小。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8
参数回调方式与调用本地callback或listener相同,只须要在Spring的配置文件中声明哪一个参数是callback类型便可,Dubbo将基于长链接生成反向代理,这样就能够从服务器端调用客户端逻辑。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%8F%82%E6%95%B0%E5%9B%9E%E8%B0%83
在调用以前,调用以后,出现异常时,会触发oninvoke, onreturn, onthrow三个事件,能够配置当事件发生时,通知哪一个类的哪一个方法。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E4%BA%8B%E4%BB%B6%E9%80%9A%E7%9F%A5
限制服务消费者调用服务提供者的并发数和链接数
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6