其他常用配置#
示例, dubbo常用的配置示例
启动时检查#
服务的消费者在启动是会去检查自己需要远程调用的服务是否已经注册到了 注册中心中, 一旦检查到注册中心没有检查到即使没有调用这个方法也会自动报错而阻止Spring启动,在开发时,可以选择手动关掉这个配置
- 通过配置文件
配置某个服务启动时检查 在服务消费者中,关闭某个服务的启动时检查 (没有提供者时报错): <dubbo:reference interface="com.foo.BarService" check="false" /> 统一配置全部服务启动时不检查 关闭所有服务的启动时检查 (没有提供者时报错): <dubbo:consumer check="false" /> 默认是true. 表示注册中心不存在时报错 关闭注册中心启动时检查 (注册订阅失败时报错): <dubbo:registry check="false" />
- 通过dubbo.properties
dubbo.reference.com.foo.BarService.check=false dubbo.reference.check=false dubbo.consumer.check=false dubbo.registry.check=false
- 通过JVM参数
java -Ddubbo.reference.com.foo.BarService.check=false java -Ddubbo.reference.check=false java -Ddubbo.consumer.check=false java -Ddubbo.registry.check=false
超时设置#
消费者远程调用服务提供者, 服务提供者的实现逻辑可能存在大量的耗时操作,这是就可能存在大量的线程阻塞在这个方法上, 超时设置解决了这个问题,一旦在指定的时间内,依然没有返回任何数据,同样会立即返回,保证系统的可用
缺省使用dubbo:consumer的timeout, 而dubbo:cosumer中默认的超时时间是 1000ms
如下,设置超时时间为3秒
<!-- 生成远程服务代理,可以和本地bean一样使用 userService --> <dubbo:reference id="userService" interface="com.changwu.service.UserService" timeout="3000"/>
从上图中,我标记了他们的作用,最优先的就是方法级别, 接口次之 , 全局级别最低 , -- 相同级别的消费者设置优先,提供者设置次之
重试次数#
一般超时配置timeout 和 重试次数retries 配合使用
调用失败后,会根据重试的次数再次尝试远程调用, 重试次数不包含第一次,如果我们配置的3, 算上第一次,最多尝试调用四次
如果服务提供者存在集群, 消费者就会轮询集群进行重试
- 幂等次数
- 查询,删除,修改(特点是,同样的请求,同样的参数无论执行多少次,产生的结果都是一样的), 设置重试次数
- 非幂等
- 新增,不设置幂等次数, retries=0
<!-- 生成远程服务代理,可以和本地bean一样使用 userService --> <dubbo:reference id="userService" interface="com.changwu.service.UserService" retries="3" timeout="3000"/>
多版本#
我们给系统的某些功能进行了升级,但是不能一下把升级后的代码一次性全部适用到集群中的全部机器上,使用多版本控制,先把集群中的一小部分机器进行升级,没有出现不可用现象再逐步拓展规模,最终完成全部替换
新旧版本的服务提供者全部继承同一个接口com.foo.BarService , 通过ref指向不同的实现Bean
老版本服务提供者配置: <dubbo:service interface="com.foo.BarService" version="1.0.0" ref="userService1" /> <bean id="userService1" class="xxx"> 新版本服务提供者配置: <dubbo:service interface="com.foo.BarService" version="2.0.0" ref="userService2"/> <bean id="userService2" class="yyy">
老版本服务消费者配置: <dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" /> 新版本服务消费者配置: <dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" /> 如果不需要区分版本,可以按照以下的方式配置 [1]: <dubbo:reference id="barService" interface="com.foo.BarService" version="*" />
本地存根#
如果想在服务的消费者发送远程过程调用其他方法之前进行,进行参数的验证,如,判空处理, 可以选择使用本地存根
如, UserService 是某个服务提供者实现的, 消费者远程调用这个服务,进行如下配置消费者在本地提供自己的实现,并判断参数的合法性
public class UserServiceImpl implements UserService{ // 注入这个被服务提供者支持的接口 private final UserService userService; // 提供构造函数 public UserServiceImpl(UserService userService) { this.userService = userService; } @Override public List<UserAddress> getUserAddressList(String userId) { // 判空 if (!StringUtils.isEmpty(userId)){ return userService.getUserAddressList(userId); } return null; } }
- 配置文件
在 spring 配置文件中按以下方式配置: # 是消费者在本地自己的实现 com.changwu.service.UserServiceImpl <dubbo:service interface="com.changwu.service.UserServiceImpl" stub="true" /> 或 <dubbo:service interface="com.foo.BarService" stub="com.changwu.service.UserServiceImpl" />
Dubbo和SpringBoot整合的三种方式#
方法1#
- 引入dubbo-starter
- 在主配置类上使用@EnableDubbo (指定 包扫描规则)
- 在application.properties配置属性
- 服务提供者: 使用 @Service 暴露服务
- 服务消费者: 使用 @Reference 引用服务
方法2#
如果还想添加诸如方法级别的配置,则保留dubboxml的配置文件
- 在启动类上去掉@EnableDubbo注解
- 在启动类上添加@ImportResource(localtion="classpath:provider/consumer.xml")
- 去掉 application.properties 中的有关dubbo配置
- 服务提供者使用 provider.xml 配置文件
- 服务消费者是有 consumer.xml 配置文件
方法3 注解配置#
要求使用dubbo为2.6.3