Dubbo第二篇



没有实践的项目,对Dubbo理解还不深入


1. 启动时检查

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题


我们可以关闭检查,比如测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动

dubbo.consumer.check=false
dubbo.reference.check=false
dubbo.registry.check=false




2. 超时、配置覆盖关系、属性优先级


2.1 超时

provider因为网络等原因很长时间才返回,此时造成消费者阻塞,所以可以设置超时来解决,默认1000毫秒

可在注解内设置timeout

@Reference(timeout = 5000)

2.2 配置覆盖关系

  • 方法级优先,接口次之,全局配置再次之
  • 级别一样,消费者优先,提供者次之

2.3 属性优先级

优先级从高到低:

  • JVM设置的属性
  • XML文件的属性
  • Properties内的属性




3. 重试次数

  • 调用失败后的重试次数,不包含第一次失败的调用,默认2次,在注解内可用retries= ‘2’ 设置
  • 有些调用是幂等的,所以可以重试、有些非幂等设置为0不重试
@Reference(retries = 0)




4. 多版本

当一个接口实现有不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用,让一部分调用旧版本,一部分调用新版本


可在暴露服务接口上添加属性

@Service(version = "1.0.0")
@Service(version = "2.0.0")

@Reference(version = "1.0.0")




5. 本地存根

在进行远程过程调用的时候,我们可能需要先进行参数校验或者本地缓存,那么此时可以利用本地存根了


5.1 消费者方

在消费者这边要创建本地存根,而该存根需要一个有参构造

public class SumServiceStub implements SumService {

    // 自己手动添加一个有参构造
    private final SumService sumService;

    // 框架会传入远程代理对象
    public SumServiceStub(SumService sumService) {
        this.sumService = sumService;
    }

    // 这里可以进行各种调用前置操作
    public int sum(int a, int b) {
        if(a != 0  && b != 0){
            return sumService.sum(a,b);
        }
        return -1;
    }
}

5.2 提供者方

提供者只是需要指明消费者存根的全限定类名即可

@Service(stub = "com.howl.consumer.service.impl.SumserviceStub")	// 指明消费者存根
@Component
public class SumServiceImpl implements SumService {
    @Override
    public int sum(int a, int b) {
        return a+b;
    }
}




6. 高可用

这里本来都不想写了,因为官方写得很清楚,还详细有实例


  • 注册中心宕机

    • 若之前调用过,则会有本地缓存不影响使用,但不能更新服务信息
    • 或者在@Service(url=“127.0.0.1:20882”)跳过注册中心直连提供者
  • 负载均衡:可在注解,控制台进行配置

    • Random 随机
    • RoundRobin 轮询
    • LeastActive 最少活跃
    • ConsistentHash 一致性哈希
  • 服务降级:服务器有压力时,对某些服务或页面进行处理或不处理,保证核心业务正常

    • 消费者不调用而直接返回空
    • 消费者调用失败而返回空




原文地址:https://www.cnblogs.com/Howlet/p/13955124.html