zoukankan      html  css  js  c++  java
  • 10.Dubbo配置-【重试,超时(集群容错),启动检查,多版本,本地存根】

    1.配置原则

    属性配置

    如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。

    Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数 -Ddubbo.properties.file=xxx.properties 改变缺省配置位置。

    映射规则

    将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行

    • 比如:dubbo.application.name=foo等价于<dubbo:application name="foo" />
    • 比如:dubbo.registry.address=10.20.153.10:9090等价于<dubbo:registry address="10.20.153.10:9090" />

    如果 XML 有多行同名标签配置,可用 id 号区分,如果没有 id 号将对所有同名标签生效

    • 比如:dubbo.protocol.rmi.port=1234等价于<dubbo:protocol id="rmi" name="rmi" port="1099" /> [2]
    • 比如:dubbo.registry.china.address=10.20.153.10:9090等价于<dubbo:registry id="china" address="10.20.153.10:9090" />

    下面是 dubbo.properties 的一个典型配置:

    dubbo.application.name=foo
    dubbo.application.owner=bar
    dubbo.registry.address=10.20.153.10:9090
    

    2.重试次数 

    覆盖策略

    properties-override

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

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

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

    3.启动时检查

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

    可以通过 check="false" 关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

    另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false",总是会返回引用,当服务恢复时,能自动连上。

    示例

    通过 spring 配置文件

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

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

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

    <dubbo:consumer check="false" />
    

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

    <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
    

    通过 -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,前面两个都是指订阅成功,但提供者列表是否为空是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。

    4.重试次数

    retires="":重试次数,不包含第一调用,0代表不重试

    幂等(设置重试次数)【查询,删除,修改】、非幂等(不能设置重试次数)【新增】

    在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

    cluster

    各节点关系:

    • 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息
    • Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更
    • Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个
    • Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等
    • LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选

    集群容错模式

    可以自行扩展集群容错策略,

    Failover Cluster

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

    重试次数配置如下:

    <dubbo:service retries="2" />
    

    <dubbo:reference retries="2" />
    

    <dubbo:reference>
        <dubbo:method name="findFoo" retries="2" />
    </dubbo:reference>
    

    Failfast Cluster

    快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

    Failsafe Cluster

    失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

    Failback Cluster

    失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

    Forking Cluster

    并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

    Broadcast Cluster

    广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

    集群模式配置

    按照以下示例在服务提供方和消费方配置集群模式

    <dubbo:service cluster="failsafe" />
    

    或 

    <dubbo:reference cluster="failsafe" />

     5.超时配置

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

    Dubbo消费端

    默认的超时为1000

    全局超时配置

    <dubbo:consumer timeout="5000" />

    指定接口以及特定方法超时配置

    <dubbo:reference interface="com.foo.BarService" timeout="2000">

        <dubbo:method name="sayHello" timeout="3000" />

    </dubbo:reference>

    Dubbo服务端

    全局超时配置

    <dubbo:provider timeout="5000" />

    指定接口以及特定方法超时配置

    <dubbo:provider interface="com.foo.BarService" timeout="2000">

        <dubbo:method name="sayHello" timeout="3000" />

    </dubbo:provider>

    配置原则

    dubbo推荐在Provider上尽量多配置Consumer端属性:【非常重要】

    1、作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等

    2、在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的

    配置的覆盖规则:

    1) 方法级配置别优于接口级别,即小Scope优先

    2) Consumer端配置 优于 Provider配置 优于 全局配置,

    3) 最后是Dubbo Hard Code的配置值(见配置文档) 下图蓝色背景为服务消费放  绿色背景为服务提放

    6.多版本

    当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。

    可以按照以下的步骤进行版本迁移:

    1. 在低压力时间段,先升级一半提供者为新版本
    2. 再将所有消费者升级为新版本
    3. 然后将剩下的一半提供者升级为新版本

    老版本服务提供者配置:

    <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" />
    

    如果不需要区分版本,可以按照以下的方式配置 [1]

    <dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

    7.本地存根

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

    /user-guide/images/stub.jpg

    从上图可以本地存根一放在API中。

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

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

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

    提供 Stub 的实现 [2]

    package com.foo;
    public class BarServiceStub implements BarService { 
        private final BarService barService;
        
        // 构造函数传入真正的远程代理对象
        public (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 实例的构造函数 ↩︎

    微信公众号

                              
  • 相关阅读:
    【转】K/3 KIS BOS 插件入门
    [转]SQL Server 存储过程中使用 in 动态变量
    [转]Delphi 12种大小写转换的方法
    cxGrid FilterRow 添加左模糊查询,实现 %ABC%
    cxGrid 锁定一行,让该行数据不能编辑
    K/3工业单据K3BillTransfer的属性及使用方法
    VB6上创建金蝶K/3或KIS旗舰版插件
    MySQL UTF8 中文乱码处理
    两种方法自动部署代码:webhooks钩子自动部署代码方法一 及定时任务自动部署二 简介
    Linux查看进程的4种方法
  • 原文地址:https://www.cnblogs.com/niugang0920/p/12187340.html
Copyright © 2011-2022 走看看