/** * Dianping.com Inc. * Copyright (c) 2003-2013 All Rights Reserved. */ package com.dianping.pigeon.remoting.invoker.route.balance; import java.util.List; import com.dianping.pigeon.log.Logger; import com.dianping.pigeon.log.LoggerLoader; import com.dianping.pigeon.remoting.common.domain.InvocationRequest; import com.dianping.pigeon.remoting.invoker.Client; import com.dianping.pigeon.remoting.invoker.config.InvokerConfig; /** * 随机负载均衡策略 * * @author jianhuihuang * @version $Id: RandomLoadBalance.java, v 0.1 2013-7-5 上午8:30:36 jianhuihuang * Exp $ */ public class RandomLoadBalance extends AbstractLoadBalance { private static final Logger logger = LoggerLoader.getLogger(RandomLoadBalance.class); public static final String NAME = "random"; public static final LoadBalance instance = new RandomLoadBalance(); @Override public Client doSelect(List<Client> clients, InvokerConfig<?> invokerConfig, InvocationRequest request, int[] weights) { assert (clients != null && clients.size() >= 1); if (clients.size() == 1) { return clients.get(0); } int clientSize = clients.size(); int totalWeight = 0; boolean weightAllSame = true; for (int i = 0; i < clientSize; i++) { totalWeight += weights[i]; if (weightAllSame && i > 0 && weights[i] != weights[i - 1]) { weightAllSame = false; } } if (!weightAllSame) { int weightPoint = random.nextInt(totalWeight); for (int i = 0; i < clientSize; i++) { Client client = clients.get(i); weightPoint -= weights[i]; if (weightPoint < 0) { return client; } } } Client client = clients.get(random.nextInt(clientSize)); if (logger.isDebugEnabled()) { logger.debug("select address:" + client.getAddress()); } return client; } }