1、启动时检查:

我们检查依赖的服务是否启动,可利用下面三个属性,优先级从左到右逐渐降低。
如果服务不是强依赖,或者说服务之间可能存在死循环依赖,我们应该将 check 置为 false。

检查判断优先级:
dubbo.reference.check > dubbo.consumer.check > dubbo.registry.check

2、只订阅:

一般在开发环境时,我们新开发的接口都还不能发布出去,所以我们本地的服务不能往注册中心注册;
而且,如果我们将本地服务注册上去,会影响别的服务的联调,所以我们会利用下面属性,将服务设置为只订阅,不往注册中心注册。

dubbo.registry.register=false
dubbo.registry.subscribe=true

3、集群容错:

集群容错模式可利用 dubbo.reference.clusterdubbo.consumer.clusterdubbo.service.clusterdubbo.provider.cluster 等属性配置。

集群容错中主要有几个角色:

Invoker:Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址以及 Service 接口信息。

Directory:代表多个 Invoker ,可以把它看成是 List,但是与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更。

Cluster:将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。

Router:负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等。

LoadBalance:负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选

dubbo 提供的集群容错模式:

Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)。

Failfast Cluster:快速失败,即只发起一次调用,失败立即报错。通常用于非幂等性的写操作。

Failsafe Cluster:失败安全,出现异常时直接忽略掉。通常用于写入审计日志等不重要的操作。

Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

Forking Cluster:并行调用多个服务器,只要一个成功就返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。

Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

4、负载均衡:

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

Random LoadBalance:

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance:

  • 轮询,按公约后的权重设置轮询比率。
  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance:

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance:

  • 一致性 Hash,相同参数的请求总是发到同一提供者。
  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
  • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
  • 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key=“hash.arguments” value=“0,1” />
    缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key=“hash.nodes” value=“320” />

可在服务端服务级别、客户端服务级别、服务端方法级别和客户端方法级别设置。

服务端服务级别&客户端服务级别配置:

dubbo.provider.loadbalance=leastactive
dubbo.consumer.loadbalance=leastactive

服务端方法级别和客户端方法级别配置:

@DubboService(interfaceClass = DubboServiceOne.class,loadbalance = "random",methods = {@Method(name="sayHello",loadbalance = "leastActive")})
public class DubboServiceOneImpl implements DubboServiceOne {}@DubboReference(loadbalance = "random",methods = {@Method(name="sayHello",loadbalance = "leastactive")})
private DubboServiceOne DubboServiceOne;

5、直连提供者

在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表。

在 JVM 启动参数中加入 -D 参数映射服务地址:

java -D com.alibaba.xxx.XxxService=dubbo://localhost:20890

<dubbo.reference>标签或者@DubboResource注解中增加 url 属性。

<debbo.reference url="dubbo://localhost:20890" interfaceClass=""/>
@DubboReference(url="dubbo://localhost:20890")
private DubboServiceOne DubboServiceOne;

6、本地调用

本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。

protocol、provider、consumer、service、reference 都可以设置。

7、本地存根

远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub ,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。

Sub 利用 dubbo.service.sub 属性设置。

例子:

假设服务提供者提供了一个接口,DubboServiceOne,然后服务消费者要做本地存根,只需要在自己的项目中,增加一个 DubboServiceOne 接口的实现类,然后在 @DubboReference 注解或者 <dubbo:reference> 标签增加 stub 属性即可。

实现类:

/*** DubboServiceOne 本地存根* @author winfun* @date 2021/2/1 9:59 上午**/
@Slf4j
public class DubboServiceOneStub implements DubboServiceOne {private final DubboServiceOne dubboServiceOne;public DubboServiceOneStub(DubboServiceOne dubboServiceOne){this.dubboServiceOne = dubboServiceOne;}/****  say hello* @author winfun* @param name name* @return {@link ApiResult <String> }**/@Overridepublic ApiResult<String> sayHello(String name) {try {ApiResult<String> result = this.dubboServiceOne.sayHello(name);if (ApiContants.SUCCESS.equals(result.getCode())){return ApiResult.fail(ApiContants.FAIL,"业务异常",result.getData());}}catch (Exception e){log.error("call DubboServiceOne throw exception!message is {}",e.getMessage());return ApiResult.fail("调用失败");}return null;}
}

使用:

/*** 测试本地存根* @author winfun* @date 2021/2/1 10:26 上午**/
@RestController
public class TestStubController {@DubboReference(lazy = true,check = false,stub = "com.winfun.demo.stub.DubboServiceOneStub")private DubboServiceOne dubboServiceOne;@GetMapping("/stub/{name}")public ApiResult<String> testStub(@PathVariable("name") String name){return this.dubboServiceOne.sayHello(name);}
}

8、本地伪装

本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 mock 数据返回授权失败。

mock 是 sub 的一个子集,mock是发生了错误,也就是抛出 RpcException 异常时会触发;而使用 sub,那么就需要在程序捕获异常,然后进行处理。

mock 机制可利用<dubbo.reference>标签或者@DubboReference的mock属性设置。

详细可看我自己写的文章:https://blog.csdn.net/Howinfun/article/details/113439208

9、服务延迟暴露

