Dubbo官网实战使用技巧
原文链接:Dubbo官网实战使用技巧
1、启动时检查:
我们检查依赖的服务是否启动,可利用下面三个属性,优先级从左到右逐渐降低。
如果服务不是强依赖,或者说服务之间可能存在死循环依赖,我们应该将 check 置为 false。
检查判断优先级:
dubbo.reference.check
> dubbo.consumer.check
> dubbo.registry.check
2、只订阅:
一般在开发环境时,我们新开发的接口都还不能发布出去,所以我们本地的服务不能往注册中心注册;
而且,如果我们将本地服务注册上去,会影响别的服务的联调,所以我们会利用下面属性,将服务设置为只订阅,不往注册中心注册。
dubbo.registry.register=false
dubbo.registry.subscribe=true
3、集群容错:
集群容错模式可利用 dubbo.reference.cluster
、dubbo.consumer.cluster
和 dubbo.service.cluster
、dubbo.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> }
**/
@Override
public 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官网实战使用技巧的更多相关文章
- dubbo官网和帮助文档
dubbo官网和帮助文档 https://github.com/apache/incubator-dubbo 内含帮助文档: http://dubbo.apache.org/books/dubbo-d ...
- 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。
这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇.老规矩,先荒腔走板聊聊其他的. 上面这张图片是我前几天整理相册的时候看到的.拍摄于 20 ...
- Sass实战 sass官网
Sass实战 sass官网 1.相关视频教程:http://pan.baidu.com/s/1eSl8bUa 1.1我的项目源码:http://pan.baidu.com/s/1dFmqbyp 1.2 ...
- dubbo系列一:dubbo介绍、dubbo架构、dubbo的官网入门使用demo
一.dubbo介绍 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成.简单地说,dubbo是一个基于Spri ...
- selenium自动化测试实战——12306铁路官网范例
一.Selenium介绍 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Se ...
- Reveal常用技巧(翻译来自Reveal官网blog)
翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥 ...
- 学习技巧-如何在IBM官网寻找学习资料
场景:最近看招聘职位TM1比较火,于是就想找一下Cognos TM1的资料来拜读一下,然后论坛都是大价钱的金币,迫于无奈只好来到IBM的官网来寻求指导 http://www.ibm.com/us/en ...
- [干货]Chloe官网及基于NFine的后台源码毫无保留开放
扯淡 经过不少日夜的赶工,Chloe 的官网于上周正式上线.上篇博客中LZ说过要将官网以及后台源码都会开放出来,为了尽快兑现我说过的话,趁周末,我稍微整理了一下项目的源码,就今儿毫无保留的开放给大家, ...
- 如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码
概述 http://my97.net/是一个web浏览器的日期选择控件,非常好用,做得非常棒,各种API等事件等都很方便,但是使用了4.8beta3之后,在控件上面右击会出现官网链接 ,这个是PM以及 ...
随机推荐
- idea破解方式:永久激活
相信很多小伙伴都发现了,每年到年底的时候,idea注册码都大面积的失效,早上到办公室打开电脑发现注册码过期,还要花很长时间找新的: 这里介绍两种破解方式,都是有生之年不到期:与网上现有的方式基本一致. ...
- 并发编程--锁--volatile
在讲volatile关键字之前我们先了解Java的内存模型,Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主 ...
- R语言学习笔记-单一决策树
决策树比较简单明晰,但存在不稳定的风险,数据的微小变化会导致最佳决策树结构的巨大变化,且决策树可能会变得比较复杂. 其算法原理参见https://zhuanlan.zhihu.com/p/148010 ...
- Tomca7t服务器 配置HTTP和HTTPS 同时访问
(首先你要有 ssl 证书 ,我是阿里的 ) 查看申请ssl证书(https://www.cnblogs.com/lxf-mw/p/14261303.html) 一.下载 tomcat证书(两个文件) ...
- 万万没想到,JVM内存区域的面试题也可以问的这么难?
二.Java内存区域 1.Java内存结构 内存结构 程序计数器 当前线程所执行字节码的行号指示器.若当前方法是native的,那么程序计数器的值就是undefined. 线程私有,Java内存区域中 ...
- Flutter 布局类组件:层叠布局(Stack和Positioned)
前言 层叠布局,即子组件可以根据距父容器四个角的位置来确定自身的位置.绝对定位运行子组件堆叠起来,即按照代码中声明的顺序. Flutter中使用Stack和Positioned这两个组件来配合实现绝对 ...
- SpringBoot 集成Shiro之使用Redis缓存授权认证信息
因为用户认证与授权需要从数据库中查询并验证信息,但是对于权限很少改变的情况,这样不断从数据库中查询角色验证权限,对整个系统的开销很大,对数据库压力也随之增大.因此可以将用户认证和授权信息都缓存起来,第 ...
- Centos 6 下安装 OSSEC-2.8.1 邮件告警 (二)
Ossec 配置邮件通知 ## 1 安装软件包: yum install -y sendmail mailx cyrus-sasl cyrus-sasl-plain #安装postfix邮件相关的软件 ...
- 【Java】面向对象 - 封装
继承 封装 多态 重新搞一波 复习巩固 简单记录 慕课网 imooc Java 零基础入门-Java面向对象-Java封装 封装 封装是什么? 将类的某些信息隐藏在类内部,不允许外部程序直接访问 通过 ...
- 【RAC】通过命令查看当前数据库是不是rac
SQL> show parameter cluster_database 如果参数中显示的是 NAME TYPE ...