zoukankan      html  css  js  c++  java
  • 新项目新知识总结-03-Dubbo的学习

    官方文档用户连接

    https://dubbo.apache.org/zh/docs/v2.7/user/examples/preflight-check/

    dubbo管理控制台

    启动dubbo监听程序后,可以检测控制服务,检测服务是否可行,控制服务的容错

    生产设置(要先启动zookeeper,然后启动管理控制台系统,最后启动服务发布者)

    在开发分支上克隆源代码:git clone https://github.com/apache/dubbo-admin.git
    配置文件中指定注册地址:dubbo-admin-server/src/main/resources/application.properties
    构造环境:mvn clean package -Dmaven.test.skip=true
    运行:mvn --projects dubbo-admin-server spring-boot:run 或者 cd dubbo-admin-distribution/targetjava -jar dubbo-admin-0.1.jar
    访问:http://localhost:8080 默认用户名和密码为root/root

    启动时可能提示8080端口被占用

    zookeeper最近的版本中有个内嵌的管理控制台是通过jetty启动,也会占用8080 端口。
    通过查看zookeeper的官方文档,发现有3种解决途径:
    (1).删除jetty。
    (2)修改端口。修改方法的方法有两种,一种是在启动脚本中增加 -Dzookeeper.admin.serverPort=你的端口号.一种是在zoo.cfg中增加admin.serverPort=没有被占用的端口号
    (3)停用这个服务,在启动脚本中增加"-Dzookeeper.admin.enableServer=false"

    启动检查

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

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

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

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

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

    重试次数配置

    Dubbo 服务在尝试调用一次之后,如出现非业务异常(服务突然不可用、超时等),Dubbo 默认会进行额外的最多2次重试.
    重试次数支持两种自定义配置: 1.通过注解/xml进行固定配置;2.通过上下文进行运行时动态配置

    通过注解/xml进行固定配置

    <dubbo:consumer retries="2"></dubbo:consumer>

    通过RpcContext进行运行时动态配置,优先级高于注解/xml进行的固定配置(两者都配置的情况下,以RpcContext配置为准).

    // dubbo服务调用前,通过RpcContext动态设置本次调用的重试次数
    RpcContext rpcContext = RpcContext.getContext();
    rpcContext.setAttachment("retries", 5);

    本地存根

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

     在 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 BarServiceStub(BarService barService){
            this.barService = barService;
        }
     
        public String sayHello(String name) {
            // 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等
            try {
                return barService.sayHello(name);
            } catch (Exception e) {
                // 你可以容错,可以做任何AOP拦截事项
                return "容错数据";
            }
        }
    }
    Stub 必须有可传入 Proxy 的构造函数。 
    在 interface 旁边放一个 Stub 实现,它实现 BarService 接口,并有一个传入远程 BarService 实例的构造函数 

    灰度测试

    在 Dubbo 中为同一个服务配置多个版本

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

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

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

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

    提示:2.2.0 以上版本支持
    <dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

    集群容错

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

    各节点关系:
    这里的 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>
    提示:该配置为缺省配置(Failover)

    Failfast Cluster

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

    Failsafe Cluster

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

    Failback Cluster

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

    Forking Cluster

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

    Broadcast Cluster

    广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
    
    现在广播调用中,可以通过 broadcast.fail.percent 配置节点调用失败的比例,当达到这个比例后,BroadcastClusterInvoker 将不再调用其他节点,直接抛出异常。 broadcast.fail.percent 取值在 0100 范围内。默认情况下当全部调用失败后,才会抛出异常。 
    broadcast.fail.percent 只是控制的当失败后是否继续调用其他节点,并不改变结果(任意一台报错则报错)。broadcast.fail.percent 参数 在 dubbo2.7.10 及以上版本生效。 Broadcast Cluster 配置 broadcast.fail.percent。 broadcast.fail.percent=20 代表了当 20% 的节点调用失败就抛出异常,不再调用其他节点。 @reference(cluster = "broadcast", parameters = {"broadcast.fail.percent", "20"})

    提示:2.1.0 开始支持

    集群模式配置

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

    <dubbo:service cluster="failsafe" />

    <dubbo:reference cluster="failsafe" />

    负载均衡

    在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
    可以自行扩展负载均衡策略,参见:负载均衡扩展

    Random LoadBalance

    随机,按权重设置随机概率。
    在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

    RoundRobin LoadBalance

    轮询,按公约后的权重设置轮询比率。
    存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上

    LeastActive LoadBalance

    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
    使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

    ConsistentHash LoadBalance

    一致性 Hash,相同参数的请求总是发到同一提供者。
    当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
    算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
    缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
    缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

    配置

    服务端服务级别

    <dubbo:service interface="..." loadbalance="roundrobin" />

    客户端服务级别

    <dubbo:reference interface="..." loadbalance="roundrobin" />

    服务端方法级别

    <dubbo:service interface="...">
        <dubbo:method name="..." loadbalance="roundrobin"/>
    </dubbo:service>

    客户端方法级别

    <dubbo:reference interface="...">
        <dubbo:method name="..." loadbalance="roundrobin"/>
    </dubbo:reference>

    建议在 Provider 端配置的 Consumer 端属性有:

    timeout:方法调用的超时时间
    retries:失败重试次数,缺省是2 
    loadbalance:负载均衡算法,缺省是随机 random。还可以配置轮询 roundrobin、最不活跃优先 4 leastactive 和一致性哈希 consistenthash 等
    actives:消费者端的最大并发调用限制,即当 Consumer 对一个服务的并发调用到上限后,新调用会阻塞直到超时,在方法上配置 dubbo:method 则针对该方法进行并发限制,在接口上配置 dubbo:service,则针对该服务进行并发限制
    配置的覆盖规则:1) 方法级别配置优于接口级别,即小 Scope 优先 2) Consumer 端配置优于 Provider 端配置,优于全局配置,最后是 Dubbo 硬编码的配置值(Dubbo 配置参考手册)

    Dubbo配置的几种方式

    xml格式:https://dubbo.apache.org/zh/docs/v2.7/user/configuration/xml/
    API配置:https://dubbo.apache.org/zh/docs/v2.7/user/configuration/api/
    注解配置:https://dubbo.apache.org/zh/docs/v2.7/user/configuration/annotation/

    Dubbo的推荐用法(需要重点关注,建议使用之前进行阅读)

    https://dubbo.apache.org/zh/docs/v2.7/user/recommend/
  • 相关阅读:
    【转】 【技巧 】 数学难题大揭秘:减少计算错误的技术
    [转]Mathematical Induction --数学归纳法1
    Vector Calculus
    test latex1
    [转]架构蓝图--软件架构 "4+1" 视图模型
    What Is Mathematics?
    二项式展开
    游戏系统设计
    Golang游戏服务器与skynet的个人直观比较
    [转]透过 Linux 内核看无锁编程
  • 原文地址:https://www.cnblogs.com/qcq0703/p/15001235.html
Copyright © 2011-2022 走看看