Dubbo 2.6.5 之后,所有服务都将在 Spring 初始化完成后进行暴露,如果你不需要延迟暴露服务,无需配置 delay。

可使用 dubbo.service.delay 属性来设置延迟多少秒暴露服务。delay 的时间单位为毫秒。

10、并发控制

并发控制都是在服务提供者端设置的。

首先,可通过 dubbo.service.executes 属性限制服务端每个方法的并发量(占用线程池线程数)、通过 dubbo.method.executes(服务端) 属性直接将并发限制具体到接口的某个方法。

还可以通过 dubbo.service.actives/dubbo.reference.actives 属性控制接口每个方法每个客户端的并发执行数;
通过 dubbo.method.actives(两端) 属性直接将并发执行控制到接口的某个方法。

Dubbo官网实战使用技巧相关推荐

  1. Dubbo 3 易用性升级之 Dubbo 官网大改版

    Dubbo 3 是 Dubbo 新的里程碑,Dubbo 的生态组件(包括 Dubbo Java SDK,Dubbo Golang SDK 等)都在向 Dubbo 3 的目标靠拢,在用户实践方面,包括阿 ...

  2. Web前端仿小米官网实战总结

    Web前端仿小米官网实战总结 自学前端至今实在是感慨万千,一个人学习太累,自律能力不太够,学习速度跟不上技术更新速度,所以学习技术是一定不能偷懒的,更不能沉迷游戏,要坚持学习,最好有人带,实在不行就报 ...

  3. Apache Dubbo官网推荐使用建议

    1.在 Provider 端尽量多配置 Consumer 端属性 原因如下: 作服务的提供方,比服务消费方更清楚服务的性能参数,如调用的超时时间.合理的重试次数等 在Provider 端配置后,Con ...

  4. dubbo官网最新版导航

    用户手册: https://dubbo.gitbooks.io/dubbo-admin-book/ 开发者手册: https://dubbo.gitbooks.io/dubbo-dev-book/ 管 ...

  5. 022-企业站:纽曼移动端微官网实战

    一.移动端纽曼项目轮播效果实现 jquery.touchSwipe.js插件,适合手机客户端手势上下滑屏的jQuery插件 滑动事件: swipe (事件,滑动的方向,滑动的距离,一次滑动的时间 , ...

  6. 021-企业站:纽曼移动端微官网实战

    一.移动端纽曼项目首页菜单栏模块 二.移动端纽曼项目首页产品中心模块 三.移动端纽曼项目首页新闻列表模块 四.移动端纽曼项目首页公司简介模块

  7. dubbo官方文档_狂神说SpringBoot17:Dubbo和Zookeeper集成

    狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习.未经作者授权,禁止转载 分布式理论 什么是分布式系统? 在<分布式系统原理与范 ...

  8. 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。

    这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇.老规矩,先荒腔走板聊聊其他的. 上面这张图片是我前几天整理相册的时候看到的.拍摄于 20 ...

  9. 前端实战:仿写小米官网第一天

    前端实战的第一天 小米官网 目前效果: 实现功能: 导航栏,首页切换,无淡入淡出效果的轮播图,搜索功能,产品展示栏下滑 代码(便于记录,将js.css和html糅合在了一起): <!DOCTYP ...

最新文章

  1. Objective-C RunTime 学习笔记 之 AutoReleasPool
  2. 如何判断服务器之间的服务是否可用?ping 还是 telnet?
  3. 实战:搭建CA认证中心,使用CA证书搭建HTTPS
  4. Java 成员变量和局部变量
  5. 看动画学算法之:栈stack
  6. AspNetPager 修改 然后返回当前页
  7. 什么时候使用z编码_你什么时候编码?
  8. 智能工厂系统架构图_一些智能化弱电系统架构图,做方案可以用
  9. python 购物车程序_Python 购物车程序(文件版)
  10. 在dotnetnuke中去掉显示姓名中的空格
  11. Java邮件发送:带附件 or 不带附件 is nothing
  12. SketchUp: Rendering Using Twilight SketchUp:使用暮光之城进行渲染 Lynda课程中文字幕
  13. 惠普触控板使用指南_hp触摸板(hp笔记本触摸板怎么开)
  14. 笔记本连接显示器后没有声音_外接显示器后没声音怎么回事
  15. 8路sdi(DVI)多媒体分布式互动录播主机4K输出
  16. nox模拟器(安卓5.1)adb连接
  17. 电商直播增加人气,留人技巧有哪些
  18. 组合数据类型练习,英文词频统计实例
  19. 学习WordPress必须知道的函数(转)
  20. 服务器里微信怎么多开,谈谈微信多开

热门文章

  1. 2017美团网易360部分笔试题
  2. 【数据结构笔记】将两个递增的有序链表合并为一个递增的有序链表
  3. 流程图设计教程和参考样例
  4. 让Unicode字符集少添麻烦
  5. 移动办公模式下的业务 微易聊微信管理系统作用显著!
  6. Kafka Message Dilivery Semantics
  7. 大数据信息时代,如何防止数据泄露,大数据防泄漏解决方案
  8. 微信小程序使用tensorflow做人脸识别检测卡顿的部分解决思路
  9. 数字化赋能三农 农行、邮储如何保“质”更保“智”?
  10. 医疗人工智能前景——医学影像