Dubbo 《Dubbo进阶三》——调用模块

dubbo调用模块核心功能是发起一个远程方法的调用并顺利拿到返回结果,其体系组成如下:

透明代理:通过动态代理技术,屏蔽远程调用细节以提高编程友好性
负载均衡:当有多个提供者是,如何选择哪个进行调用的负载算法
容错机制:当服务调用失败时采取的策略
调用方式:支持同步调用、异步调用
结果获取:指同步等待结果返回,还是异步通过回调通知获取结果:

在这里插入图片描述

 

1.负载均衡:

Dubbo 目前官方支持以下负载均衡策略:

随机(random):按权重设置随机概率。此为默认算法

轮循(roundrobin):按公约后的权重设置轮循比率

最少活跃调用数(leastactive):相同活跃数的随机,活跃数指调用前后计数差

一致性hash(consistenthash):相同的参数总是发到同一台机器

<!-- 服务端级别-->
<dubbo:service interface="..." loadbalance="roundrobin" />
<!-- 客户端级别-->
<dubbo:reference interface="..." loadbalance="roundrobin" />
<!-- 服务端方法级别-->
<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
<!-- 客户端方法级别-->
<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
 

使用一致性hash时,默认虚拟出160个(可配置)节点(以达到分散的效果,节点挂掉不会影响),均匀分配给后端提供者,对默认第一个参数(可配置)进行很复杂的hash,固定指向一个虚拟节点,这个虚拟节点再找到真正的服务提供者。

 

2.容错
Dubbo 官方目前支持以下容错策略:

失败自动切换:调用失败后基于retries=“2” 属性重试其它服务器
快速失败:快速失败,只发起一次调用,失败立即报错
忽略失败:失败后勿略,不抛出异常给客户端
失败重试:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
并行调用:只要一个成功即返回,并行调用指定数量机器,可通过 forks=“2” 来设置最大并行数
广播调用:广播调用所有提供者,逐个调用,任意一台报错则报错
设置方式支持如下两种方式设置,优先级由低至高
 

3.异步调用

异步调用是指发起远程调用之后获取结果的方式。

  • 同步等待结果返回
  • 异步等待结果返回
  • 不需要返回结果

在这里插入图片描述

 

<dubbo:reference id="asyncDemoService" interface="...">
    <!-- 异步调async:true 异步调用 false 同步调用-->
    <dubbo:method name="...1" async="true"/>
    <dubbo:method name="...2" async="false"/>
    <!-- return="false" 不需要返回结果,直接返回-->
    <dubbo:method name="notReturn" return="false"/>
</dubbo:reference>
 

 

4.Dubbo 其它使用场景

是指不通过接口的方式直接将服务暴露出去。通常用于Mock框架或服务降级框架实现。

public static void doExportGenericService() {
    ApplicationConfig applicationConfig = new ApplicationConfig();
    applicationConfig.setName("demo-provider");
    // 注册中心
    RegistryConfig registryConfig = new RegistryConfig();
    registryConfig.setProtocol("zookeeper");
    registryConfig.setAddress("192.168.xxx.xxx:2181");
    ProtocolConfig protocol=new ProtocolConfig();
    protocol.setPort(-1);
    protocol.setName("dubbo");
    GenericService demoService = new MyGenericService();
    ServiceConfig<GenericService> service = new ServiceConfig<GenericService>();
    // 弱类型接口名
    service.setInterface("xxx");
    // 指向一个通用服务实现
    service.setRef(demoService);
    service.setApplication(applicationConfig);
    service.setRegistry(registryConfig);
    service.setProtocol(protocol);
    // 暴露及注册服务
    service.export();
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值