dubbo是阿里巴巴公司开发的一个开源分布式应用框架,基于服务的发布者和订阅者,服务者启动服务向注册中心发布自己的服务;消费者(订阅者)启动服务器向注册中心订阅所需要的服务。注册中心将订阅的服务注册列表返回给订阅者。注册中心会感应服务的提供者的变化,如果服务的提供者发生变化,注册中心会立即通知消费者及时变更服务信息数据;dubbo并且带有审计功能--监控中心,服务的发布者和服务的消费者每分钟间隔都会向监控中心发送自己的统计情况如:调用次数 或者调用时间等(这些数据是保存在内存中以每分钟为单位向监控中心进行发送数据)。监控中心宕机不影响使用,只是减少部分采样的数据,对等的集群任意一台服务宕机,会自动切换到其他对等的机器,注册中心宕机,对服务没有影响,订阅者自己本地会缓存服务提供者的列表信息,由此可见dubbo的健壮性还是可以的。

dubbo有很多非常好的特性:负载均衡、集群容错等

集群容错策略:

failover :失败重连;

failfast:只发起一次请求;

failsafe:失败直接忽略;

failback:失败返回定时发送;、

forking:并发执行 只要有一台成功立即返回;

broadcast:调用所有提供者任意一台报错就报错)。

负载均衡:

随机按照权重概率选择

轮循,按公约后的权重设置轮循比率

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
  • 一致哈希:相同的请求参数会请求同一个服务提供者。

支持多协议:

dubbo、thrift、rmi、jms、redis 等。

下面我们看下下载地址 dubbo的一直哈希策略的实现源代码:默认有160个虚拟节点 这样让服务列表更加均匀分布,命中更均匀。

./*
2. * Copyright 1999-2012 Alibaba Group.
3. *
4. * Licensed under the Apache License, Version 2.0 (the "License");
5. * you may not use this file except in compliance with the License.
6. * You may obtain a copy of the License at
7. *
8. * http://www.apache.org/licenses/LICENSE-2.0
9. *
10. * Unless required by applicable law or agreed to in writing, software
11. * distributed under the License is distributed on an "AS IS" BASIS,
12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13. * See the License for the specific language governing permissions and
14. * limitations under the License.
15. */
.package com.alibaba.dubbo.rpc.cluster.loadbalance;
.
.import java.io.UnsupportedEncodingException;
.import java.security.MessageDigest;
.import java.security.NoSuchAlgorithmException;
.import java.util.List;
.import java.util.SortedMap;
.import java.util.TreeMap;
.import java.util.concurrent.ConcurrentHashMap;
.import java.util.concurrent.ConcurrentMap;
.
.import com.alibaba.dubbo.common.Constants;
.import com.alibaba.dubbo.common.URL;
.import com.alibaba.dubbo.rpc.Invocation;
.import com.alibaba.dubbo.rpc.Invoker;
.
./**
33. * ConsistentHashLoadBalance
34. *
35. * @author william.liangf
36. */
.public class ConsistentHashLoadBalance extends AbstractLoadBalance {
.
. private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors = new ConcurrentHashMap<String, ConsistentHashSelector<?>>();
.
. @SuppressWarnings("unchecked")
. @Override
. protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
. String key = invokers.get().getUrl().getServiceKey() + "." + invocation.getMethodName();
. int identityHashCode = System.identityHashCode(invokers);
. ConsistentHashSelector<T> selector = (ConsistentHashSelector<T>) selectors.get(key);
. if (selector == null || selector.getIdentityHashCode() != identityHashCode) {
. selectors.put(key, new ConsistentHashSelector<T>(invokers, invocation.getMethodName(), identityHashCode));
. selector = (ConsistentHashSelector<T>) selectors.get(key);
. }
. return selector.select(invocation);
. }
.
. private static final class ConsistentHashSelector<T> {
.
. private final TreeMap<Long, Invoker<T>> virtualInvokers;
.
. private final int replicaNumber;
.
. private final int identityHashCode;
.
. private final int[] argumentIndex;
.
. public ConsistentHashSelector(List<Invoker<T>> invokers, String methodName, int identityHashCode) {
. this.virtualInvokers = new TreeMap<Long, Invoker<T>>();
. this.identityHashCode = System.identityHashCode(invokers);
. URL url = invokers.get().getUrl();
. this.replicaNumber = url.getMethodParameter(methodName, "hash.nodes", );
. String[] index = Constants.COMMA_SPLIT_PATTERN.split(url.getMethodParameter(methodName, "hash.arguments", ""));
. argumentIndex = new int[index.length];
. for (int i = ; i < index.length; i ++) {
. argumentIndex[i] = Integer.parseInt(index[i]);
. }
. for (Invoker<T> invoker : invokers) {
. for (int i = ; i < replicaNumber / ; i++) {
. byte[] digest = md5(invoker.getUrl().toFullString() + i);
. for (int h = ; h < ; h++) {
. long m = hash(digest, h);
. virtualInvokers.put(m, invoker);
. }
. }
. }
. }
.
. public int getIdentityHashCode() {
. return identityHashCode;
. }
.
. public Invoker<T> select(Invocation invocation) {
. String key = toKey(invocation.getArguments());
. byte[] digest = md5(key);
. Invoker<T> invoker = sekectForKey(hash(digest, ));
. return invoker;
. }
.
. private String toKey(Object[] args) {
. StringBuilder buf = new StringBuilder();
. for (int i : argumentIndex) {
. if (i >= && i < args.length) {
. buf.append(args[i]);
. }
. }
. return buf.toString();
. }
.
. private Invoker<T> sekectForKey(long hash) {
. Invoker<T> invoker;
. Long key = hash;
. if (!virtualInvokers.containsKey(key)) {
. SortedMap<Long, Invoker<T>> tailMap = virtualInvokers.tailMap(key);
. if (tailMap.isEmpty()) {
. key = virtualInvokers.firstKey();
. } else {
. key = tailMap.firstKey();
. }
. }
. invoker = virtualInvokers.get(key);
. return invoker;
. }
.
. private long hash(byte[] digest, int number) {
. return (((long) (digest[ + number * ] & 0xFF) << )
. | ((long) (digest[ + number * ] & 0xFF) << )
. | ((long) (digest[ + number * ] & 0xFF) << )
. | (digest[ + number * ] & 0xFF))
. & 0xFFFFFFFFL;
. }
.
. private byte[] md5(String value) {
. MessageDigest md5;
. try {
. md5 = MessageDigest.getInstance("MD5");
. } catch (NoSuchAlgorithmException e) {
. throw new IllegalStateException(e.getMessage(), e);
. }
. md5.reset();
. byte[] bytes = null;
. try {
. bytes = value.getBytes("UTF-8");
. } catch (UnsupportedEncodingException e) {
. throw new IllegalStateException(e.getMessage(), e);
. }
. md5.update(bytes);
. return md5.digest();
. }
.
. }
.
.}

