dubbo的常用配置(基于注解)
之前记录了基于springboot的dubbo入门案例,今天在此基础上记录dubbo官网介绍的常用属性配置,dubbo读取我们配置的属性时是有优先级的,优先级如下图:

如图所示,优先级的属性依次为虚拟机参数>xml配置>dubbo.properties,虚拟机参数即程序启动之前我们通过-D配置的dubbo属性,xml配置即我们项目中自己写的xml文件或者是springboot中的application.properties,当公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置的情况下可以用dubbo.properties作为缺省配置;需要注意的是我这里的测试用例都是写在application.properties中,当然如果感觉不习惯,也可以跟普通maven项目一样新建xml文件,在xml中进行配置,只是不要忘了在springboot的启动类中添加@ImportResource(locations="xml路径")注解来引入就行,下面开始记录dubbo的常用配置;
一、启动时检查(check)
默认情况下dubbo是开启自动检查的,即当项目启动时会自动检查其依赖的服务是否开启,如果没开是会阻止spring的初始化的,即check=true;我们可以将check置为false来关闭启动时检查,如我们在测试或者对其他服务没有依赖的时候可以关闭检查;在springboot中我们可以进行如下配置来关闭启动时检查:
1、关闭某个服务的启动检查
在引用该服务的@Reference注解上添加check=false,即@Reference(check = false)
2、关闭所有服务的启动时检查
在application.properties中添加dubbo.consumer.check=false
二、超时(timeout,默认为1000),重试次数(retries)
超时:当消费者调用提供者时由于网络等原因有可能会造成长时间拿不到响应,而请求还在不断的发过来这就有可能造成线程阻塞,使用timeout设置超时时间当超过该时间就会抛出异常;设置如下:
当只针对某个服务时:@Reference(timeout=XXX)
当针对所有服务时:dubbo.consumer.timeout=XXX
重试次数:当调用失败或超时后重新尝试调用的次数,其值不包含第一次
当只针对某个服务时:@Reference(retries=XXX)
当针对所有服务时:dubbo.consumer.retries=XXX
三、多版本(灰色发布)
当出现系统版本升级时,新版本有可能不够稳定,这时候可以通过设置version来进行平滑的过渡,下面是dubbo官网的版本迁移步骤:
在低压力时间段,先升级一半提供者为新版本,再将所有消费者升级为新版本,然后将剩下的一半提供者升级为新版本
而新旧版本我们可以通过version来定义,假设老版本的version=1.0.0新版本的version=2.0.0;
老版本服务提供者:@Service(version='1.0.0')
新版本服务提供者:@Service(version='2.0.0')
老版本服务消费者:@Reference(version='1.0.0')
新版本服务消费者:@Reference(version='2.0.0')
这样新旧版本就完美错开,只会调用version对应的服务,如果调用的时候不需要区分版本号,则进行如下配置:@Reference(version='*'),这样dubbo会默认在新老版本中随机调用
四、本地存根(stub)
正常情况下,服务搭建成功后服务的实现一般都在服务端,但有时候我们可能需要在客户端做些逻辑操作,比如参数验证,缓存处理以及调用失败后伪造容错数据的处理等等,这时候我们就需要用到dubbo的本地存根机制,他能在远程服务调用前在客户端进行相关的逻辑操作,具体步骤如下:
1、在客户端写一个远程调用服务的实现,并生成有参构造参数为远程服务,代码如下:
package com.darling.boot.order.service; import com.darling.pubIn.bean.User;
import com.darling.pubIn.service.UserService;
import org.springframework.util.StringUtils; import java.util.List; /**
* @author 董琳琳
* @date 2018/10/10 15:11
* @description userService的本地存根实现
*/
public class UserServiceStub implements UserService{
private final UserService userService; /**
* 有参构造 dubbo会自动将远程Userservice注入进来
* @param userService
*/
public UserServiceStub(UserService userService) {
this.userService = userService;
} /**
* 在远程调用前可以进行判断
* @param userId
* @return
*/
@Override
public List<User> getUserAddressList(String userId) {
// 如果userId不为空则进行远程调用 否则不调
if(!StringUtils.isEmpty(userId)) {
return userService.getUserAddressList(userId);
}
return null;
} @Override
public void sayHello() { }
}
2、进行存根配置
在客户端调用远程服务的注解上添加stub,值为我们客户端实现的远程服务类的全路径名,如@Reference(stub = "com.darling.boot.order.service.UserServiceStub")
五、负载均衡
dubbo提供了四种负载均衡策略,分别是:
1、Random LoadBalance 按权重的随机负载均衡,也是dubbo默认的负载均衡策略
2、RoundRobin LoadBalance 按权重的轮询负载均衡,即在轮询的基础上添加了权重的策略
3、LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机访问,活跃数指调用前后的计数差即响应时间的长短;这种策略可以使响应慢的提供者收到的请求较少,大大提供系统性能
4、ConsistentHash LoadBalance 一致性哈希;相同参数的请求总是发到同一提供者
负载均衡的配置:@Reference(loadbalance = "roundrobin"),loadbalance 的值即为四种负载均衡的名称,全部小写
六、服务降级
当服务器压力过大时,我们可以通过服务降级来使某些非关键服务的调用变得简单,可以对其直接进行屏蔽,即客户端不发送请求直接返回null,也可以正常发送请求当请求超时或不可达时再返回null;服务降级的相关配置可以直接在dubbo-admin的监控页面进行配置;通常是基于消费者来配置的,在dubbo-admin找到对应的消费者想要降级的服务,点击其后面的屏蔽或容错按钮即可生效;其中,屏蔽按钮点击表示放弃远程调用直接返回空,而容错按钮点击表示继续尝试进行远程调用当调用失败时再返回空
七、集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。下面列举dubbo支持的容错策略:
Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="XXX" 来设置重试次数(不含第一次)。
Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。
配置如下:@Reference(cluster = "failsafe")这里表示使用失败安全的容错策略
还有一种springcloud默认的容错策略Hystrix;Hystrix旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能,下面介绍如何整合Hystrix:
1、分别在提供者和消费者添加Hystrix依赖,或者直接在公共接口层添加,代码如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
2、在提供者和消费者的启动类上添加@EnableHystrix来启用hystrix;
3、在提供者需要容错的方法上添加@HystrixCommand表示使用hystrix代理:
@HystrixCommand // 开启Hystrix代理
@Override
public List<User> getUserAddressList(String userId) {
ArrayList list = new ArrayList();
list.add(new User(3,"韦德3","男",36,"迈阿密"));
list.add(new User(23,"詹姆斯23","男",34,"洛杉矶"));
list.add(new User(24,"科比24","男",39,"洛杉矶"));
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
return list;
}
4、在消费者需要容错的方法上添加@HystrixCommand,还可以给其添加属性,表示调用出错后处理错误的方法:
package com.darling.boot.order.service; import com.alibaba.dubbo.config.annotation.Reference;
import com.darling.pubIn.bean.User;
import com.darling.pubIn.service.OrderService;
import com.darling.pubIn.service.UserService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service; import java.util.List; /**
* @author 董琳琳
* @date 2018/10/8 11:42
* @description
*/
@Service
public class OrderServiceimpl implements OrderService { @Reference(version = "*",stub = "com.darling.boot.order.service.UserServiceStub",cluster = "")
UserService service; @HystrixCommand(fallbackMethod = "handlerException")
@Override
public List<User> initOrder(String userId) {
return service.getUserAddressList(userId);
} /**
* 表示调用出错后进行的处理,这里没有处理直接返回null
* @param userId
* @return
*/
public List<User> handlerException(String userId) {
return null;
}
}
在整合hystrix 时发现一个奇怪的现象,就是当你一旦在消费端整合hystrix 后,只要你发送的请求没有进行远程调用,即使该请求没有出错并且正常返回了还是会进入fallbackMethod指定的容错方法,百思不得其解, 准备后期去网上问问大神们
由于时间关系,我对照官网就实现了以上几种配置,还有许多其他配置没有使用,希望在以后的工作中能有机会用到,到时候再回来记录,这篇笔记的dubbo属性配置有个值得注意的地方,就是我几乎所有的配置都是在引用服务的注解@Reference上进行的,而dubbo支持多种配置,除了全局配置还可以精确到给具体的类具体的方法进行配置,也可以给提供者和消费者进行配置,下面记录dubbo的配置原则:
dubbo推荐在Provider上尽量多配置Consumer端属性,原因如下:
1、作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
2、在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的
配置优先级: 方法级优先,接口级次之,全局配置再次之;如果级别一样,则消费方优先,提供方次之
dubbo的常用配置(基于注解)的更多相关文章
- SSM配置基于注解AOP
pom.xml <dependency> <groupId>org.springframework</groupId> <artifactId>spri ...
- 缓存初解(三)---Spring3.0基于注解的缓存配置+Ehcache和OScache
本文将构建一个普通工程来说明spring注解缓存的使用方式,关于如何在web应用中使用注解缓存,请参见: Spring基于注解的缓存配置--web应用实例 一.简介 在spring的modules包中 ...
- SSM和Spring Boot常用配置比较
一.Dao层相关 1.Mysql相关: 1.1配置DataSource连接池: (1)SSM配置: <!-- 加密后配置自己写的解析文件 --> <bean class=" ...
- springmvc——基于xml的异常映射和基于注解的异常映射
SpringMVC提供了基于XML和基于注解两种异常映射机制.这两种异常映射不能够只使用一个,他们需要一起使用.因为有些异常是基于注解异常映射捕获不到的. 在springmvc中,一个请求如果是由&l ...
- 基于注解的Dubbo服务配置
基于注解的Dubbo服务配置可以大大减少dubbo xml配置文件中的Service配置量,主要步骤如下: 一.服务提供方 1. Dubbo配置文件中增加Dubbo注解扫描 <!-- ...
- [问题解决]基于注解配置dubbo遇到ConnectionLoss for /dubbo/xxx问题解决
今天升级spring版本的时候,同时升级dubbo的版本,采用的是dubbo的基于注解的配置方法,采用curator作为dubbo的客户端, curator版本为4.1.0,启动之后,发现一直报错 C ...
- Struts2基于注解的Action配置
使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...
- Spring IOC之基于注解的容器配置
Spring配置中注解比XML更好吗?基于注解的配置的介绍提出的问题是否这种途径比XML更好.简单来说就是视情况而定. 长一点的答案是每一种方法都有自己的长处也不足,而且这个通常取决于开发者决定哪一种 ...
- spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)
1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...
随机推荐
- 【VS工具】vs2017中的一些小功能
一.json转为类 1.打开一个json文件,复制 2.打开一个.cs文件,将json粘贴为类 3.got it 二.C#交互窗口 1.视图->其他窗口->C#交互窗口 2.打开了一个窗 ...
- UI组件--element-ui--Table组件自定义合计行
需求: Element-ui的Table组件自带合计行, 但是需求需要在合计行的某些单元格有特别的样式以及事件, 没有研究出怎么在既有合计行上完成此需求, 于是利用其原本的一些属性完成自定义合计行. ...
- c++ 线程间通信方式
一:两个进程间的两个线程通信,相当于进程间通信 二:一个进程中的两个线程间通信 通信方式: 1.互斥锁 mutex; lock_guard (在构造函数里加锁,在析构函数里解锁) unique_loc ...
- 【安卓基础】ImageView与EditText联动实现隐藏与显示密码
项目中经常会有这样的需求,在密码输入框的右边有一个小图标,点击就切换显示和隐藏密码. 其实这里需求实现起来是比较容易的,主要考虑是复用问题,因为登陆.注册.修改密码界面都会有这样的情景,如果每个界面都 ...
- 算法笔记--manacher算法
参考:https://www.cnblogs.com/grandyang/p/4475985.html#undefined 模板: ; int p[N]; string manacher(string ...
- Lyrics来源
Lyre 里拉琴,古希腊语,在北欧流行至中世纪. Lyrics in sheet music. This is a homorhythmic (i.e., hymn-style) arrangem ...
- time series 时间序列 | fractional factorial design 部分要因试验设计
作业: 1) A plot of data from a time series, which shows a cyclical pattern – please show a time series ...
- pycharm配置可视化数据库
出于数据库安全性,数据库管理员会给数据库配置SSH,也就是为数据库增加一个安全协议(通信加密),加大外部用户对该数据库远程连接的难度. 利用SSH通道来连接远程数据库时需要以下信息:远程数据库服务器I ...
- nodejs window平台上 以服务运行
刚学nodejs 想使用 sc create 来创建服务,但是倒腾了很久没有弄出来,创建是成功了,使用 net start 启动服务报错,没有控制功能.后来网上找了一下 发现这个东西:nssm 使用 ...
- IIS Service Unavailable HTTP Error 503. The service is unavailable.
IIS突然报了上图这样一个错误,很意外,这问题的来源百度上有多个版本,处理的办法几乎都是一样的,你可以通过下边这个链接去查看, https://www.cnblogs.com/fri-yu/p/407 ...