分布式复习--RPC框架Dubbo

负载均衡策略

1,Random LoadBalance

  • 随机,按权重设置随机概率。

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

2,RoundRobin LoadBalance

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

3,LeastActive LoadBalance

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

4,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>

客户端方法级别

扫描二维码关注公众号,回复: 2737568 查看本文章
<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

配置优先级别

  • 以timeout为例,显示了配置的查找顺序,其它retries, loadbalance等类似。
  1. 方法级优先,接口级次之,全局配置再次之。
  2. 如果级别一样,则消费方优先,提供方次之。

     其中,服务提供方配置,通过URL经由注册中心传递给消费方

  • 建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。

主机绑定

在发布一个Dubbo服务的时候,会生成一个dubbo://ip:port的协议地址,那么这个IP是根据什么生成的呢?大家可以在ServiceConfig.java代码中找到如下代码;可以发现,在生成绑定的主机的时候,会通过一层一层的判断,直到获取到合法的ip地址。

  1. NetUtils.isInvalidLocalHost(host), 从配置文件中获取host
  2. host = InetAddress.getLocalHost().getHostAddress();
  3. Socket socket = new Socket();
    try {
        SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
        socket.connect(addr, 1000);
        host = socket.getLocalAddress().getHostAddress();
        break;
    } finally {
        try {
            socket.close();
        } catch (Throwable e) {}
    }

 

集群容错

什么是容错机制? 容错机制指的是某种系统控制在一定范围内的一种允许或包容犯错情况的发生,举个简单例子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统会弹出一个提示框让我们选择,是立即结束还是继续等待,然后根据我们的选择执行对应的操作,这就是“容错”。

在分布式架构下,网络、硬件、应用都可能发生故障,由于各个服务之间可能存在依赖关系,如果一条链路中的其中一个节点出现故障,将会导致雪崩效应。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务,来优雅的处理这种中断的响应结果

1、Failover Cluster

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

重试次数配置如下:

<dubbo:service retries="2" />

<dubbo:reference retries="2" />

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

2,Failfast Cluster

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

3,Failsafe Cluster

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

4,Failback Cluster

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

5,Forking Cluster

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

6,Broadcast Cluster

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

集群模式配置

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

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />

服务降级

降级的目的是保证核心服务可用。

降级可以有几个层次的分类:自动降级和人工降级 ;按照功能分为:读服务降级和写服务降级;

1,对于一些非核心服务进行人工降级,在大促之前通过降级开关,关闭哪些推荐内容、评价等对主流程没有影响的功能。

2,故障降级,比如调用远程服务挂了、网络故障、rpc服务返回异常。那么可以直接降级,降级的方案比如设置默认值、采用兜底数据(系统推荐的行为广告挂了,可以提前准备静态页面做返回)等等

3,限流降级,在秒杀这种流量比较集中并且流量比较大的情况下,因为突发访问量比较大可能导致系统支持不了。可以采用限流来限制访问量。当达到阀值时,后续需的请求被降级,比如进入排队页面,比如跳转到错误页(活动太火爆,稍后重试)

dubbo的降级方式: Mock

实现步骤

  1. 在client端创建一个TestMock类,实现对应IGpHello的接口(需要对哪个接口进行mock,就实现哪个),名称必须以Mock结尾
  2. 在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的TestMock
  3. 模拟错误(设置timeout),模拟超时异常,运行测试代码即可访问到TestMock这个类。当服务端故障解除以后,调用过程将恢复正常

猜你喜欢

转载自blog.csdn.net/tengxvincent/article/details/81297923