资讯专栏INFORMATION COLUMN

dubbo服务的集群扩展、目录服务、路由规则、负载均衡

shery / 2377人阅读

摘要:集群扩展当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。目录服务的头部注释中,引用做了一个介绍。路由规则负责从多个中按路由规则选出子集,比如按照读写分离应用隔离等。若处理完毕则计数器减。

1. Cluster-集群扩展

当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。已知的实现如下,

1-1. FailoverCluster(默认的)

失败转移,当出现失败,重试其它服务器,通常用于读操作,但重试会带来更长延迟。

1-2. AvailableCluster

获取可用的调用。遍历所有Invokers判断Invoker.isAvalible,只要一个有为true直接调用返回,不管成不成功。

1-3. BroadcastCluster

挨个调用集群中所有的providers,通常用于通知所有的服务提供者更新某些资源,例如缓存、日志。

1-4. FailbackCluster

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

1-5. FailfastCluster

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

1-6. ForkingCluster

并行调用,只要一个成功即返回,通常用于实时性要求较高的操作,但需要浪费更多服务资源。

1-7. MergeableCluster

按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费者需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。

2. Directory-目录服务

Directory.java的头部注释中,引用http://en.wikipedia.org/wiki/... service做了一个介绍。directory service有点陌生,但是name service应该比较熟悉吧,就是命名服务。 每一个name service都映射了网络中的一种资源。
这里面一个Directory就代表一个provider提供的List,但是这个List可能是动态变化的,比如注册中心的推送变更。
Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。

2-1. RegistryDirectory

注册目录服务,它的Invoker集合是从注册中心获取的,比如消费方要调用某远程服务,会向注册中心订阅这个服务的所有服务提供方,订阅时和服务提供方数据有变动时,会回调消费方的回调接口并传入服务的所有提供方的url地址,然后将urls地址转为为invokers,也就是refer远程服务。

2-2. StaticDirectory

静态目录服务, 它的所有Invoker通过构造函数传入。

3. Router-路由规则

Router 负责从多个Invoker中按路由规则选出子集,比如按照读写分离、应用隔离等。

4. LoadBalance-负载均衡

LoadBalance 负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。

4-1. RandomLoadBalance(默认的)

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

4-2. RoundRobinLoadBalance

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

4-3. LeastActiveLoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少
例如,每个服务维护一个活跃数计数器。当A机器开始处理请求,该计数器加1,此时A还未处理完成。若处理完毕则计数器减1。而B机器接受到请求后很快处理完毕。那么A,B的活跃数分别是1,0。当又产生了一个新的请求,则选择B机器去执行(B活跃数最小),这样使慢的机器A收到少的请求。

4-4. ConsistentHashLoadBalance

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71571.html

相关文章

  • dubbo源码解析(一)Hello,Dubbo

    摘要:英文全名为,也叫远程过程调用,其实就是一个计算机通信协议,它是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议。 Hello,Dubbo 你好,dubbo,初次见面,我想和你交个朋友。 Dubbo你到底是什么? 先给出一套官方的说法:Apache Dubbo是一款高性能、轻量级基于Java的RPC开源框架。 那么什么是RPC? 文档地址:http://dubbo.a...

    evin2016 评论0 收藏0
  • 服务框架 | 潮流当前该如何选择 SpringCloud、Dubbo or Istio?

    摘要:目前首个测试版是针对环境的,社区宣称在未来几个月内会为虚拟机和等其他环境增加支持。查看下在上的更新时间,截止年月日所有项目均更新于小时内。核心项目最近更新于一个月乃至数月前。所有项目均更新于分钟内。目前对比来看,则显得稍逊下来。 showImg(https://segmentfault.com/img/remote/1460000010953149); 在 Kubernetes 容器云...

    k00baa 评论0 收藏0
  • 聊聊 Apache Dubbo

    摘要:架构中有两个主要角色服务提供者和服务使用者。服务提供者在启动时,向注册中心注册自己提供的服务。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。 本文来自于我的个人主页:Apache Dubbo,转载请保留链接 ;) 在2011年10月27日,阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo,服务治理和SOA的设计理念开始逐渐在国内软件行业中...

    XFLY 评论0 收藏0
  • dubbo源码解析——概要篇

    摘要:服务提供者代码上面这个类会被封装成为一个实例,并新生成一个实例。这样当网络通讯层收到一个请求后,会找到对应的实例,并调用它所对应的实例,从而真正调用了服务提供者的代码。 这次源码解析借鉴《肥朝》前辈的dubbo源码解析,进行源码学习。总结起来就是先总体,后局部.也就是先把需要注意的概念先抛出来,把整体架构图先画出来.让读者拿着地图跟着我的脚步,并且每一步我都提醒,现在我们在哪,我们下一...

    Meathill 评论0 收藏0
  • 构建springmvc+myabtis+dubbo分布式平台-dubbo简介

    摘要:服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的地址,并且能够平滑添加或删除服务提供者。调用关系说明服务容器负责启动,加载,运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。 上一篇我们介绍《构建dubbo分布式平台-maven构建ant-utils工具包的构建》,从今天开始,我们进入分布式服务项目的核心教程,真正使用dubbo实现分布...

    邹立鹏 评论0 收藏0

发表评论

0条评论

shery

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<