阿里巴巴的分布式应用框架-dubbo负载均衡策略--- 一致哈希算法的更多相关文章

  1. dubbo负载均衡策略和集群容错策略都有哪些

    dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...

  2. dubbo负载均衡策略和集群容错策略

    dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...

  3. 3.dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?

    作者:中华石杉 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议 ...

  4. 分布式的几件小事(四)dubbo负载均衡策略和集群容错策略

    1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权 ...

  5. Dubbo入门到精通学习笔记(十一):Dubbo服务启动依赖检查、Dubbo负载均衡策略、Dubbo线程模型(结合Linux线程数限制配置的实战分享)

    文章目录 Dubbo服务启动依赖检查 Dubbo负载均衡策略 Dubbo线程模型(结合Linux线程数限制配置的实战分享) 实战经验分享( ** 属用性能调优**): Dubbo服务启动依赖检查 Du ...

  6. 面试系列24 dubbo负载均衡策略和集群容错策略

    (1)dubbo负载均衡策略 1)random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重 ...

  7. 面试系列16 dubbo负载均衡策略和集群容错策略都有哪些?动态代理策略呢

    (1)dubbo负载均衡策略 1)random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重 ...

  8. dubbo负载均衡策略和集群容错策略都有哪些?动态代理策略呢?

    (1)dubbo负载均衡策略 1)random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重 ...

  9. 一文讲透Dubbo负载均衡之最小活跃数算法

    本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版本. 为什么没有用截止目前的最新的版本号2.7.4.1呢?因为2.6.0这个版本里面有两 ...

随机推荐

  1. 【转】网络中的AS自治域

    1. 什么是AS自治域? 全球的互联网被分成很多个AS 自治域,每个国家的运营商.机构.甚至公司等都可以申请AS号码,AS号码是有限的,最大数目是65536.各自分配的IP地址被标清楚属于哪个AS号码 ...

  2. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  3. shader 语言 【转】

    shader语言 3dlabs改名后其开发者网站关闭 可以在这里下载shadergen http://3dshaders.com/home/index.php?option=com_weblinks& ...

  4. 次表面散射(SubSurface Scattering) Shader 【转】

    原文 http://www.azure.com.cn/article.asp?id=231 用深度值近似模拟物体的厚度,厚度越小处透光越多. varying vec4 position;varying ...

  5. Java多线程:线程死锁

    发生死锁的原因通常是两个对象的锁相互等待造成的. 以下用一个实例来构造这样的情况: package basic.e_deadlock; import org.apache.log4j.Logger; ...

  6. LINUX CACHE IO THREAD

    http://www.penglixun.com/tech/system/linux_cache_discovery.html http://my.oschina.net/HardySimpson/b ...

  7. innodb 变量

    http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

  8. OS X 10.9 Mavericks 安装 thrift 0.9.1

    通过Homebrew安装的时候,编译会报错.查了一下资料,原来是10.9系统默认使用的libc++的库,而且移除了C++ 11标准前tr库,所以编译存在问题.且笔者使用的时候,brew安装只支持到0. ...

  9. [STAThread]的含义

    Posted on 2007-07-07 10:06 桦林 阅读(33100) 评论(10) 编辑 收藏 [STAThread]STAThread:Single     Thread     Apar ...

  10. 分享一款页面视差滚动切换jquery.localscroll插件

    今天给大家分享一款页面视差滚动切换jquery.localscroll插件. 滚动鼠标液动条看下页面的切换效果.该插件适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera ...