zoukankan      html  css  js  c++  java
  • dubbo入门学习(四)-----dubbo配置

    配置来源

    首先,从Dubbo支持的配置来源说起,默认有四种配置来源:

    • JVM System Properties,-D参数
    • Externalized Configuration,外部化配置
    • ServiceConfig、ReferenceConfig等编程接口采集的配置
    • 本地配置文件dubbo.properties

    覆盖关系

    下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:

    JVM启动-D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。

    XML次之,如果在 XML 中有配置,则dubbo.properties中的相应配置项无效。

    Properties最后,相当于缺省值,只有XML没有配置时,dubbo.properties的相应配置项才会生效,通常用于共享公共配置,比如应用名。

    配置原则

    推荐

    dubbo推荐在Provider上尽量多配置Consumer端属性:

    1、作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
    2、在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的

    覆盖规则 

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

    配置示例 

    1、启动时检查

    Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true"。
    可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
    另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false",总是会返回引用,当服务恢复时,能自动连上。

    a、 通过 spring  xml配置文件

    关闭某个服务的启动时检查 (没有提供者时报错):

    <dubbo:reference interface="com.foo.BarService" check="false" />

    关闭所有服务的启动时检查 (没有提供者时报错):

    <dubbo:consumer check="false" />

    关闭注册中心启动时检查 (注册订阅失败时报错):

    <dubbo:registry check="false" />

    b、 通过 dubbo.properties

    dubbo.reference.com.foo.BarService.check=false
    dubbo.reference.check=false
    dubbo.consumer.check=false
    dubbo.registry.check=false

    c、通过 -D 参数

    java -Ddubbo.reference.com.foo.BarService.check=false
    java -Ddubbo.reference.check=false
    java -Ddubbo.consumer.check=false 
    java -Ddubbo.registry.check=false

    注:

    dubbo.reference.check=false,强制改变所有 reference 的 check 值,就算配置中有声明,也会被覆盖。
    dubbo.consumer.check=false,是设置 check 的缺省值,如果配置中有显式的声明,如:<dubbo:reference check="true"/>,不会受影响。
    dubbo.registry.check=false,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。

    2、超时配置 

    由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间。 

    a、dubbo消费端

    全局超时配置
    <dubbo:consumer timeout="5000" />
    
    指定接口以及特定方法超时配置
    <dubbo:reference interface="com.foo.BarService" timeout="2000">
        <dubbo:method name="sayHello" timeout="3000" />
    </dubbo:reference>

    b、dubbo服务端

    全局超时配置
    <dubbo:provider timeout="5000" />
    
    指定接口以及特定方法超时配置
    <dubbo:provider interface="com.foo.BarService" timeout="2000">
        <dubbo:method name="sayHello" timeout="3000" />
    </dubbo:provider>

     3、重试次数

    失败自动切换,当出现失败,重试其它服务器,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

    重试次数配置如下:
    <dubbo:service retries="2" /><dubbo:reference retries="2" /><dubbo:reference>
        <dubbo:method name="findFoo" retries="2" />
    </dubbo:reference>

    4、版本号

    当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
    可以按照以下的步骤进行版本迁移:

    • 在低压力时间段,先升级一半提供者为新版本
    • 再将所有消费者升级为新版本
    • 然后将剩下的一半提供者升级为新版本
    老版本服务提供者配置:
    <dubbo:service interface="com.foo.BarService" version="1.0.0" />
    
    新版本服务提供者配置:
    <dubbo:service interface="com.foo.BarService" version="2.0.0" />
    
    老版本服务消费者配置:
    <dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
    
    新版本服务消费者配置:
    <dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
    
    如果不需要区分版本,可以按照以下的方式配置:
    <dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

    5、本地存根

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

    a、xml文件配置

    在 spring 配置文件中按以下方式配置:

    <dubbo:service interface="com.foo.BarService" stub="true" />

    <dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />

    b、提供 Stub 的实现

    package com.foo;
    public class BarServiceStub implements BarService {
        private final BarService barService;
        
        // 构造函数传入真正的远程代理对象
        public BarServiceStub(BarService barService){
            this.barService = barService;
        }
     
        public String sayHello(String name) {
            // 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等
            try {
                return barService.sayHello(name);
            } catch (Exception e) {
                // 你可以容错,可以做任何AOP拦截事项
                return "容错数据";
            }
        }
    }

    注:

    1、Stub必须有可传入Proxy的构造函数。
    2、在interface旁边放一个Stub实现,它实现BarService接口,并有一个传入远程BarService实例的构造函数。

  • 相关阅读:
    JVM笔记-temp
    Spark笔记-treeReduce、reduce、reduceByKey
    Java笔记-快速失败and安全失败
    Netty笔记--ByteBuf释放
    Spark笔记--使用Maven编译Spark源码(windows)
    MySQL笔记--查询语句实践
    Kafka笔记--指定消息的partition规则
    Spark Executor Driver资源调度小结【转】
    Spark学习笔记--Graphx
    HBase笔记--自定义filter
  • 原文地址:https://www.cnblogs.com/alimayun/p/11013434.html
Copyright © 2011-2022 走看看